广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter
  • 463
分享到

Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter

springjavaspringboot后端 2023-08-20 06:08:26 463人浏览 薄情痞子
摘要

文章目录 Spring Security 弃用 WebSecurityConfigurerAdapter官网博客说明配置HttpSecurity配置WebSecurityLDAP认证JDBC认证内存内认证全局认证管理器局部认证管理器

spring Security 弃用 WEBSecurityConfigurerAdapter

官网博客说明

官网博客链接地址:https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

Spring Security 5.7.0-M2,我们弃用了 WebSecurityConfigurerAdapter ,因为我们鼓励用户转向使用基于组件的安全配置。

为了帮助大家熟悉这种新的配置风格,我们编制了一份常见用例表和推荐的新写法。

在下面的例子中,我们遵循最佳实践——使用 Spring Security lambda 领域专用语言(DSL)和 httpsecurity#authorizeHttpRequests 方法来定义我们的授权规则。如果你对lambda领域专用语言(DSL)不熟悉,你可以在这篇博客了解它。如果你想知道为什么我们选择选择使用 HttpSecurity#authorizeHttpRequests ,你可以看这篇 参考文档

配置HttpSecurity

在Spring Security 5.4,我们介绍了创建一个SecurityFilterChain bean来配置HttpSecurity的功能。

下面是一个使用WebSecurityConfigurerAdapter和HTTP Basic保护所有端点的示例配置:

@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) throws Exception {        http            .authorizeHttpRequests((authz) -> authz                .anyRequest().authenticated()            )            .httpBasic(withDefaults());    }}

往后,我们建议注册一个SecurityFilterChain bean来做这件事:

@Configurationpublic class SecurityConfiguration {    @Bean    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {        http            .authorizeHttpRequests((authz) -> authz                .anyRequest().authenticated()            )            .httpBasic(withDefaults());        return http.build();    }}

配置WebSecurity

在Spring Security 5.4中,我们还引入WebSecurityCustomizer

WebSecurityCustomizer是一个回调接口,可以用来定制WebSecurity

下面是一个使用WebSecurityConfigurerAdapter忽略匹配/ignore1/ignore2的请求的示例配置:

@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter {    @Override    public void configure(WebSecurity web) {        web.ignoring().antMatchers("/ignore1", "/ignore2");    }}

往后,我们建议注册一个WebSecurityCustomizer bean来做这件事:

@Configurationpublic class SecurityConfiguration {    @Bean    public WebSecurityCustomizer webSecurityCustomizer() {        return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");    }}

警告:如果你正在配置WebSecurity来忽略请求,建议你改为在HttpSecurity#authorizeHttpRequests内使用permitAll。想了解更多请参考configure Javadoc

LDAP认证

在Spring Security 5.7,我们引入EmbeddedLdapServerContextSourceFactoryBeanLdapBindAuthenticationManagerFactoryLdapPassWordComparisonAuthenticationManagerFactory,这些类都可以用来创建一个嵌入式的LDAP服务器;并且我们还引入一个AuthenticationManager类,它可以用来执行LDAP认证。

下面是一个使用是一个使用绑定验证的示例配置,它使用了WebSecurityConfigurerAdapter创建嵌入式LDAP服务器并且使用AuthenticationManager执行LDAP认证:

@Configurationpublic class SecurityConfiguration extends WebSecurityConfigurerAdapter {    @Override    protected void configure(AuthenticationManagerBuilder auth) throws Exception {        auth            .ldapAuthentication()            .userDetailsContextMapper(new PersonContextMapper())            .userDnPatterns("uid={0},ou=people")            .contextSource()            .port(0);    }}

往后,我们建议使用新的LDAP类来做这件事:

@Configurationpublic 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认证

下面是一个示例配置,它在WebSecurityConfigurerAdapter内创建了一个使用默认模式初始化并且只有一个用户的内嵌DataSource

@Configurationpublic 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);    }}

推荐的做法是创建一个JdbcUserDetailsManager bean来做这件事:

@Configurationpublic 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;    }}

注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswordEncoder()。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。

内存内认证

下面是一个示例配置,它在WebSecurityConfigurerAdapter配置了一个只存有一个用户的内存内用户:

@Configurationpublic 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);    }}

我们建议注册一个InMemoryUserDetailsManager bean来做这件事:

@Configurationpublic class SecurityConfiguration {    @Bean    public InMemoryUserDetailsManager userDetailsService() {        UserDetails user = User.withDefaultPasswordEncoder()            .username("user")            .password("password")            .roles("USER")            .build();        return new InMemoryUserDetailsManager(user);    }}

注意:在这些例子中,我们为了可读性使用了User.withDefaultPasswordEncoder()。这不适合生产项目,我们建议在生产项目中使用散列密码。请按照参考文档所说的用Spring Boot命令行工具来做。

全局认证管理器

要创建一个整个应用都可以使用的AuthenticationManager,只需要使用@BeanAuthenticationManager注册为bean就可以了。

这种配置已经在上面的LDAP认证示例展示过了。

局部认证管理器

在Spring Security 5.6中,我们引入HttpSecurity#authenticationManager方法,这个方法可以为特定的SecurityFilterChain覆盖默认的AuthenticationManager

下面是一个示例配置,它设置了一个自定义的AuthenticationManager

@Configurationpublic class SecurityConfiguration {    @Bean    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {        http            .authorizeHttpRequests((authz) -> authz                .anyRequest().authenticated()            )            .httpBasic(withDefaults())            .authenticationManager(new CustomAuthenticationManager());        return http.build();    }}

访问局部认证管理器

可以使用自定义领域专用语言(DSL)访问局部AuthenticationManager。这实际上是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();    }}

然后,在构建SecurityFilterChain时可以应用自定义领域专用语言(DSL):

@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {    // ...    http.apply(customDsl());    return http.build();}

欢迎加入

我们很高兴与您分享这些更新,我们期待通过您的反馈进一步增强 Spring 安全性!如果你有兴趣贡献,你可以在GitHub上找到我们。

引用

https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

来源地址:https://blog.csdn.net/OLinOne/article/details/128100367

--结束END--

本文标题: Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter

本文链接: https://www.lsjlt.com/news/376175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作