2011-10-27 16 views
1

システムに新しいユーザーを作成するときに、電子メールで一時パスワードを送信し、changePasswordNextLogin = trueのプロパティを設定しています。彼らが初めてログインに来たとき、私は成功したログイン時にこのフローを傍受し、この値をチェックし、それが真であればパスワード変更アクションにリダイレクトしたいと思います。パスワードの変更が完了したら、理想的には、それらを意図した目的地に送信したいと考えています。Grails spring-security - 成功アクションの前に傍受して、必要なパスワード変更を確認できますか?

私はデフォルト設定を注ぎ込んでいますが、それを実現する方法は見当たりませんし、正しく解釈しない可能性もあります。私がGrailsでいくつかの解決策をまとめようとするたびに、誰かが同じことをやるためにもっと優雅なアプローチをしていることがわかりました。これを可能にする機能が組み込まれていますか?

もしそうでなければ、私は本当にそうするための最良のアプローチに関する提案を感謝します。

+0

あなたはスプリングセキュリティコアプラグインを使用していますか?または他のプラグインか独自のフィルターですか?スプリングセキュリティプラグインを使用している場合は、@ darrendがフレームワークが提供するpasswordExpiredプロパティを使用するための基礎を提供します。 – omarello

+0

@omarello質問文にはs2は書かれていませんでしたが、そのようにタグ付けされていたので、安全な前提だと思いました。 – darrend

+0

あなたにお詫び申し上げます。投稿のタイトルに "Grails spring-security"を付けるのは説明的だと思っていましたが、プラグインなしでS2を使うという考えは考えていませんでした。私はもっ​​と具体的にすべきだったと思う。 –

答えて

5

は直接春のセキュリティとGrailsプラグインで、このためのいくつかのサポートがありますが、あなたはまた、いくつかを自分で:)作業しなければならない

あなたはGrailsのスプリング・セキュリティプラグインをインストールしたときに作成されたドメインクラス( S2Quickstartスクリプトを実行しました)には、「passwordExpired」という名前のプロパティがあります。新しいユーザードメインインスタンスを作成するときは、これをtrueに設定します。

初めて、そのユーザーが初めてログインすると、Spring Securityコアライブラリはログインコントローラのauthfailクロージャでキャッチした例外をスローし、パスワードの変更フォームにリダイレクトします)。ここで

は私のアプリケーションの一つ、この閉鎖のスケルトンバージョンからの例では、すでにログインコントローラに含まれるべきだ。

/** 
* Callback after a failed login. 
*/ 
def authfail = { 

    def msg = '' 

    def username = 
     session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY] 

    def exception = session[WebAttributes.AUTHENTICATION_EXCEPTION] 

    if (exception) { 
     if (exception instanceof CredentialsExpiredException) { 
      msg = g.message(code: "springSecurity.errors.login.passwordExpired") 
      if (!springSecurityService.isAjax(request)) 
       redirect (action:'changePassword') // <-- see below 
     } 
     // other failure checks omitted 
    } 

    if (springSecurityService.isAjax(request)) { 
     render([error: msg] as JSON) 
    } 
    else { 
     flash.message = msg 
     redirect controller: 'login', action:'auth', params: params 
    } 
} 

/** 
* render the change pwd form 
*/ 
def changePassword = { 
    [username: session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY] ?: springSecurityService.authentication.name] 
} 

あなたの「changePasssword」ビューから、バック別のコントローラの閉鎖にフォームを送信(私はあなたが春に関するセキュリティ3.0以降を使用している場合

def updatePassword = { 
    String username = session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY] ?: springSecurityService.authentication.name 
    if (!username) { 
     flash.message = 'Sorry, an error has occurred' 
     redirect controller: 'login', action:'auth' 
     return 
    } 
    String password = params.password 
    String newPassword = params.password_new 
    String newPassword2 = params.password_new_2 
    if (!password || !newPassword || !newPassword2 || newPassword != newPassword2) { 
     flash.message = 'Please enter your current password and a new password' 
     render view: 'changePassword', model: [username: username] 
     return 
    } 
    SecUser user = SecUser.findByUsername(username) 
    if (!passwordEncoder.isPasswordValid(user.password, password, null /*salt*/)) { 
     flash.message = 'Current password is incorrect' 
     render view: 'changePassword', model: [username: username] 
     return 
    } 
    if (passwordEncoder.isPasswordValid(user.password, newPassword, null /*salt*/)) { 
     flash.message = 'Please choose a different password from your current one' 
     render view: 'changePassword', model: [username: username] 
     return 
    } 
    if (!newPassword.matches(PASSWORD_REGEX)) { 
     flash.message = 'Password does not meet minimum requirements' 
     render view: 'changePassword', model: [username: username] 
     return    
    } 

    // success if we reach here! 
    user.password = springSecurityService.encodePassword(newPassword) 
    user.passwordExpired = false 
    user.save() 

    flash.message = 'Password changed successfully' + (springSecurityService.loggedIn ? '' : ', you can now login') 
    redirect uri: '/' 
} 
+0

これはまさに私が探していたものと思われます。私は本当にあなたに説明する時間を割いていただき、ありがとうございます。理にかなっている! –

1

、あなたが参照することができ、パスワードの好きな制約をチェックし、いずれかのドメインオブジェクトかどうかに更新されたパスワードが保存されます「updatePassword」..鉱山を呼び出しますスプリング秒urityプラグインのドキュメント11.3 Account Locking and Forcing Password Change。 Config.groovyに grails.plugin.springsecurity.apf.storeLastUsername=trueを設定する必要があることに注意してください。

関連する問題