我想实现基于权限的访问控制as discussed in this post。
我对实现不熟悉 - 有没有关于如何从头到尾实现这个的详细示例?
答案 0 :(得分:0)
你见过Spring security plugin吗? Main docs are here
与this post一样,您也可以考虑使用Shiro插件。我发现Spring安全插件更简单,但Shiro确实有一些优点,如帖子所述。
答案 1 :(得分:0)
我刚刚解决了这个问题(大部分时间),所以我在这里发布以供参考。此解决方案适用于Grails 2.2.4和Spring Security 2.0 RC
1)安全域模型 您按照本文中的描述为安全域类建模,因此最终您将拥有这些域: - 许可 - 角色 - RolePermission - 用户 - UserRole
2)查询用户权限 您确保您的User类在getAuthorities()方法中返回权限而不是Roles作为权限:
/**
* Gets authorities for the user.
*
* It will return all of the Permissions of the User assigned by the Roles
* which the User has
*/
Set<Permission> getAuthorities() {
Set allPermissions = []
// Collect all Roles of the User
UserRole.findAllByUser(this).each { userRole ->
// Collect all Permissions from the Role
Role role = userRole.role
// Returning the collected permissions
RolePermission.findAllByRole(role).each { rp ->
allPermissions.add(rp.permission)
}
}
return allPermissions
}
3)Spring Security Config
我的Config.groovy中有Spring Security配置(省略了非相关部分):
grails {
plugin {
springsecurity {
...
userLookup {
userDomainClassName = 'limes.security.User'
}
authority {
nameField = 'name'
className = 'limes.security.Permission'
}
...
}
}
}
一个重要的亮点是authority.nameField,它必须与你的Permission类一致。 name属性在我的模型(和文章)中称为'name'。
当然,您将Permission类设置为authority.className,以使其适合User.getAuthorities()的返回值。
4)在安全表达中使用
上述解决方案并未解决Grails Spring Security插件的限制,您只能使用以“ROLE _”开头的权限名称。
因此,如果你想调用像“PERM_PERMISSION1”这样的权限,那么你必须在任何地方编写EL表达式以进行检查(特别是在控制器@Secured注释和静态URL规则上)。
所以而不是
@Secured(["PERM_PERMISSION1"])
你写
@Secured(["hasRole('PERM_PERMISSION1')"])