Java Can';无法获得@PreAuthorize来处理角色层次结构

Java 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

我有一个自定义身份验证提供程序,它只返回一个具体的'AbstractAuthenticationToken
实现,其中包含
角色\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>