Можно ли использовать значение атрибута объекта для определения доступа? - PullRequest
0 голосов
/ 21 марта 2012

Я новичок в Spring Security.Я работал над созданием собственного избирателя, который будет решать, предоставлять ли разрешение или нет, основываясь на значении атрибута объекта.То есть, если экземпляр объекта A имеет атрибут X со значением i, пользователь с ROLE_MGR имеет доступ.Если экземпляр объекта B имеет значение j в атрибуте X, то ROLE_MGR не имеет доступа.Можно ли это сделать, и если да, что мне нужно сделать?если это невозможно, мы можем отказаться от использования Spring Security.

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Я понял это. Мне нужно использовать специальный оценщик разрешений. Ниже приведены фрагменты из моего кода для тех, кто пытается сделать что-то подобное:

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')") публичный список 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;
}
0 голосов
/ 21 марта 2012

Это возможно, но сначала взглянем на безопасность объектов домена Spring Securitys. Это используется для предоставления мелкозернистого доступа к вашим объектам, см. Здесь: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/domain-acls.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...