Security Grails Spring安全插件-修改登录用户';政府当局
我有一个简单的Grails应用程序,安装了SpringSecurity核心插件,运行良好。但是,我还没有找到在安全上下文中更新登录用户权限的任何解决方案。我不是说更新当前用户的详细信息(即springSecurityService.reaauthenticate) 我的问题是:我有一个简单的用户管理应用程序,其中使用了ROLE_ADMIN和ROLE_用户权限。现在,我有两个管理员从不同的计算机同时登录(具有ROLE_ADMIN权限),其中一个管理员决定将另一个管理员的权限从ROLE_ADMIN更改为ROLE_USER 如何更新用户和角色,以使修改后的用户(具有新角色\u用户角色)无法执行任何角色\u管理级别的操作,并立即重定向到角色\u用户级别的页面?是否有一种方法可以更新安全上下文,这样我就不必在所有控制器操作中进行额外检查,以确定登录用户的权限是否已更改?我可以用cahceUsers属性来做这个吗?我还没有修改cacheUsers,据我所知,它默认为false。如果我错了,请纠正我 编辑: 导致问题的顺序是Security Grails Spring安全插件-修改登录用户';政府当局,security,spring,plugins,grails,Security,Spring,Plugins,Grails,我有一个简单的Grails应用程序,安装了SpringSecurity核心插件,运行良好。但是,我还没有找到在安全上下文中更新登录用户权限的任何解决方案。我不是说更新当前用户的详细信息(即springSecurityService.reaauthenticate) 我的问题是:我有一个简单的用户管理应用程序,其中使用了ROLE_ADMIN和ROLE_用户权限。现在,我有两个管理员从不同的计算机同时登录(具有ROLE_ADMIN权限),其中一个管理员决定将另一个管理员的权限从ROLE_ADMIN更
PersonRole.removeAll(personInstanceB)和
PersonRole.create(personInstanceB,roleAdmin)
所有内容都会正常更新springSecurityService.reaauthenticate personInstanceB.username)
会导致管理员“A”以管理员“B”的身份“登录”,因此这不起作用Mizztto这是未经测试的,但请尝试一下 在控制器/服务类中
...
User user = User.get(springSecurityService.principal.id) //get the user
Role adminRole = //get or create the admin Role
UserRole.remove user, role // remove admin Role
Role userRole = // get or create the user Role
UserRole.create user, role //add the user Role
...
if (!user.hasErrors() && user.save(flush: true)) {
springSecurityService.reauthenticate user.username // refresh the users security deatils
}
....
编辑
这一点现在清楚多了
我要做的就是使用switch user函数。看
- 首先,将
属性设置为useSwitchUserFilter
true
- 建议您为此权限设置一个新角色(例如
)role\u SWITCH\u USER
- 在你的管理页面的某个地方
<sec:ifAllGranted roles='ROLE_SWITCH_USER'> <form action='/j_spring_security_switch_user' method='POST'> Switch to user: <input type='text' name='j_username'/> <br/> <input type='submit' value='Switch'/> </form> </sec:ifAllGranted>
我已通过两次重新验证解决了此问题: 保存正在降级其他用户的管理员的名称:def originalUserName = springSecurityService.principal.name springSecurityService.reauthenticate user.username springSecurityService.reauthenticate originalUserName
嗨,谢谢你的回复。在发布我的问题之前,我已经按照你描述的那样做了。但是,这意味着,如果您是管理员,并且更新了另一个管理员的权限->则调用springSecurityService.reauthenticate user.username将导致使用修改后的用户凭据更新会话。这意味着您刚刚以您所修改的用户身份“登录”。我不想:)我会编辑我的帖子,让它更清楚我想要的是什么。非常感谢,现在似乎工作得很好,很简单,但非常强大!:)尽管如此,在用户登录时,应该有更简单的方法通知修改后的用户他们的权限已更改。我需要追根究底:)@mizzto没问题!可能有一个更简单的方法来实现这一点。。。如果你发现了什么,一定要把它贴上去!理想的解决方案不是:
?但似乎无法让它工作。。。SpringSecurityUtils.doWithAuth(otherUsername){springSecurityService.reaauthenticate(otherUsername)}
def originalUserName = springSecurityService.principal.name springSecurityService.reauthenticate user.username springSecurityService.reauthenticate originalUserName