本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

无法让 @PreAuthorize 与角色层次结构配合使用

发布于2024-11-10 22:26     阅读(782)     评论(0)     点赞(11)     收藏(5)


我有一个自定义身份验证提供程序,它返回“AbstractAuthenticationToken withROLE_ADMIN only. I have a method annotated with@PreAuthorize("hasRole('ROLE_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_ADMIN')")

我在 上放置了一个断点AccessDeniedException,这是从 抛出的AffirmativeBased.decide(...)。问题似乎是 是PreInvocationAuthorizationAdviceVoter说明我的 roleHierarchy 或 methodExpressionHandler 接线有问题。expressionHandlernull

我的 spring-security.xml 有什么明显错误吗?我是否对这些东西的工作原理有什么误解?


解决方案


哦,我太傻了...我的问题中没有足够的内容来回答这个问题,但我已经解决了。

<global-method-security>在我的spring-security.xml和我的都有dispatcher-servlet.xml。我只在spring-security内进行更改。

当我在 的构造函数上放置一个断点时,问题就暴露了DefaultMethodSecurityExpressionHandler。它被调用了两次。一次被调用了setRoleHierarchy,另一次没有。

解决方案是:

  1. 将通用角色层次定义移出到单独的文件中,以便由spring-security.xml和导入dispatcher-servlet.xml
  2. <global-method-security>豆子methodExpressionHandlerspring-security.xml移到dispatcher-servlet.xml


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/693738/14e5af2b8b3a53d745a0/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

11 0
收藏该文
已收藏

评论内容:(最多支持255个字符)