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

时间:2012-03-21 12:18:50

标签: spring-security

我是Spring Security的新手。我一直致力于创建一个自定义选民,根据对象属性的值决定是否授予权限。也就是说,如果对象实例A具有值为i的属性X,则具有ROLE_MGR的用户具有访问权限。如果对象实例B在X属性中具有值j,则ROLE_MGR无权访问。是否可以这样做,如果是这样,我需要做什么?如果不可能,我们可能决定不使用Spring Security。

2 个答案:

答案 0 :(得分:0)

这可能,但首先看一下Spring Securitys域对象的安全性。这用于授予您对象的细粒度访问权限,请参见此处:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/domain-acls.html

答案 1 :(得分:0)

我明白了。我需要使用自定义权限评估程序。我的代码中的代码段在下面针对可能尝试执行类似操作的任何人提供:

的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>

服务接口     @PostFilter(“hasPermission(filterObject,'READ')”)     public List getAll();

自定义权限评估程序

@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;
}