【翻译】Spring Security抛弃了WebSecurityConfigurerAdapter
原文链接:Spring Security without the WebSecurityConfigurerAdapter
作者:ELEFTHERIA STEIN-KOUSATHANA
发表日期:2022年2月21日
在Spring Security 5.7.0-M2,我们弃用了WebSecurityConfigurerAdapter
,因为我们鼓励用户转向使用基于组件的安全配置。
为了帮助大家熟悉这种新的配置风格,我们编制了一份常见用例表和推荐的新写法。
在下面的例子中,我们遵循最佳实践——使用Spring Security lambda领域专用语言(DSL)和HttpSecurity#authorizeHttpRequests
方法来定义我们的授权规则。如果你对lambda领域专用语言(DSL)不熟悉,你可以在这篇博客了解它。如果你想知道为什么我们选择选择使用HttpSecurity#authorizeHttpRequests
,你可以看这篇参考文档。
配置HttpSecurity
在Spring Security 5.4,我们引入了创建一个SecurityFilterChian
bean来配置HttpSecurity
的功能。
下面是一个使用WebSecurityConfigurerAdapter
和HTTP Basic保护所有端点的示例配置:
1 @Configuration
2 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
3
4 @Override
5 protected void configure(HttpSecurity http) throws Exception {
6 http
7 .authorizeHttpRequests((authz) -> authz
8 .anyRequest().authenticated()
9 )
10 .httpBasic(withDefaults());
11 }
12
13 }
往后,我们建议注册一个SecurityFilterChain
bean来做这件事:
1 @Configuration
2 public class SecurityConfiguration {
3
4 @Bean
5 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
6 http
7 .authorizeHttpRequests((authz) -> authz
8 .anyRequest().authenticated()
9 )
10 .httpBasic(withDefaults());
11 return http.build();
12 }
13
14 }
配置WebSecurity
在Spring Security 5.4中,我们还引入了WebSecurityCustomizer
。
WebSecurityCustomizer
是一个回调接口,可以用来定制WebSecurity
。
下面是一个使用WebSecurityConfigurerAdapter
忽略匹配/ignore1
或/ignore2
的请求的示例配置:
1 @Configuration
2 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
3
4 @Override
5 public void configure(WebSecurity web) {
6 web.ignoring().antMatchers("/ignore1", "/ignore2");
7 }
8
9 }
往后,我们建议注册一个WebSecurityCustomizer
bean来做这件事:
1 @Configuration
2 public class SecurityConfiguration {
3
4 @Bean
5 public WebSecurityCustomizer webSecurityCustomizer() {
6 return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
7 }
8
9 }
警告:如果你正在配置WebSecurity
来忽略请求,建议你改为在HttpSecurity#authorizeHttpRequests内使用permitAll
。想了解更多请参考configure
Javadoc。
LDAP认证
在Spring Security 5.7,我们引入了EmbeddedLdapServerContextSourceFactoryBean
、LdapBindAuthenticationManagerFactory
和LdapPasswordComparisonAuthenticationManagerFactory
,这些类都可以用来创建一个嵌入式的LDAP服务器;并且我们还引入一个AuthenticationManager
类,它可以用来执行LDAP认证。
下面是一个使用是一个使用绑定验证的示例配置,它使用了WebSecurityConfugurerAdapter
创建嵌入式LDAP服务器并且使用AuthenticationManager
执行LDAP认证(Below is an example configuration using WebSecurityConfigurerAdappter
the that creates an embedded LDAP server and an AuthenticationManager
that performs LDAP authentication using bingd authentication):
1 @Configuration
2 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
3
4 @Override
5 protected void configure(AuthenticationManagerBuilder auth) throws Exception {
6 auth
7 .ldapAuthentication()
8 .userDetailsContextMapper(new PersonContextMapper())
9 .userDnPatterns("uid={0},ou=people")
10 .contextSource()
11 .port(0);
12 }
13
14 }
往后,我们建议使用新的LDAP类来做这件事:
1 @Configuration
2 public class SecurityConfiguration {
3 @Bean
4 public EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean() {
5 EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean =
6 EmbeddedLdapServerContextSourceFactoryBean.fromEmbeddedLdapServer();
7 contextSourceFactoryBean.setPort(0);
8 return contextSourceFactoryBean;
9 }
10
11 @Bean
12 AuthenticationManager ldapAuthenticationManager(
13 BaseLdapPathContextSource contextSource) {
14 LdapBindAuthenticationManagerFactory factory =
15 new LdapBindAuthenticationManagerFactory(contextSource);
16 factory.setUserDnPatterns("uid={0},ou=people");
17 factory.setUserDetailsContextMapper(new PersonContextMapper());
18 return factory.createAuthenticationManager();
19 }
20 }
JDBC认证
下面是一个示例配置,它在WebSecurityConfigurerAdapter
内创建了一个使用默认模式初始化并且只有一个用户的内嵌DataSource
:
1 @Configuration
2 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
3 @Bean
4 public DataSource dataSource() {
5 return new EmbeddedDatabaseBuilder()
6 .setType(EmbeddedDatabaseType.H2)
7 .build();
8 }
9
10 @Override
11 protected void configure(AuthenticationManagerBuilder auth) throws Exception {
12 UserDetails user = User.withDefaultPasswordEncoder()
13 .username("user")
14 .password("password")
15 .roles("USER")
16 .build();
17 auth.jdbcAuthentication()
18 .withDefaultSchema()
19 .dataSource(dataSource())
20 .withUser(user);
21 }
22 }
推荐的做法是创建一个JdbcUserDetailsManager
bean来做这件事:
1 @Configuration
2 public class SecurityConfiguration {
3 @Bean
4 public DataSource dataSource() {
5 return new EmbeddedDatabaseBuilder()
6 .setType(EmbeddedDatabaseType.H2)
7 .addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
8 .build();
9 }
10
11 @Bean
12 public UserDetailsManager users(DataSource dataSource) {
13 UserDetails user = User.withDefaultPasswordEncoder()
14 .username("user")
15 .password("password")
16 .roles("USER")
17 .build();
18 JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
19 users.createUser(user);
20 return users;
21 }
22 }
注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswrdEncoder()
。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。
内存内认证
下面是一个示例配置,它在WebSecurityConfugurerAdapter
配置了一个只存有一个用户的内存内用户:
1 @Configuration
2 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
3 @Override
4 protected void configure(AuthenticationManagerBuilder auth) throws Exception {
5 UserDetails user = User.withDefaultPasswordEncoder()
6 .username("user")
7 .password("password")
8 .roles("USER")
9 .build();
10 auth.inMemoryAuthentication()
11 .withUser(user);
12 }
13 }
我们建议注册一个InMemoryUserDetailsManager
bean来做这件事:
1 @Configuration
2 public class SecurityConfiguration {
3 @Bean
4 public InMemoryUserDetailsManager userDetailsService() {
5 UserDetails user = User.withDefaultPasswordEncoder()
6 .username("user")
7 .password("password")
8 .roles("USER")
9 .build();
10 return new InMemoryUserDetailsManager(user);
11 }
12 }
注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswrdEncoder()
。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。
全局AuthenticationManager
要创建一个整个应用都可以使用的AuthenticationManager
,只需要使用@Bean将AuthenticationManager
注册为bean就可以了。
这种配置已经在上面的LDAP认证示例展示过了。
局部AuthenticationManager
在Spring Security 5.6中,我们引入了HttpSecurity#authenticationManager方法,这个方法可以为特定的SecurityFilterChain
覆盖默认的AuthenticationManager
。
下面是一个示例配置,它设置了一个自定义的AuthenticationManager
:
1 @Configuration
2 public class SecurityConfiguration {
3
4 @Bean
5 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
6 http
7 .authorizeHttpRequests((authz) -> authz
8 .anyRequest().authenticated()
9 )
10 .httpBasic(withDefaults())
11 .authenticationManager(new CustomAuthenticationManager());
12 return http.build();
13 }
14
15 }
访问局部AuthenticationManager
可以使用自定义领域专用语言(DSL)访问局部AuthenticationManager
。这实际上是Spring Security内部实现HttpSecurity.authorizeRequests()
等方法的方式。
1 public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl, HttpSecurity> {
2 @Override
3 public void configure(HttpSecurity http) throws Exception {
4 AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
5 http.addFilter(new CustomFilter(authenticationManager));
6 }
7
8 public static MyCustomDsl customDsl() {
9 return new MyCustomDsl();
10 }
11 }
然后,在构建SecurityFilterchain
时可以应用自定义领域专用语言(DSL):
1 @Bean
2 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
3 // ...
4 http.apply(customDsl());
5 return http.build();
6 }
欢迎加入
我们很高兴与您分享这些更新,我们期待通过您的反馈进一步增强Spring安全性!如果你有兴趣贡献,你可以在GitHub上找到我们。
【翻译】Spring Security抛弃了WebSecurityConfigurerAdapter的更多相关文章
- 【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?
原文链接:Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated 原文作者:Nam Ha Minh 原文发表日期:20 ...
- SpringBoot第二十三篇:安全性之Spring Security
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11350255.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 系统的安全 ...
- Spring Security 自定义 登陆 权限验证
转载于:https://www.jianshu.com/p/6b8fb59b614b 项目简介 基于Spring Cloud 的项目,Spring Cloud是在Spring Boot上搭建的所以按照 ...
- 【微服务】 数据库案例理解Spring Security OAuth
突然被问,你是做技术的怎么不走技术路线呢?是啊~仔细想想至今做了这么多年的技术,研发过的系统&产品五花八门,涉及到的领域各行各业:政府.军队.公安.国安.石油&石化.金融.教育.华为等 ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...
- Spring Security(一):官网向导翻译
原文出自 https://spring.io/guides/topicals/spring-security-architecture Spring Security Architecture ...
- spring security 继承 WebSecurityConfigurerAdapter 的重写方法configure() 参数 HttpSecurity 常用方法及说明
HttpSecurity 常用方法及说明 方法 说明 openidLogin() 用于基于 OpenId 的验证 headers() 将安全标头添加到响应 cors() 配置跨域资源共享( CORS ...
- Spring Security即将弃用WebSecurityConfigurerAdapter配置类
用过WebSecurityConfigurerAdapter的都知道对Spring Security十分重要,总管Spring Security的配置体系.但是马上这个类要废了,你没有看错,这个类将在 ...
- 【翻译】Thymeleaf – Spring Security集成模块
原文链接:Thymeleaf - Spring Security integration modules 来源:thymeleaf/thymeleaf-extras-springsecurity自述文 ...
随机推荐
- 【JAVA】学习路径64-补充-编写一个会抛异常的方法
有一些方法,在调用的时候有可能会出错,所以我们使用这些方法的时候会使用try catch. 比如InputStream里面的read()方法等等,那么这些方法是怎么实现抛异常的效果的呢? 能抛异常的方 ...
- 【Java】学习路径51-线程组
平时创建线程的时候,系统会默认为线程分组. 我们可以使用 ThreadGroup tg1 = t1.getThreadGroup(); 取得t1的线程组对象. 然后使用getName获得线程组名称. ...
- .Net+Vue3实现数据简易导入功能
在开发的过程中,上传文件或者导入数据是一件很常见的事情,导入数据可以有两种方式: 前端上传文件到后台,后台读取文件内容,进行验证再进行存储 前端读取数据,进行数据验证,然后发送数据到后台进行存储 这两 ...
- 干货分享!JAVA诊断工具Arthas在Rainbond上实践~
别再担心线上 Java 业务出问题怎么办了,Arthas 帮助你解决以下常见问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 ...
- Linux使用密钥登录SSH
输入命令和上传密钥时需要注意当前目录.账号和读写权限 生成密钥 使用服务器生成(方法一,推荐) 1.1生成密钥 #ssh-keygen(这里pwd为当前账号的home目录) 1.2下载密钥 .id_r ...
- MinIO Docker 快速入门
官方文档地址:http://docs.minio.org.cn/docs/master/minio-docker-quickstart-guide 在Docker中运行MinIO单点模式 MinIO ...
- Elasticsearch:使用_update_by_query更新文档
转载自: https://blog.csdn.net/UbuntuTouch/article/details/105564270 在很多的情况下,我们我们想更新我们所有的文档: 添加一个新的field ...
- APICloud可视化编程(二)
上一期我们为大家讲解低代码在国内市场的当前现状以及APICloud可视化开发工具的组件类型和特点.相信大家对可视化编程有了一个整体的了解,那么今天带大家更进一步的使用组件. 下载开发工具 登录APIC ...
- 企业信息化建PLM系统、ERP系统、MES系统是单个逐步建设好,还是同时上比较好?
企业信息化建PLM系统.ERP系统.MES系统肯定是单个逐步建设好啊,不仅仅是各个系统单独建设,系统内各模块的实施也应该先后逐步推进,切不可想着一口吃个大胖子,一股脑的全上,求全求快是很多系统实施失败 ...
- 如何在服务器上部署WebDeploy
之前项目中网站发布都是手工拷贝文件,特别麻烦,看到好多用webdeploy一键部署网站到IIS服务器,我也学习了一下. 第一步,打开服务器管理器 打开方式是开始菜单=>管理工具=>服务器管 ...