我有域名:
用户 hasOne RoleGroup hasMany 角色
RoleGroup:管理员,专业人士,客户端......
角色: ROLE_ACTION_1,ROLE_ACTION_2,...
我如何检查用户是否有带注释@Secured的RoleGroup?
我需要检查用户是否包含RoleGroup的所有角色?
用户类:
class User implements Serializable {
private static final long serialVersionUID = 1
static constraints = {
password blank: false, password: true
username blank: false, unique: true
}
static mapping = {
password column: '`password`'
version false
table schema: "CA"
}
static transients = ['springSecurityService']
transient springSecurityService
transient boolean enabled = true
transient boolean accountExpired
transient boolean accountLocked
transient boolean passwordExpired
String username
String password
RoleGroup profile
Set<RoleGroup> getAuthorities() {
[profile]
}
}
RoleGroup类:
class RoleGroup implements Serializable {
private static final long serialVersionUID = 1
String name
Set<Role> getAuthorities() {
RoleGroupRole.findAllByRoleGroup (this)*.role
}
}
答案 0 :(得分:1)
我认为你还没有完全掌握弹簧的安全性。
使用注释时 - 必须在配置中启用第一个注释 - 默认情况下就是这种情况。
然后使用类似
之类的东西保护整个控制器或控制器操作@Secured(['ROLE_ADMIN', 'ROLE_USER'])
它无法计算出用户拥有的所有权限组。
虽然在您在RoleGroup类中粘贴的代码中,您有:
getAuthorities()
我调整了我的用户域类并添加了以下内容:
Set<RoleGroup> getAuthorities() {
UserRoleGroup.findAllByUser(this)*.roleGroup
}
Set<RoleGroup> getAuthoritiesNames() {
UserRoleGroup.findAllByUser(this)*.roleGroup?.name
}
所以我有一个用户
即。用户user = User.get(1L)
def authorities = user.getAuthorities()
println "user ${user} has ${authorities}"
这是一个包含所有权限的列表
if (authorities.contains('ROLE_USER')) {
println "WOOHOO"
}
使用spring security,您也可以在gsps中使用它:
<sec:ifAllGranted roles="ROLE_ADMIN">
show something
</sec:ifAllGranted>
回到你的问题:
你有:
Set<RoleGroup> getAuthorities() {
[profile]
}
你有什么东西到位吗?
从哪里来:
class RoleGroup implements Serializable {
private static final long serialVersionUID = 1
String name
Set<Role> getAuthorities() {
RoleGroupRole.findAllByRoleGroup (this)*.role
}
}
这应列出所有权限
User user = User.get(1L)
def authorities = user?.profile?.getAuthorities()