在Spring Security 5.7.0-M2版本,官方把WebSecurityConfigurerAdapter
这个抽象类过时了。并鼓励大家使用基于组件的安全配置实现。
为了帮助用户过渡到这种新的配置方式,官方编制了一份常见用例列表和建议的替代方案:官方博客。
一、WebSecurityConfigurerAdapter作用
在使用新的实现前,先理解一下原来WebSecurityConfigurerAdapter作用。WebSecurityConfigurerAdapter是一个抽象类,它实现了默认的认证和授权。允许用户自定义一个WebSecurity类,重写其中的三个configure来实现自定义的认证和授权,这三个configure分别是:
/**
* 自定义身份认证的逻辑
*
* @param auth
* @throws Exception
*/
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
}
/**
* 自定义全局安全过滤的逻辑
*
* @param web
* @throws Exception
*/
public void configure(WebSecurity web) throws Exception {
}
/**
* 自定义URL访问权限的逻辑
*
* @param http
* @throws Exception
*/
protected void configure(HttpSecurity http) throws Exception {
}
二、基于组件的安全配置实现
2.1 HttpSecurity
在Spring Security 5.4及以后的版本,可以通过创建一个SecurityFilterChain Bean来配置HttpSecurity:
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
2.2 WebSecurity
可以通过创建一个WebSecurityCustomizer Bean来配置WebSecurity(WebSecurityCustomizer 是一个回调接口,可用于自定义WebSecurity):
@Configuration
public class SecurityConfiguration {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
}
}
2.3 AuthenticationManagerBuilder
在认证管理器AuthenticationManagerBuilder的配置方式,针对不同的实现,有不同的配置。
LDAP身份认证
@Configuration
public class SecurityConfiguration {
@Bean
public EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean() {
EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean =
EmbeddedLdapServerContextSourceFactoryBean.fromEmbeddedLdapServer();
contextSourceFactoryBean.setPort(0);
return contextSourceFactoryBean;
}
@Bean
AuthenticationManager ldapAuthenticationManager(
BaseLdapPathContextSource contextSource) {
LdapBindAuthenticationManagerFactory factory =
new LdapBindAuthenticationManagerFactory(contextSource);
factory.setUserDnPatterns("uid={0},ou=people");
factory.setUserDetailsContextMapper(new PersonContextMapper());
return factory.createAuthenticationManager();
}
}
JDBC身份认证
@Configuration
public class SecurityConfiguration {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
.build();
}
@Bean
public UserDetailsManager users(DataSource dataSource) {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
users.createUser(user);
return users;
}
}
内存认证
@Configuration
public class SecurityConfiguration {
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
参考:
- SpringBoot – WebSecurityConfigurerAdapter的作用是什么?;
- Spring Security without the WebSecurityConfigurerAdapter;
- SpringSecurity – WebSecurityConfigurerAdapter 过时问题;
最新评论
我的是ipv4网络,如何使用直播源啊!
我今天试了,不想啊,我的是新疆昌吉移动的网络。
收不到验证码电报
现在充值29起了