2013-07-09 1 views
1

'AbstractAuthenticationToken with ROLE_ADMIN only. I have a method annotated with @PreAuthorize ("hasRole ('ROLE_USER ')")`의 구체적인 구현을 반환하는 사용자 정의 인증 공급자가 있습니다. 내 관리자에게이 방법에 대한 액세스 권한을 부여하기 위해 역할 계층 구조를 설정하려고합니다. 내가 @PreAuthorize("hasRole('ROLE_ADMIN')")에 주석을 변경하면 작동하지만,@PreAuthorize를 역할 계층 구조로 사용할 수 없습니다.

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

<beans:bean id="methodExpressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name="roleHierarchy" ref="roleHierarchy" /> 
</beans:bean> 

<sec:global-method-security pre-post-annotations="enabled"> 
    <sec:expression-handler ref="methodExpressionHandler" /> 
</sec:global-method-security> 

보호 방법에 대한 요청이 거부됩니다 :

나는 내 스프링 security.xml에 다음 있습니다.

나는 AffirmativeBased.decide(...)에서 던져진 AccessDeniedException에 중단 점을 넣었습니다. 문제는 PreInvocationAuthorizationAdviceVoterexpressionHandlernull 인 것으로 나타났습니다. 이는 내 roleHierarchy 또는 methodExpressionHandler를 연결하는 데 문제가 있음을 나타냅니다.

내 spring-security.xml에 문제가 있습니까? 이 물건들이 어떻게 작동해야하는지에 대해 내가 오해하고있는 것이 있습니까?

답변

1

아 어떻게 바보가 ...이 답변을 내 질문에 충분한 상황이 아니지만, 나는 그것을 해결했습니다.

나는 spring-security.xmldispatcher-servlet.xml에서 모두 <global-method-security>입니다. 나는 봄 경비 내에서만 변화를 만들고 있었다.

DefaultMethodSecurityExpressionHandler의 생성자에 중단 점을 넣었을 때 포기가있었습니다. 그것은 두 번 불리고있었습니다. 하나는 setRoleHierarchy을 호출하고 다른 하나는 호출하지 않았습니다.

솔루션했다 : 별도의 파일로 출력

  1. 이동 일반적인 역할 계층 구조 정의가 spring-security.xmldispatcher-servlet.xml 모두 가져올.
  2. methodExpressionHandler 콩을 spring-security.xml에서 dispatcher-servlet.xml으로 이동하십시오.
+0

나는 또한 동일한 문제가있다. 나는 당신에게 해결책을 시도했지만 작동하지 않습니다. spring-security.xml과 dispatcher-servlet.xml에 RoleHierarchy 빈을 포함시키는 또 하나의 이유. 한 파일에 전체 구성을 넣을 수는 없습니까? –

0

roleHierarhyroleVoter에 삽입하십시오. official documentation에서 예 : 내

<bean id="roleVoter" 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_ADMIN > ROLE_STAFF 
      ROLE_STAFF > ROLE_USER 
      ROLE_USER > ROLE_GUEST 
     </value> 
    </property> 
</bean> 
+0

행운을 빈다. PreInvocationAuthorizationAdviceVoter의 expressionHandler는 여전히 null이며 accessDecisionManager의 두 번째 유권자는 평범한 RoleVoter입니다. 나는 명시 적으로 accessDecisionManager를 정의하려고 노력할 것이다. 그러나 나는 전에이 길을 걸어 왔을 것이라고 확신한다. – Martin

관련 문제