2012-08-04 75 views
2

假设这个类(在常规):定义访问级别的基于对象的字段值

class Class_A { 
    String type 
    ... 
} 

我想定义的访问级别基于类型的值的实例。例如,如果类型值为“T1”,并且其他用户具有对其的读取访问权限,则某些用户对Class_A具有读取访问权限,如果类型值为“T2”。 请不要提供基于继承的解决方案。我可以使用spring-security或apache shiro吗?

回答

2

据我所知,没有任何插件,它解决了这个问题,开箱即用的,但我已经实现与四郎这的确限制访问对象的项目。

您的问题将分成两个独立的问题:

一)限制直接访问对象 - 无权限的用户不应该能够访问该节目网页,这些对象

B)筛选器列表和搜索 - 用户没有正确的权限不应该看到在概述列表中的那些对象和搜索结果


我解决了):

为每个能够显示要保护的对象的控制器创建一个Filter-Class(http://grails.org/doc/latest/guide/single.html#filters)并添加一个before -filter。在此过滤器中,您可以预取对象并检查权限。如果它们不匹配,则可以重定向到拒绝访问页面。 (当你在控制器中第二次请求时,Hibernate似乎足够聪明,可以从缓存中取得对象)

btw:这样,你也可以实现其他隐式权限和角色(例如,只显示一个对象用户已经创建了自己它)


我的解决方案b):

在多数项目中,您必须修改列表视图,并添加一个搜索。那么为什么不简单地添加一个搜索条件作为过滤器的对象?如果您使用条件构建器,则添加附加条件非常简单...但您必须确保分页和排序按照正确的方式完成。

希望有所帮助。

1

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; 

在四郎权限定义为:

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 

希望这会有所帮助。