Java Can';无法获得@PreAuthorize来处理角色层次结构
我有一个自定义身份验证提供程序,它只返回一个具体的'AbstractAuthenticationTokenJava Can';无法获得@PreAuthorize来处理角色层次结构,java,spring-security,Java,Spring Security,我有一个自定义身份验证提供程序,它只返回一个具体的'AbstractAuthenticationToken实现,其中包含角色\u ADMIN。我有一个用@PreAuthorize(“hasRole('ROLE\u USER')”)注释的方法。我正在尝试设置一个角色层次结构,以允许我的管理员用户访问此方法 我的spring-security.xml中包含以下内容: <beans:bean id="roleHierarchy" class="org.springframework.securi
实现,其中包含
角色\u ADMIN。我有一个用
@PreAuthorize(“hasRole('ROLE\u USER')”)注释的方法。我正在尝试设置一个角色层次结构,以允许我的管理员用户访问此方法
我的spring-security.xml中包含以下内容:
<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>
角色\管理>角色\用户
对受保护方法的请求被拒绝,但如果我将注释更改为@PreAuthorize(“hasRole('ROLE\u ADMIN')”)
,则该请求仍然有效
我在AccessDeniedException
上放置了一个断点,该断点是从AffirmativeBased.decision(…)
抛出的。问题似乎是PreInvocationAuthorizationAdviceVoter
的expressionHandler
为null
。这对我来说意味着在我的角色管理或方法表达处理程序中有一些错误
我的spring-security.xml有什么明显的问题吗?我对这些东西的工作原理有什么误解吗?尝试将
roleHierarhy
注入roleVoter
。示例来自:
角色\管理>角色\员工
角色\工作人员>角色\用户
角色\用户>角色\来宾
尝试将roleHierarhy
注入roleVoter
。示例来自:
角色\管理>角色\员工
角色\工作人员>角色\用户
角色\用户>角色\来宾
哦,我真傻。。。我的问题没有足够的背景来回答这个问题,但我已经解决了
我的spring security.xml
和dispatcher servlet.xml
中都有
。我只是在spring security中进行更改
当我在DefaultMethodSecurityExpressionHandler
的构造函数上设置一个断点时,我就放弃了它。它被呼叫了两次。一个叫setRoleHierarchy
,另一个没有
解决办法是:
spring security.xml
和dispatcher servlet.xml
导入
和methodExpressionHandler
bean从spring security.xml
移动到dispatcher servlet.xml
哦,我真傻。。。我的问题没有足够的背景来回答这个问题,但我已经解决了 我的
spring security.xml
和dispatcher servlet.xml
中都有
。我只是在spring security中进行更改
当我在DefaultMethodSecurityExpressionHandler
的构造函数上设置一个断点时,我就放弃了它。它被呼叫了两次。一个叫setRoleHierarchy
,另一个没有
解决办法是:
spring security.xml
和dispatcher servlet.xml
导入
和methodExpressionHandler
bean从spring security.xml
移动到dispatcher servlet.xml
不走运。PreInvocationAuthorizationAdviceVoter的expressionHandler仍然为null,accessDecisionManager中的第二个投票者只是一个普通的旧角色选择器。我将尝试显式定义accessDecisionManager,但我肯定我以前也经历过这种情况。运气不好。PreInvocationAuthorizationAdviceVoter的expressionHandler仍然为null,accessDecisionManager中的第二个投票者只是一个普通的旧角色选择器。我将尝试显式定义accessDecisionManager,但我肯定我以前也经历过这种情况。我也有同样的问题。我试过你的解决方案,但不起作用。还有一件事,为什么要在spring-security.xml和dispatcher-servlet.xml中包含RoleHierarchybean。我们不能在一个文件中有完整的配置。我也有同样的问题。我试过你的解决方案,但不起作用。还有一件事,为什么要在spring-security.xml和dispatcher-servlet.xml中包含RoleHierarchybean。我们不能将整个配置放在一个文件中吗。
<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>