我可以使用Spring Security ACL和实体权限,但我想知道如何测试用户是否可以访问类的“create”(bit 2)权限。
类似的东西:
aclPermissionEvaluator.hasPermission(auth, clazz, "create")
有人可以帮助我吗?
提前致谢
答案 0 :(得分:0)
您可以使用Spring的SpEL注释,例如@PreAuthorize
,并覆盖hasPermission
接口的PermissionEvaluator
方法。如果您使用的是按位权限掩码,并且用户的权限(作为int
)评估为“15”(1111
),则对象所需的权限为“6”({{1 }},您可以执行以下操作:
0110
只要对象的权限掩码中的活动位在用户的权限上处于活动状态,这将返回true。然后,您需要在public boolean hasPermission(Authentication auth, Object targetObject, Object requiredPermissions) {
int permissionMask = MyUserClass.getMask();
int permissionsRequired = Integer.valueOf(requiredPermissions.toString());
return ((permissionMask | requiredPermissions) == permissionMask);
}
文件中声明此自定义权限评估程序:
security.xml
现在,每当您调用<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler"/>
</security:global-method-security>
<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="permissionEvaluator"/>
</bean>
<bean id="permissionEvaluator" class="my.project.package.CustomPermissionEvaluator"/>
时,您的自定义评估程序都会处理该请求。显然,您可以使用您喜欢的任何逻辑来评估权限 - 只需确保返回类型为hasPermission()
,并且要传递的参数与您发送的参数匹配(或进行评估;请注意格式异常)
请注意,您的自定义参数必须作为boolean
传递以覆盖Object
;您还可以通过更改签名来处理方法,以处理您喜欢的任何参数类型(例如String或int),并且编译器应选择最具体的签名。但是,由于您正在实现PermissionEvaluator接口,因此无论如何都必须包含给定的签名(Authentication,Object,Object),因此除非您有特定的需要编写重载方法,否则您也可以覆盖。 / p>
答案 1 :(得分:0)
我有完全相同的问题,可悲的是,没有“开箱即用”的解决方案。
如果您的域模型允许这样做,一种方法是向您要创建的父对象添加创建权限
例如,假设您要为客户端创建用户。您可以为允许为该特定客户端创建用户的用户向客户端添加创建权限。那是我选择的路径。
如果您的域对象不允许这样做,那么我发现的唯一方法是:
acl_class_entry
,其等效列表acl_entry
但链接到acl_class
而不链接到acl_object_identity
boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission)
为空,则对方法acl_class_entry
收取费用,以对target_id
进行权限检查。这将允许您使用SPel表达式hasPermission(nulll, 'className', 'permission')
AclService
版本才能创建这种权限。