我有一个简单的 Grails 应用程序,安装了 Spring Security Core 插件并且工作正常。但是,我还没有找到任何解决方案来解决在安全上下文中更新登录用户权限的问题。我不是在谈论更新当前用户的详细信息(即 springSecurityService.reauthenticate)。
我的问题是:我有一个简单的用户管理应用程序,其中使用了 ROLE_ADMIN 和 ROLE_USER 权限。现在,我有 2 位管理员从不同的计算机同时登录(具有 ROLE_ADMIN 权限),其中一位管理员决定将另一位管理员的权限从 ROLE_ADMIN 更改为 ROLE_USER。
如何更新用户和角色,以便修改后的用户(具有新的 ROLE_USER 角色)无法执行任何 ROLE_ADMIN 级别操作并立即重定向到 ROLE_USER 级别页面?有没有办法更新安全上下文,这样我就不必在所有控制器操作中进行额外的检查,以确定登录用户的权限是否已更改?我可以以某种方式使用 cahceUsers 属性吗?我没有修改cacheUsers,根据我的理解,默认情况下它是错误的。如果我错了,请纠正我。
编辑:
导致问题的顺序是
管理员“A”修改管理员“B”并为管理员“B”设置新角色(ROLE_USER)
代码调用PersonRole.removeAll(personInstanceB) and
PersonRole.create(personInstanceB, roleAdmin)
一切都正常更新
同时管理员“B”在修改权限时已经登录。管理员“B”可以继续在 ROLE_ADMIN 受限页面上工作,直到他/她注销并重新登录。只有这样权限才会更新并且管理员“B”具有新角色(ROLE_USER)
我希望管理员“B”在用户更新为新角色时重定向到 ROLE_USER 页面,而不仅仅是在注销/登录之后
calling springSecurityService.reauthenticate personInstanceB.username)
导致管理员“A”以管理员“B”的身份“登录”,因此这不起作用。
任何想法都会非常受欢迎。我可能在这里错过了一些简单的事情,但我不知道解决方案是什么。
干杯,
米佐托
这是未经测试的,但尝试一下
在您的控制器/服务类中,
...
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
}
....
EDIT
现在清楚多了。
我最想做的就是使用切换用户功能。看切换用户 http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/single.html#15%20Switch%20User
--
您可以使用第一个答案中的代码在控制器或服务中创建一个方法,该方法采用 userInstance 并将其角色从管理员更改为用户。
def adminToUser(user, adminRole, userRole){
UserRole.remove user, adminRole
UserRole.create user, userRole
if (!user.hasErrors() && user.save(flush: true)) {
springSecurityService.reauthenticate user.username
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)