Spring-Security: написание собственного PermissionEvaluator - как внедрить службу DAO? - PullRequest
4 голосов
/ 20 сентября 2011

Я работаю с Spring-Security, и мне нужно реализовать собственный PermissionEvaluator (после ответа на мой другой вопрос .

Однако, глядя на стандартную реализацию AclPermissionEvaluator здесь Я заметил, что DAO устанавливается через конструктор.

Если я объявлю свой пользовательский PermissionEvaluator следующим образом:

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled">
    <expression-handler ref="expressionHandler"/>
</global-method-security>

<beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <beans:property name="permissionEvaluator">
        <beans:bean id="permissionEvaluator" class="com.npacemo.permissions.SomePermissionsEvaluator"/>
    </beans:property>
</beans:bean>

где я могу получить свой DAO вEvaluator, чтобы я мог получить доступ к данным? Могу ли я внедрить их, то есть, управляется ли PermissionEvaluator Spring? Или как я могу получить свой dataProvider в Evaluator?

1 Ответ

6 голосов
/ 21 сентября 2011

Только что понял: PermissionEvaluator управляется Spring, поэтому

@Inject 
private PermissionManager permissionManager;

будет отлично работать.


edit: Для нашего проекта мыМы реализуем наш собственный PermissionResolver, вероятно, расширяя стандартную реализацию:

public class OurPermissionEvaluator extends AclPermissionEvaluator{


    public CombinedPermissionEvaluator(AclService aclService) {
        super(aclService);
    }

и внедряя пользовательский ACLService (следующий этот учебник)

public class OurAclServiceImpl implements AclService {

, где мы получаем ACLинформация из нашей пользовательской структуры базы данных.

Чтобы связать все это, мы будем следовать примеру контактов пружинной защиты:

<b:bean id="permissionEvaluator" class="path.to.OurPermissionEvaluator">
    <b:constructor-arg ref="aclService"/>
</b:bean>

, где aclService должен быть объявлен таким образом:

  <bean id="aclService" class="path.to.OurAclServiceImpl">
     <constructor args here... >
  </bean>
...