私の grails アプリでは、以下に示すようにカスタム認証成功ハンドラー (resources.groovy 内) を作成して、承認後のワークフローをカスタマイズしました。
authenticationSuccessHandler (MyAuthSuccessHandler) {
def conf = SpringSecurityUtils.securityConfig
requestCache = ref('requestCache')
defaultTargetUrl = conf.successHandler.defaultTargetUrl
alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault
targetUrlParameter = conf.successHandler.targetUrlParameter
useReferer = conf.successHandler.useReferer
redirectStrategy = ref('redirectStrategy')
superAdminUrl = "/admin/processSuperAdminLogin"
adminUrl = "/admin/processAdminLogin"
userUrl = "/admin/processUserLogin"
}
上記のクロージャの最後の 3 行からわかるように、ログイン ユーザーに付与されたロールに応じて、カスタム UserSessionBean が作成されてセッションに保存される AdminController内の別のアクションに彼女をリダイレクトしています。
私のアプリでは次のような通常のログインケースでうまく機能します:
http://localhost:8080/my-app/
ユーザーは、またはいずれかの方法でアプリにアクセスしますhttp://localhost:8080/my-app/login/auth
- 有効なログイン ID とパスワードを入力して続行します。
- アプリは内部的に MyAuthSuccessHandler にアクセスし、このユーザーに付与されたロールを考慮して AdminController にリダイレクトします。
- UserSessionBean が作成され、セッションに格納されます
- ユーザーはアプリのホームページに移動します
上記のフローで正しくアクセスさMyUserDetailsService
れる拡張によるカスタムも作成しました。GormUserDetailsService
問題のシナリオ:ユーザーがアプリ内の保護されたリソース (この場合、コントローラーは注釈
で保護されています) に直接アクセスしているとします。@Secured
- ユーザーのクリック
http://localhost:8080/my-app/inbox/index
- アプリは彼女をにリダイレクトします
http://localhost:8080/my-app/login/auth
- ユーザーは有効なログイン ID とパスワードを入力します
- ユーザーは
http://localhost:8080/my-app/inbox/index
このMyAuthSuccessHandler
プロセスでは完全にスキップされるため、UserSessionBeanが作成されず、 UserSessionBeanにアクセスする場所でさらに使用するとエラーが発生します。
質問:
MyAuthSuccessHandler
問題のシナリオでは、ログイン時にリダイレクトするターゲット URL があるため、アプリは をスキップしますか?MyAuthSuccessHandler
ターゲット URL が存在する場合でも、プロセスを常に通過させることはできますか?- 2 に対する答えが「いいえ」の場合、 UserSessionBeanを作成する方法と場所に関する代替手段はありますか?