【问题标题】:Grails Spring Security forcing user to a specific screen after successful authenticationGrails Spring Security 在成功验证后强制用户进入特定屏幕
【发布时间】:2012-11-30 16:23:35
【问题描述】:

这里是场景。我有两个对象Users(带有用户名/密码)和UserInfo,其余的数据与用户相关。 Users 是一个包含数千条记录的旧表,UserInfo 是相当新的。我想在用户首次登录时尽可能多地获得UserInfo

我想在第一次登录后强制用户进入自定义屏幕并询问UserInfo 数据。在新屏幕中获得“必需”数据后,直到用户自愿填写“个人资料”下的数据时,我才会显示它。

由于应用程序有多个入口点,我不想更新所有控制器来检查这一点。

有没有办法可以使用Spring Security filter 或在成功登录时执行的东西?我查看了ApplicationListener<AuthenticationSuccessEvent>,但它并没有解决问题,就像我将链接复制粘贴到浏览器中一样,它让我无需询问“额外信息”就可以前往目的地。

简而言之,我希望在每次登录后进行检查,如果失败,则不允许用户进入应用程序。无论他如何尝试进入。

【问题讨论】:

标签: authentication grails groovy spring-security


【解决方案1】:

在您的Config.groovy 中,配置 Spring Security 的 defaultTargetUrl 并告诉它始终重定向到那里:

grails.plugins.springsecurity.successHandler.alwaysUseDefault = true
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/userInfo/edit'

UserInfoController 的编辑操作中,您可以检查是否存在必填字段(可能是userInfo.validate()?),如果存在,则重定向到您喜欢的任何位置,可能是“/”,否则呈现编辑信息查看。

【讨论】:

  • 与过滤器相比的一个优点是它只会在登录时执行,而不是查看任何页面。
  • 很棒的方法@doelleri。但是如果用户尝试粘贴 URL,他可以绕过这一步对吗?
  • 啊...好点,我忘记了,一旦他们登录,他们将能够通过 URL 操作转到任何页面。所以是的,你需要一个过滤器来防止这种情况发生。
【解决方案2】:

您可以采纳@doelleri 的建议并通过这些步骤来增强规则:

  1. 运行批处理任务,将临时 ROLE_DISABLED 角色分配给尚未提供补充信息的每个用户。如果用户已经拥有一些角色,请将它们保存在某个属性中。

  2. 将您的授权规则设置为具有 ROLE_DISABLED 角色的用户只允许访问 /userInfo/edit。

  3. 在/userInfo/edit 中,如果用户具有ROLE_DISABLED 角色,则呈现信息输入视图,并在成功更新其信息后恢复用户角色。否则重定向到 '/' 或它请求的路径。

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 2013-08-29
    • 2014-08-20
    • 2014-12-11
    • 2011-01-02
    • 2023-04-01
    • 2011-10-21
    • 2018-06-27
    • 2021-02-17
    相关资源
    最近更新 更多