2

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

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

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

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

简而言之,我希望在每次登录后进行检查,如果失败,则不允许用户进入应用程序。不管他怎么想进去。

4

2 回答 2

1

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

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

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

于 2012-12-12T21:40:51.823 回答
0

您可以采用@doelleri 提出的建议并通过以下步骤增强规则:

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

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

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

于 2012-12-24T04:16:21.563 回答