(Web 安全配置适配器) security.config.annotation.web.configuration.WebS ...

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724


WebSecurityConfigurerAdapter 是 Spring Security 中的一个适配器类,专门用于资助开辟者配置 Web 应用的安全设置。它是一个方便的抽象类,允许我们通过继承它并重写其方法,来定制应用的安全行为,比如配置认证和授权规则、处理用户会话管理、跨站请求伪造 (CSRF) 防护等。
在 Spring Security 5.7 版本后,WebSecurityConfigurerAdapter 已被标记为逾期,推荐使用新的配置方式。
使用 WebSecurityConfigurerAdapter

开辟者可以通过继承 WebSecurityConfigurerAdapter 并重写其配置方法来自定义安全计谋:


  • 重写 configure(HttpSecurity http) 方法:用于配置请求的授权规则和安全过滤器链。
  • 重写 configure(AuthenticationManagerBuilder auth) 方法:用于配置认证方式,比如基于内存的用户、数据库认证、LDAP 认证等。
示例

以下是一个 WebSecurityConfigurerAdapter 的简朴示例:
  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  3. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  4. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  5. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  6. @Configuration
  7. @EnableWebSecurity
  8. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  9.     @Override
  10.     protected void configure(HttpSecurity http) throws Exception {
  11.         http
  12.             .authorizeRequests()
  13.                 .antMatchers("/public/**").permitAll() // 允许公开访问的路径
  14.                 .anyRequest().authenticated()         // 其他请求需要认证
  15.             .and()
  16.             .formLogin()                              // 启用表单登录
  17.                 .loginPage("/login")                  // 自定义登录页面
  18.                 .permitAll()
  19.             .and()
  20.             .logout()                                 // 启用注销
  21.                 .permitAll();
  22.     }
  23.     @Override
  24.     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  25.         auth.inMemoryAuthentication()
  26.             .withUser("user").password("{noop}password").roles("USER")
  27.             .and()
  28.             .withUser("admin").password("{noop}admin").roles("ADMIN");
  29.     }
  30. }
复制代码
Spring Security 5.7 之后的推荐替代方法

在 Spring Security 5.7 及之后,WebSecurityConfigurerAdapter 被弃用,推荐使用 SecurityFilterChainAuthenticationManager 的配置方式:
  1. @Configuration
  2. public class SecurityConfig {
  3.     @Bean
  4.     public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  5.         http
  6.             .authorizeRequests()
  7.                 .antMatchers("/public/**").permitAll()
  8.                 .anyRequest().authenticated()
  9.             .and()
  10.             .formLogin()
  11.                 .loginPage("/login")
  12.                 .permitAll()
  13.             .and()
  14.             .logout()
  15.                 .permitAll();
  16.         
  17.         return http.build();
  18.     }
  19.     @Bean
  20.     public InMemoryUserDetailsManager userDetailsService() {
  21.         UserDetails user = User.withDefaultPasswordEncoder()
  22.             .username("user")
  23.             .password("password")
  24.             .roles("USER")
  25.             .build();
  26.         UserDetails admin = User.withDefaultPasswordEncoder()
  27.             .username("admin")
  28.             .password("admin")
  29.             .roles("ADMIN")
  30.             .build();
  31.         return new InMemoryUserDetailsManager(user, admin);
  32.     }
  33. }
复制代码
总结

WebSecurityConfigurerAdapter 是用于配置 Spring Security 的一个便利适配器类,固然已在新版本中被替代,但它在旧版本中是主要的安全配置方式。通过新方法,开辟者可以更灵活、模块化地管理 Web 应用的安全配置。
是的,你在 WebSecurityConfig 类中配置了 Spring Security,确保 MyAuthenticationProvider 和 PhoneAuthenticationProvider 被正确注册为认证提供者,并且自定义的认证过滤器也被添加到了过滤器链中。下面是对你的配置文件的详细表明:
WebSecurityConfig.java

  1. package com.productQualification.api.config;
  2. import com.productQualification.api.filter.PhoneNumAuthenticationFilter;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.security.authentication.AuthenticationManager;
  8. import org.springframework.security.authentication.ProviderManager;
  9. import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
  10. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  11. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  12. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  13. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  14. import org.springframework.web.cors.CorsConfiguration;
  15. import java.util.Arrays;
  16. /**
  17. * @author William Guo
  18. */
  19. @Configuration
  20. @EnableWebSecurity
  21. @EnableGlobalMethodSecurity(prePostEnabled = true)
  22. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  23.     @Autowired
  24.     private MyAuthenticationProvider myAuthenticationProvider;
  25.     @Autowired
  26.     private MyAuthenticationFailHandler myAuthenticationFailHandler;
  27.     @Autowired
  28.     private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;
  29.     @Autowired
  30.     private PhoneAuthenticationProvider phoneAuthenticationProvider;
  31.     @Value("${spring.profiles}")
  32.     private String profiles;
  33.     @Bean
  34.     public PhoneNumAuthenticationFilter phoneNumAuthenticationFilter() throws Exception {
  35.         PhoneNumAuthenticationFilter filter = new PhoneNumAuthenticationFilter();
  36.         filter.setAuthenticationManager(authenticationManagerBean()); // 设置认证管理器
  37.         filter.setAuthenticationSuccessHandler(myAuthenticationSuccessHandler); // 设置登录成功处理器
  38.         filter.setAuthenticationFailureHandler(myAuthenticationFailHandler); // 设置登录失败处理器
  39.         filter.setFilterProcessesUrl("/admin/signInByPhone"); // 设置处理的URL
  40.         return filter;
  41.     }
  42.     @Bean
  43.     public UsernamePasswordAuthenticationFilter myUsernamePasswordAuthenticationFilter() throws Exception {
  44.         UsernamePasswordAuthenticationFilter filter = new UsernamePasswordAuthenticationFilter();
  45.         filter.setAuthenticationManager(authenticationManagerBean()); // 设置认证管理器
  46.         filter.setAuthenticationSuccessHandler(myAuthenticationSuccessHandler); // 设置登录成功处理器
  47.         filter.setAuthenticationFailureHandler(myAuthenticationFailHandler); // 设置登录失败处理器
  48.         filter.setFilterProcessesUrl("/admin/signIn"); // 设置处理的URL
  49.         return filter;
  50.     }
  51.     @Override
  52.     protected void configure(HttpSecurity http) throws Exception {
  53.         // 关闭csrf
  54.         http.csrf().disable();
  55.         // 开启cors跨域支持
  56.         http.cors().configurationSource(request -> {
  57.             CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues();
  58.             corsConfiguration.addAllowedMethod(CorsConfiguration.ALL); // 允许所有方法
  59.             corsConfiguration.setAllowCredentials(true); // 允许携带cookie
  60.             if ("prod".equals(profiles)) {
  61.                 corsConfiguration.addAllowedOrigin("https://www.crossbiog.com");
  62.                 corsConfiguration.addAllowedOrigin("http://www.crossbiog.com");
  63.                 corsConfiguration.addAllowedOrigin("https://crossbiog.com");
  64.                 corsConfiguration.addAllowedOrigin("http://crossbiog.com");
  65.                 corsConfiguration.addAllowedOrigin("https://kxlist.cn");
  66.                 corsConfiguration.addAllowedOrigin("https://www.kxlist.cn");
  67.             }
  68.             return corsConfiguration;
  69.         });
  70.         http.authorizeRequests()
  71.                 .anyRequest().permitAll() // 允许所有请求
  72. //                .and().formLogin().loginPage("/admin/signIn").defaultSuccessUrl("/admin/signInSuccess")
  73. //                .failureHandler(myAuthenticationFailHandler)
  74. //                .antMatchers(HttpMethod.GET, "/admin/signIn")
  75. //                .permitAll()
  76. //                .antMatchers(HttpMethod.POST, "/admin")
  77. //                .permitAll()
  78. //                // swagger
  79. //                .antMatchers(HttpMethod.GET, "/v2/api-docs", "/swagger-resources/**", "/webjars/**", "/swagger-ui.html")
  80. //                .permitAll()
  81. //                .anyRequest()
  82. //                .authenticated()
  83. //                .and()
  84. //                .sessionManagement()
  85. //                .and()
  86. //                .httpBasic();
  87.         ;
  88.         // 把账户密码验证过滤器加到拦截器链中
  89.         http.addFilterAt(myUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
  90.                 .authenticationProvider(myAuthenticationProvider); // 注册账户密码验证提供者
  91.         // 把手机号认证过滤器加到拦截器链中
  92.         http.addFilterAfter(phoneNumAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
  93.                 .authenticationProvider(phoneAuthenticationProvider); // 注册手机号验证提供者
  94.     }
  95.     @Override
  96.     protected AuthenticationManager authenticationManager() {
  97.         ProviderManager authenticationManager = new ProviderManager(Arrays.asList(phoneAuthenticationProvider));
  98.         // 不擦除认证密码,擦除会导致TokenBasedRememberMeServices因为找不到Credentials再调用UserDetailsService而抛出UsernameNotFoundException
  99.         authenticationManager.setEraseCredentialsAfterAuthentication(false);
  100.         return authenticationManager;
  101.     }
  102. }
复制代码
表明


  • 注解

    • @Configuration:标记该类为配置类。
    • @EnableWebSecurity:启用 Spring Security 的 Web 安全支持。
    • @EnableGlobalMethodSecurity(prePostEnabled = true):启用全局方法安全,支持 @PreAuthorize 和 @PostAuthorize 注解。

  • 注入依赖

    • @Autowired:注入 MyAuthenticationProvider、MyAuthenticationFailHandler、MyAuthenticationSuccessHandler 和 PhoneAuthenticationProvider。

  • 配置 CORS

    • http.cors().configurationSource(...):配置 CORS 支持,允许特定的域名访问。

  • 关闭 CSRF

    • http.csrf().disable():关闭 CSRF 保护,适用于不需要 CSRF 保护的场景。

  • 配置 HTTP 安全

    • http.authorizeRequests().anyRequest().permitAll():允许所有请求,可以根据需要进行更细粒度的权限控制。
    • http.addFilterAt(...):将 UsernamePasswordAuthenticationFilter 添加到过滤器链中,并注册 MyAuthenticationProvider。
    • http.addFilterAfter(...):将 PhoneNumAuthenticationFilter 添加到过滤器链中,并注册 PhoneAuthenticationProvider。

  • 配置认证管理器

    • authenticationManager():重写 authenticationManager 方法,创建一个 ProviderManager 并注册 PhoneAuthenticationProvider。设置 setEraseCredentialsAfterAuthentication(false) 以防止擦除认证密码。

总结

通过上述配置,Spring Security 会在用户尝试登录时调用 MyAuthenticationProvider 或 PhoneAuthenticationProvider 进行认证。确保你的 WebSecurityConfig 类正确配置了认证提供者和自定义的认证过滤器,如许在用户登录时,程序一定会颠末这些类。
希望这些表明能资助你更好地明确和配置 Spring Security。如果有任何其他问题或需要进一步的资助,请随时提问。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表