升级到 Spring Security 6 后角色层次结构不起作用

2024-02-23

我正在从 spring boot 2.7.x 升级到 3.0.0。按照官方文档中的建议进行更改后,我发现我的角色层次结构没有得到尊重。

I added expressionHandler()到我的代码中建议的Spring Security 6.x 已弃用 AccessDecisionVoter https://stackoverflow.com/questions/74763256/accessdecisionvoter-deprecated-with-spring-security-6-x但它不起作用。

我有什么想法吗?

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

  @Bean
  public SecurityFilterChain configure(
      HttpSecurity http,
      RequestHeaderAuthenticationFilter headerAuthenticationFilter) throws Exception {
    
    HttpStatusEntryPoint authenticationEntryPoint = 
        new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED);
    
    http
        .addFilterAfter(headerAuthenticationFilter, RequestHeaderAuthenticationFilter.class)
        .authorizeHttpRequests(auth -> auth
          .requestMatchers("/actuator/**", "/", "/webjars/**").permitAll()
          .requestMatchers(HttpMethod.POST).hasRole("SUPERUSER")
          .requestMatchers(HttpMethod.GET).hasRole("USER"))
        .sessionManagement(session -> session
          .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        .exceptionHandling(ex -> ex
          .authenticationEntryPoint(authenticationEntryPoint)
          .accessDeniedHandler(accessDeniedHandler()))
        .csrf(customizer -> customizer.disable());

    return http.build();
  }

  @Bean
  public RequestHeaderAuthenticationFilter headerAuthenticationFilter(
      ...
  }

  @Bean
  public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl r = new RoleHierarchyImpl();
    r.setHierarchy("ROLE_SUPERUSER > ROLE_USER");
    return r;
  }

  @Bean
  public DefaultWebSecurityExpressionHandler expressionHandler() {
    DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
    expressionHandler.setRoleHierarchy(roleHierarchy());
    return expressionHandler;
  }

AuthorityAuthorizationManager 不作为 bean 公开。事实上,它是一个带有私有构造函数的最终类。因此,为了使用我的角色层次结构,我需要手动创建 AuthorityAuthorizationManager。

这使用 spring boot 3.0.0 和 spring security 6.0.0 工作

  @Bean
  public SecurityFilterChain configure(
      HttpSecurity http,
      RequestHeaderAuthenticationFilter headerAuthenticationFilter) throws Exception {

    var auth1 = AuthorityAuthorizationManager.<RequestAuthorizationContext>hasRole("USER");
    auth1.setRoleHierarchy(roleHierarchy());
    
    http
        .authorizeHttpRequests(auth -> auth
          .requestMatchers(HttpMethod.GET).access(auth1)
        );
    return http.build();
  }

 @Bean
  public RoleHierarchy roleHierarchy() {
    RoleHierarchyImpl r = new RoleHierarchyImpl();
    r.setHierarchy("ROLE_SUPERUSER > ROLE_USER");
    return r;
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

升级到 Spring Security 6 后角色层次结构不起作用 的相关文章

  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • @PreUpdate 不适用于 Spring Data JPA

    我有一个实体 Entity EntityListeners MyEntityListener class class MyEntity 还有听者 class MyEntityListener PrePersist PreUpdate pub
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • Spring Boot中使用自定义令牌进行身份验证

    我需要保护我的 Spring Boot 应用程序 这就是我所拥有的 一个 Spring Boot 应用程序 公开了一些 REST API 与公开的 api 通信的前端 前端发送用于身份验证的自定义身份验证令牌 存储自定义身份验证令牌的数据库
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • php字符串是值类型吗?

    为什么php的string是值类型 每次将参数传递给函数时 每次进行赋值时 每次连接都会导致字符串被复制时 它都会被复制到各处 我的 NET 经验告诉我 它似乎效率低下 迫使我几乎在任何地方都使用引用 考虑以下替代方案 替代方案1 This
  • org.apache.tomcat.jdbc.pool.DataSource 不再位于 tomcat 7 dbcp jar 中?

    我正在尝试使用 tomcat dbcp jar 版本 7 0 30 为 tomcat dbcp 创建一个 spring 管理的独立池 然而 Tomcat的文档中提到的似乎是org apache tomcat jdbc DataSource类
  • 将 Spring ModelAttribute 应用于所有使用特定参数类型的控制器

    在 Spring Boot REST 应用程序中 我有一个TableRequest包含表格数据 GET 请求的列排序 筛选和分页详细信息的类型 它是通用的 因为它不关心所请求的具体数据是什么 它只指定通用表参数 因此它适用于许多不同的控制器
  • 如何列出静态链接的 python 版本中可用的所有 openssl 密码?

    在python 2 7 8到2 7 9升级中 ssl模块从使用更改为 DEFAULT CIPHERS DEFAULT aNULL eNULL LOW EXPORT SSLv2 to DEFAULT CIPHERS ECDH AESGCM D
  • PHP 文件由浏览器下载,而不是由本地开发服务器(MAMP)处理

    一切都很顺利 直到我添加AddHandler application x httpd php5s php到本地服务器文档根目录中的 htaccess 文件 根据我正在使用的站点 我经常更改该文件 因为我访问时这样做了http 本地主机 88
  • org.apache.jasper.JasperException:未指定默认命名空间时,函数测试必须使用前缀

    我在我的项目中使用以下内容 Spring 3 0 1 Apache Tiles 2 2 1 Glassfish 2 1 我想做的是调用 jsp 页面中的某些方法并向其传递一些参数 例如 我有一个豆子 Component Scope valu
  • 安全转义表名/列名

    我在 php 中使用 PDO 因此无法使用准备好的语句转义表名或列名 以下是我自己实现它的万无一失的方法 tn str replace REQUEST tn column str replace REQUEST column sql SEL
  • spring中如何进行单元测试验证注解

    我在类中有一些注释 例如 public class ProductModel Pattern regexp 1 1 9 0 9 message Quantity it should be number and greater than ze
  • 如何使用 Spring MVC 和 Thymeleaf 添加静态文件

    我的问题是如何添加 CSS 和图像文件等静态文件 以便我可以使用它们 我正在使用 Spring MVC 和 Thymeleaf 我查看了有关此主题的各种帖子 但它们对我没有帮助 所以我才来问 根据这些帖子 我将 CSS 和图像文件放在res
  • ActiveMQ发送ObjectMessage

    我正在使用 ActiveMQ 在我当前的项目中实现消息系统 我需要发送和接收 Java 对象 而不是简单的文本或二进制消息 Java 对象 我的消息对象 根据需要实现了 Serialized 接口 ActiveMQ 的最新版本添加了一些安全
  • 如何以编程方式创建 Spring 上下文?

    有谁知道是否有任何方法可以以编程方式创建 bean 上下文 我希望能够做类似的事情 ConfigurableApplicationContext c new ConfigurableApplicationContext BeanDefini
  • JavaScript 中的安全数据

    我必须为 Web 测试创建生成器 使用 HTML 和 JavaScript 测试必须离线和在线进行 正确答案和分数评估必须是生成的测试的一部分 最终用户的分数仅发送到服务器 无法在服务器上进行评估 并且服务器对问题一无所知 它只保存最终分数
  • 如何使用maven创建基于spring的可执行jar?

    我有一个基于 Maven 的 Spring WS 客户端项目 我想将其打包为单个 jar 在eclipse中 一切运行正常 当我尝试将其打包为可执行 jar 时 我收到 ClassNotFound 异常 因为 Spring jar 未包含在
  • AES 在汇编中的实现 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 大家好 我正在尝试构建一个代码来演示
  • Autowired spring bean 不是代理

    我正在开发一个连接到 MySQL 数据库的非常小的应用程序 我正在尝试创建表记录 但收到 没有正在进行的事务 我已经准备好了所有正确的东西 服务接口 MyService 及其实现 MyServiceImpl 我已经用 Service 注释了

随机推荐

  • Swift:可选下标的可选链接

    我有一个let map String String and a let key String 最简洁的访问方式是什么map key 并取回String 如果我有一个key and None如果我没有 let value key flatMa
  • 如何在 ASP.NET MVC 控制器中使用 Automapper 配置

    我正在使用 AutoMapper 将模型转换为视图模型 我已经完成所有设置 测试和工作 作为参考 我的配置方法如下所示 public static MapperConfiguration Configure MapperConfigurat
  • Rails:更改生产数据库的最佳方法

    我需要对正在使用的生产数据库进行更改 只需添加几列即可 我已经通过迁移对开发数据库进行了更改 在保留现有数据且不会过多干扰操作的情况下更新生产数据库的最佳方法是什么 它是 MYSQL 我还需要向列添加数据以及现有记录 一列可以有默认值 它是
  • 如何在 docker 容器内使用 nginx 提供静态文件?

    因为我运行的是 Mac OSX 所以我使用 boot2docker 我不知道如何使用在 docker 容器内运行的 nginx 也包含静态资产 如我的 html 和 js 提供静态文件 我有四个 docker 容器正在与此一起旋转docke
  • 存储库模式实现

    似乎我找到的存储库模式的每个示例 其实现都在某种程度上有所不同 下面是我主要找到的两个例子 interface IProductRepository IQueryable
  • 由于 Xcode 11 中不再包含应用程序加载器,如何上传 IPA

    我有点害怕问这个问题 因为这个问题对我来说似乎很大 但我没有看到有人对此感到恐慌 我有点害怕听起来很疯狂 但我会坚持下去 正如我们可以在苹果的帖子中看到的提交更新 https developer apple com app store co
  • 如何在 Angular 2 中使用 Less?

    我想知道如何在我的 Angular 2 项目中添加更少的编译 因为每个组件都有自己的 css 文件 现在将是 less文件 我不确定如何使文件编译为 css 我也用谷歌搜索了这个问题 但没有找到任何解决我的问题的方法 EDIT为了让我的问题
  • 比较字符串 Javascript 返回可能的百分比

    我正在寻找一个 JavaScript 函数 它可以比较两个字符串并返回它们相似的可能性 我看过 soundex 但对于多单词字符串或非名称来说并不是很好 我正在寻找一个类似的函数 function compare strA strB com
  • Foursquare Venue Api:生成“8/10 人喜欢这个地方”的信息

    当查看 FourSquare 页面时 例如 巴黎旺多姆广场 https foursquare com v place vend C3 B4me 4adcda09f964a5200e3421e3 显示文本 9 4 10 人们喜欢这个地方 我想
  • 由于可能的配置错误,请求超出了 10 个内部重定向的限制。?

    我有一个简单的重写 RewriteRule addnew 0 不过我得到了 Request exceeded the limit of 10 internal redirects due to probable configuration
  • c# System.guid 不包含 Parse 的定义

    AT Anchor System Guid Parse DataBinder Eval e Item DataItem Anchor ToString 这会抛出 System Guid does not contain a definiti
  • “clr-namespace”URI 引用未包含在程序集中的命名空间

    我试图在我的 XAML 中包含一些转换值的类 但是 当我编译时 我收到以下错误 未定义的 CLR 命名空间 clr namespace URI 引用未包含在程序集中的命名空间 View Summary Converters View Vie
  • 角度 4 中的动画路线

    我正在尝试以角度 4 为路线过渡设置动画 动画在页面首次加载和页面刷新时起作用 所以我知道动画有效 但在我切换路线时则不然 我缺少什么 这是代码 组件元数据 animations fadeInAnimation 模板 div class r
  • iPhone 开发:初学者资源

    正如标题所说 您有任何可用资源来开始为 iPhone 进行开发吗 书籍 在线资源 工具 开发环境 先决条件以及与iPhone编程相关的一切都会很好 Thanks 假设您是初学者 对于书籍而言 此列表是一个很好的起点 http cocoade
  • 如何选择一定长度的数据项?

    如何选择列中的行以使行大小 例如 身份证号 名字 仅选择名字超过 10 个字符的人 他们的名字太长 如果您必须使用特定的 RDBMS 那么解决方案很简单 Use the LENGTH function 根据您的数据库 长度函数可以是 LEN
  • 在非 boost 线程中使用 boost::thread_specific_ptr

    我正在阅读文档部分boost thread specific ptr http www boost org doc libs 1 55 0 doc html thread thread local storage html 并尝试解析这一段
  • 无法在 Windows 上打印彩色文本

    我是 Python 新手 试图在控制台中打印彩色文本 我的操作系统是windows 10 代码如下 class bcolors Colors for console HEADER 033 95m YGREEN 033 92m WARNING
  • 为什么新的 Pick 类型允许 React 的 setState() 中 K 的子集?

    我以为我明白了新的目的TS 2 1 Pick type https www typescriptlang org docs handbook release notes typescript 2 1 html partial readonl
  • 可变参数列表

    假设我有 2 个函数 void f1 int p1 int v1 AND void f2 int v1 在 f1 内部 我想将所有参数从可变参数列表传递到 f2 void f1 int p1 int v1 f2 pass all varia
  • 升级到 Spring Security 6 后角色层次结构不起作用

    我正在从 spring boot 2 7 x 升级到 3 0 0 按照官方文档中的建议进行更改后 我发现我的角色层次结构没有得到尊重 I added expressionHandler 到我的代码中建议的Spring Security 6