在我的 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"
}
正如您可以从上面闭包的最后三行中看到的那样,根据授予登录用户的角色,我将她重定向到AdminController中的单独操作,其中创建自定义 UserSessionBean 并将其存储在会话中。
它适用于我的应用程序中的常规登录案例,如下所示:
- 用户通过
http://localhost:8080/my-app/
OR进入应用程序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是否有替代方法?