Spring Security 6.0尝鲜
前言
首先我删除了之前几篇关于SpringSecurity整合SpringBoot的文章,对于收藏了我文章的用户表示抱歉。因为我自己也比较懒,其实应该还有很多东西需要继续写下去的,但最后还是没坚持写下去,与其让它继续留在那不三不四,不如直接删除,然后重新开篇记录新东西
SpringBoot 3.0与SpringFramework 6.0与SpringSecurity 6.0
随着SpringBoot更新到3.0版本,所使用的SpringFramework也来到了6.0版本。当我使用maven创建一个SpringBoot 3.0工程时,引入SpringSecurity的使用,版本自动调整为6.0。
这里不多说SpringBoot 3.0和SpringFramework 6.0更新了啥。重点来看下SpringSecurity 6.0的Whta’s New
以上是SpringSecurity的官方文档,其中
gh-11923 - Remove WebSecurityConfigurerAdapter. Instead, create a SecurityFilterChain bean.
这一条更新正是让我想写点东西做记录的原因。这一条更新改变了我们配置SpringSecurity的方式,删除了我们之前常用的WebSecurityConfigurerAdapter配置类,作为替代,我们需要创建类型为SecurityFilterChain的bean。创建了一个最新的SpringBoot项目,从其他老项目里copy了些东西过来,打算改改搞点事情。当配置Spring Security的时候,发现不对了,然后发现版本更新到6.0了。懒惰如我,当然看看网上有没有使用攻略,翻了半天,有个大聪明在给我翻译英文文档,还翻译的不三不四的。那就自己写攻略咯
SecurityFilterChain与WebSecurityConfigurerAdapter的使用对比
使用WebSecurityConfigurerAdapter配置
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Resource
private UserDetailsService userDetailsService;
@Resource
private PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.requestMatchers("/js/**","/css/**","/img/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").loginProcessingUrl("/login")
.and()
.logout().logoutUrl("/logout").logoutSuccessUrl("/index");
}
}
省略UserDetailsService的创建过程,上面代码是从某个项目里提取出来的,直接用肯定会报错的啦。下面的是尝鲜时新写的,应该……可以放心用!
使用SecurityFilterChain配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
return manager;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().requestMatchers("/js/**","/css/**","/img/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").loginProcessingUrl("/login").permitAll()
.and()
.logout().logoutUrl("/logout").logoutSuccessUrl("/index");
return http.build();
}
}
对于只要程序能跑就行的我们来说,这些配置区别不大,不过就是authorizeRequests变成了authorizeHttpRequests嘛,没有深度使用SpringSecurity的项目,甚至可以直接从5.0到6.0迁移不做测试。
写在最后
最后再提一句,虽然官方文档里说Spring Security 6.0依赖java 8及更高版本,但默认的是把它与SpringBoot 3.0合起来用,所以最好还是用java 17及更高版本啦。然后文档里用了大量的lambda表达式,对于我这种从java 1.7用到java 1.6的老家伙来说,太不友好了,我全给你改成不用lambda表达式的写法。欸嘿