提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
使用Spring Security lambda DSL和方法来定义我们的授权规则。如果您是lambda DSL的新手,您可以在authorizeHttpRequests
这篇博客文章.
如果您想了解更多关于我们为什么选择使用,您可以查看authorizeHttpRequests
参考文档.
在Spring Security5.4中是通过创建Bean进行配置的能力。HttpSecuritySecurityFilterChain
下面是使用 HTTP Basic 保护所有终结点的示例配置:WebSecurityConfigurerAdapter
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
但是在新版中官方建议方法是注册一个bean:SecurityFilterChain
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
在Spring Security5.4中的 WebSecurityCustomizer
是一个回调接口,可用于自定义 WebSecurityCustomizer
和 WebSecurity
下面是一个使用 的示例配置,该配置忽略匹配或的请求,列如:WebSecurityConfigurerAdapter/ignore1/ignore2
这样的路径
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/ignore1", "/ignore2");
}
}
但是在新版中官方建议方法是使用新的 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();
}
}
在Spring Security5.4中的是使用嵌入的 配置示例,该嵌入使用默认架构初始化并具有单个用户:WebSecurityConfigurerAdapterDataSource
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.build();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
auth.jdbcAuthentication()
.withDefaultSchema()
.dataSource(dataSource())
.withUser(user);
}
}
在新版中执行此操作的推荐方法是注册一个 Bean : JdbcUserDetailsManager
@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;
}
}
注意:在这些示例中,我们使用该方法以提高可读性。它不适用于生产环境,相反,我们建议在外部散列密码。
执行此操作的一种方法是使用 Spring Boot CLI
,如 User.withDefaultPasswordEncoder()
如果不清楚的小伙伴可以此参考文档
之前我们在配置具有单个用户的内存中用户存储的示例配置 :WebSecurityConfigurerAdapter
代码如下:
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
auth.inMemoryAuthentication()
.withUser(user);
}
}
在新本中执行此操作的推荐方法是注册 Bean:InMemoryUserDetailsManager
@Configuration
public class SecurityConfiguration {
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
注意:在这些示例中,我们使用该方法以提高可读性。它不适用于生产环境,相反,我们建议在外部散列密码。执行此操作的一种方法是使用 Spring Boot CLI,如User.withDefaultPasswordEncoder()参考文档.
要创建可用于整个应用程序的 ,您只需将 注册为 AuthenticationManager AuthenticationManager
@Bean
这种类型的配置如上所示LDAP 身份验证示例.
在春季安全5.6我们介绍方法authenticationManager
将覆盖特定 .
下面是将自定义设置为默认值的示例配置:AuthenticationManager
SecurityFilterChain
AuthenticationManager
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults())
.authenticationManager(new CustomAuthenticationManager());
return http.build();
}
}
本地可以在AuthenticationManager
自定义 DSL.这实际上是Spring Security内部实现的方法,例如.HttpSecurity.authorizeRequests()
public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl, HttpSecurity> {
@Override
public void configure(HttpSecurity http) throws Exception {
AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
http.addFilter(new CustomFilter(authenticationManager));
}
public static MyCustomDsl customDsl() {
return new MyCustomDsl();
}
}
然后,可以在构建时应用自定义 DSL:SecurityFilterChain
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// ...
http.apply(customDsl());
return http.build();
}
通过对Spring Security 新版本与旧版本的对比可以看到,大多数以往的接口现在都注册成Bean进行调用。
地址:https://spring.io/projects/spring-security