AccessDeniedException при использовании RoleHierarchyImpl - PullRequest
3 голосов
/ 18 октября 2011

Я использую иерархию ролей в Spring Security.

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
    <beans:constructor-arg ref="roleHierarchy" />
</beans:bean>

<beans:bean id="roleHierarchy"
        class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <beans:property name="hierarchy">
        <beans:value>
            ROLE_USER > ROLE_GUEST
        </beans:value>
    </beans:property>
</beans:bean>

Я защищаю методы с использованием protect-pointcut

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled">
  <protect-pointcut expression="execution(* my.package.*(..))"
     access="ROLE_GUEST"/>
</global-method-security>

Однако я получаю AccessDeniedException, если я вхожу в систему с пользователем, которыйПолномочия ROLE_USER.У меня нет проблем, если я указал protect-pointcut с access="ROLE_GUEST,ROLE_USER".

Я пропустил некоторые шаги?К вашему сведению, я использую Spring 3.0.5.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 26 апреля 2012

Не забудьте добавить WebExpressionVoter, чтобы иметь возможность также использовать выражения в элементе http:

<sec:http use-expressions="true" access-decision-manager-ref="accessDecisionManager">
   <sec:intercept-url pattern="/index.html" access="hasRole('ROLE_AUTHENTICATED')" />
   <sec:intercept-url pattern="/admin" access="hasRole('ROLE_SUPERVISOR')" />
   ...

Поэтому я в итоге получаю accessDecisionManager, содержащий избирателя иерархии ролей и WebExpressionVoter, оба стой же роли ИерархияImpl bean.

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
  <property name="decisionVoters">
    <list>
       <ref bean="roleHierarchyVoter" />
       <bean class="org.springframework.security.web.access.expression.WebExpressionVoter">
           <property name="expressionHandler">
            <bean class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
               <property name="roleHierarchy" ref="roleHierarchy"/>
            </bean>
        </property>
       </bean>
       <bean class="org.springframework.security.access.vote.AuthenticatedVoter"/>
    </list>
  </property>
</bean>
<bean id="roleHierarchyVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
    <constructor-arg ref="roleHierarchy" />
</bean>

<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <property name="hierarchy">
        <value>
            ROLE_SUPERVISOR > ROLE_XX
            ROLE_XX > ROLE_AUTHENTICATED
            ROLE_AUTHENTICATED > ROLE_UNAUTHENTICATED
        </value>
    </property>
</bean>

(весна сек 3.1)

3 голосов
/ 14 апреля 2015

В приведенном выше примере jgraglia вложенные bean-компоненты немного ошибочны, и вам не нужно <ref bean="roleHierarchyVoter" />, поскольку иерархия обрабатывается в WebExpressionVoter. Я делаю это в Spring Security 4.0.0, но код выглядит так же, за исключением того, что вам не нужно use-expressions="true", потому что он включен по умолчанию.

Обычно я стараюсь как можно больше вкладывать свои bean-компоненты, поэтому в моем коде нет значений ref="", если не требуется.

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
   <constructor-arg>
        <bean class="org.springframework.security.web.access.expression.WebExpressionVoter">
            <property name="expressionHandler" ref="webExpressionHandler" />
        </bean>
   </constructor-arg>
</bean>

<bean id="webExpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler">
    <property name="roleHierarchy" ref="roleHierarchy"/>
</bean>

<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <property name="hierarchy">
        <value>
            ROLE_ADMIN > ROLE_USER
            ROLE_USER > ROLE_ANONYMOUS
        </value>
    </property>
</bean>
2 голосов
/ 19 октября 2011

Посмотрите сообщение об ошибке SEC-1163 и комментарий ниже.

Если вам нужна базовая поддержка иерархий ролей, используйте RoleHierarchyVoter вместо RoleVoter.

Так что вам нужно что-то вроде:

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
    <property name="decisionVoters">
        <list>              
            <ref bean="roleHierarchyVoter" />
            <ref bean="authenticatedVoter" />
            <ref bean="preAdviceVoter" />
            <ref bean="mediaItemReadVoter" />
            <ref bean="mediaItemWriteVoter" />
        </list>
    </property>
</bean>

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
    <constructor-arg ref="roleHierarchy"/>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...