Spring security Spring安全ACL-创建权限

Spring security Spring安全ACL-创建权限,spring-security,acl,Spring Security,Acl,我可以使用对实体具有权限的Spring安全ACL,但我想知道如何测试用户是否具有对类的“创建”(第2位)权限 比如: aclPermissionEvaluator.hasPermission(auth, clazz, "create") 有人能帮我吗 提前感谢您可以使用Spring的SpEL注释,例如,@PreAuthorize,并覆盖PermissionEvaluator界面的hasPermission方法。如果您使用的是位权限掩码,并且用户权限(作为int)的计算结果为“15”(1111)

我可以使用对实体具有权限的Spring安全ACL,但我想知道如何测试用户是否具有对类的“创建”(第2位)权限

比如:

aclPermissionEvaluator.hasPermission(auth, clazz, "create")
有人能帮我吗


提前感谢

您可以使用Spring的SpEL注释,例如,
@PreAuthorize
,并覆盖
PermissionEvaluator
界面的
hasPermission
方法。如果您使用的是位权限掩码,并且用户权限(作为
int
)的计算结果为“15”(
1111
),并且对象所需的权限为“6”(
0110
),则可以执行以下操作:

public boolean hasPermission(Authentication auth, Object targetObject, Object requiredPermissions) {
    int permissionMask = MyUserClass.getMask();
    int permissionsRequired = Integer.valueOf(requiredPermissions.toString());
    return ((permissionMask | requiredPermissions) == permissionMask);
}
每当对象权限掩码中的活动位在用户权限上处于活动状态时,该值将返回true。然后,您需要在
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()
,您的自定义计算器都将处理该请求。显然,您可以使用任何您喜欢的逻辑来评估权限——只要确保返回类型为
布尔值
,并且要传递的参数与您发送的参数匹配(或根据其进行评估;注意格式异常)


请注意,您的自定义参数必须作为
对象传递
,以覆盖
hasPermission()
;您还可以通过更改签名来处理您喜欢的任何参数类型(例如String或int),从而重载该方法,并且编译器应该选择最具体的签名。但是,由于您正在实现PermissionEvaluator接口,因此无论如何您都必须包含给定的签名(身份验证、对象、对象),因此除非您有编写重载方法的特定需要,否则您可以直接重写。

我也有同样的问题,遗憾的是,没有现成的解决方案

如果域模型允许,一种方法是向要创建的父对象添加创建权限

例如,假设您要为客户端创建一个用户。您可以为允许为此特定客户端创建用户的用户向客户端添加创建权限。这就是我选择的道路

如果您的域对象不允许这样做,我找到的唯一方法是:

  • 要创建一个新的表
    acl\u class\u条目
    ,该表中的列表
    acl\u条目
    等效,但链接到
    acl\u类
    ,而不是链接到
    acl\u对象标识
  • 然后,您创建自己的权限计算器,如果
    目标id
    为空,则使用方法
    布尔hasPermission(身份验证、可序列化的targetId、字符串targetType、对象权限)
    检查
    acl\u class\u条目的权限。这将允许您使用SPel表达式
    hasPermission(nulll,'className','permission')
  • 当然,您还需要创建自己版本的
    AclService
    来创建此类权限

Hi@cabbagery,谢谢您的回答,但它仍然没有在特定类上寻找权限……您是在谈论类级别的注释驱动访问,还是在谈论ACL中的对象(ACL\u类
表)?此外,如果你还没有搜索过,请查看。我已经使用了他的一些教程以及其他资源和我自己的一些实验,并且发现它非常有用。