假设这个类(在 groovy 中):
class Class_A {
String type
...
}
我想根据类型的值定义对其实例的访问级别。例如,如果类型值为“T1”,则某些用户将对 Class_A 具有读取访问权限,而如果类型值为“T2”,则其他用户对其具有读取访问权限。请不要提供基于继承的解决方案。我可以使用 spring-security 或 apache shiro 吗?
假设这个类(在 groovy 中):
class Class_A {
String type
...
}
我想根据类型的值定义对其实例的访问级别。例如,如果类型值为“T1”,则某些用户将对 Class_A 具有读取访问权限,而如果类型值为“T2”,则其他用户对其具有读取访问权限。请不要提供基于继承的解决方案。我可以使用 spring-security 或 apache shiro 吗?
据我所知,没有开箱即用的插件可以解决这个问题,但是我已经使用 shiro 实现了项目,这些项目确实限制了对对象的访问。
您的问题将分为两个单独的问题:
a) 限制对对象的直接访问 - 没有权限的用户不应该能够访问这些对象的显示页面
b) 过滤列表和搜索 - 没有正确权限的用户不应在概览列表和搜索结果中看到这些对象
我对a)的解决方案:
创建一个过滤器类(http://grails.org/doc/latest/guide/single.html#filters)并before
为每个控制器添加一个过滤器,它能够显示要保护的对象。在此过滤器中,您可以预取对象并检查权限。如果它们不匹配,您可以重定向到拒绝访问页面。(当您在控制器中第二次请求对象时,Hibernate 似乎足够聪明,可以从缓存中获取对象)
顺便说一句:这样,您还可以实现其他隐式权限和角色(例如,仅当用户自己创建对象时才显示对象)
我对 b) 的解决方案:
在大多数项目中,您必须修改列表视图并添加搜索。那么为什么不简单地添加一个搜索条件作为对象的过滤器呢?如果您使用标准构建器,添加附加标准很容易......但您必须确保以正确的方式完成分页和排序。
希望有帮助。
Apache Shiro 可以做到这一点,但它确实需要一些工作。
在我的解决方案中,我实现了一个经典的 RBAC 模型并提供了一个自定义 AuthorizingRealm 覆盖这些方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal)
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
返回的 AuthorizationInfo 应该包含用户应该拥有的角色和权限。
SimpleAuthorizationInfo authInfo= new SimpleAuthorizationInfo( acl.getRoles() );
authInfo.addStringPermissions( acl.getPermissions() );
return authInfo;
在 Shiro 中权限定义为:
domain:action:instance
因此,在您的示例中,此字符串权限将允许对 Class_A 的 T1 实例进行编辑
Class_A:edit:T1
您还可以允许“所有”操作或实例。
Class_A:*:T1 // allow all actions
or
Class_A:edit:* // allow edit of all instances
希望这可以帮助。
这可以完成工作吗:http: //grails.org/plugin/spring-security-acl/