Spring security 是否可以使用对象的属性值来决定访问权限?

Spring security 是否可以使用对象的属性值来决定访问权限?,spring-security,Spring Security,我是春天安全的新手。我一直在努力创建一个自定义投票者,该投票者将根据对象属性的值决定是否授予权限。也就是说,如果对象实例A具有值为i的属性X,则具有角色\u MGR的用户具有访问权限。如果对象实例B在X属性中具有值j,则角色\u MGR没有访问权限。有可能吗?如果有,我需要做什么?如果这不可能,我们可能会决定不使用Spring安全性。这是可能的,但首先看看Spring安全性的域对象安全性。这用于授予对对象的细粒度访问权限,请参见此处:我找到了它。我需要使用自定义权限计算器。下面为可能尝试执行类似

我是春天安全的新手。我一直在努力创建一个自定义投票者,该投票者将根据对象属性的值决定是否授予权限。也就是说,如果对象实例A具有值为i的属性X,则具有角色\u MGR的用户具有访问权限。如果对象实例B在X属性中具有值j,则角色\u MGR没有访问权限。有可能吗?如果有,我需要做什么?如果这不可能,我们可能会决定不使用Spring安全性。

这是可能的,但首先看看Spring安全性的域对象安全性。这用于授予对对象的细粒度访问权限,请参见此处:

我找到了它。我需要使用自定义权限计算器。下面为可能尝试执行类似操作的任何人提供了我的代码片段:

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">
        <bean id="permissionEvaluator"
            class="org.krams.tutorial.infrastructure.SomePermissionsEvaluator" />
    </property>
</bean>

是的,但在实施过程中你到底遇到了什么问题?这看起来很简单。我使用的是一个自定义投票器实现AccessDecisionVoter,但它没有获取域对象的方法。如何在自定义投票者中检查域对象的属性值,或者我需要查看另一个要自定义的接口/类?我认为您需要对该对象进行更多的解释。它在哪里?如何确定要访问哪个实例?这似乎就是答案所在。例如,如果无法通过注入DAO从投票者处访问它,那么您需要解释原因。我使用术语“域对象”,因为spring安全性用于使用ACL保护的对象。我希望Spring Security提供了一种直接访问域对象的方法,以便自定义投票人可以根据特定属性的值决定特定角色是否有权访问特定对象实例。我已经阅读了acl的文档,这并没有指定如何根据域对象属性的值做出决策。我同意,OP希望基于域对象属性的值而不是域对象本身来进行安全保护。
@Override
public boolean hasPermission(Authentication authorities,
        Object targetDomainObject, Object permission) {

    boolean Decision = false;
    System.out.println("Initial Decision: " + Decision);

    Date cutoffDate = null;
    try {
        cutoffDate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)
                .parse("January 1, 2012");
        System.out.println("Cutoff Date: " + cutoffDate.toString());
    } catch (ParseException e) {
        e.printStackTrace();
    }

    System.out.println("Domain Object Date: "
            + Post.class.cast(targetDomainObject).getDate());

    if (Post.class.cast(targetDomainObject).getDate().before(cutoffDate)) {
        Decision = false;
        System.out.println("In before");
    } else {
        Decision = true;
        System.out.println("In after");
    }
    System.out.println("Final Decision: " + Decision);
    System.out.println("--------");
    return Decision;
}