根据对象的字段值定义访问级别

时间:2012-08-04 06:58:19

标签: java grails spring-security shiro

假设这个类(在groovy中):

class Class_A {
    String type
    ...
}

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

3 个答案:

答案 0 :(得分:2)

据我所知,没有插件可以解决这个问题,但是我已经用shiro实现了限制访问对象的项目。

你的问题会分成两个不同的问题:

a)限制对对象的直接访问 - 没有权限的用户不应该能够访问这些对象的显示页面

b)过滤列表和搜索 - 没有正确权限的用户不应在概览列表和搜索结果中看到这些对象


我的a)解决方案:

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

顺便说一句:这样,您还可以实现其他隐式权限和角色(例如,只有在用户自己创建对象时才显示对象)


我的b)解决方案:

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

希望有所帮助。

答案 1 :(得分: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;

在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

希望这有帮助。

答案 2 :(得分:0)