spring security配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyAuthenticationSuccessHandler authenticationSuccessHandler;

    @Autowired
    private MyAuthenticationFailureHandler authenticationFailureHandler;

    @Autowired
    private MyLogoutSuccessHandler logoutSuccessHandler;

    @Autowired
    private TokenAuthenticationFilter tokenAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.headers().contentSecurityPolicy("script-src 'self'");

        http.formLogin()
                .and()
                .logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler)
                .and()
                .authorizeRequests()
                .antMatchers("/login", "/captcha", "/demo/**").permitAll()
                .antMatchers("/doc.html", "/swagger-resources/**", "/*/api-docs/**", "/webjars/**", "/favicon.ico").permitAll()
                .anyRequest().authenticated()
                .and()
                .exceptionHandling()
                .accessDeniedHandler(new MyAccessDeniedHandler())
                .authenticationEntryPoint(new MyAuthenticationEntryPoint())
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
                //.maximumSessions(1)
                //.maxSessionsPreventsLogin(false);

        http.addFilterAt(userAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
                .addFilterBefore(tokenAuthenticationFilter, UserAuthenticationFilter.class);

        http.csrf().disable();
    }

    @Bean
    protected UserAuthenticationFilter userAuthenticationFilter() throws Exception {

        UserAuthenticationFilter filter = new UserAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManagerBean());
//setAuthenticationManager()方法用于设置认证管理器(AuthenticationManager)。 //authenticationManagerBean()是一个由Spring Security自动生成的方法,用于获取全局的 
//AuthenticationManager实例。
        filter.setAuthenticationSuccessHandler(authenticationSuccessHandler);
        filter.setAuthenticationFailureHandler(authenticationFailureHandler);
 //这两行代码用于设置认证成功和认证失败的处理器。authenticationSuccessHandler和 
 //authenticationFailureHandler是自定义的认证成功和认证失败处理器,您可以根据实际需求来设置这 
 //两个处理器来处理相应的逻辑。
        return filter;
    }

configure(WebSecurity web)configure(HttpSecurity http)这两个方法在Spring Security中有不同的作用和用途:

  1. configure(WebSecurity web)方法:

    • 这个方法用于配置Spring Security忽略特定的静态资源和路径,例如CSS、JavaScript文件或静态图片等。
    • 它是在较早的安全过滤器链中执行的,用于配置不需要Spring Security进行认证和授权的静态资源路径。
    • 这个方法通常用于配置Web安全性,特别是配置Spring Security的忽略规则。
  2. configure(HttpSecurity http)方法:

    • 这个方法用于配置Spring Security的请求级安全性,定义哪些URL路径需要进行认证和授权,以及定义相关配置和规则。
    • 它是在较后的安全过滤器链中执行的,用于配置具体的请求级别安全策略、添加过滤器、拦截器等。
    • 这个方法通常用于配置HTTP请求的安全性、登录认证、访问控制、表单登录、注销等。

综上所述,configure(WebSecurity web)方法用于配置忽略特定的静态资源和路径,而configure(HttpSecurity http)方法用于配置请求级别的安全性、认证和授权策略。

在一个Spring Security配置类中,configure(WebSecurity web)方法通常在类的开头和configure(HttpSecurity http)方法之前调用,它们具有不同的作用和顺序。需要根据具体的需求配置和调整这两个方法。

当需要配置Spring Security忽略特定的静态资源或路径时,可以使用`configure(WebSecurity web)`方法。下面是一个示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web
            .ignoring()
            .antMatchers("/css/**", "/js/**", "/images/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout()
            .logoutSuccessUrl("/login");
    }

    // 其他配置...
}

在上面的例子中,`configure(WebSecurity web)`方法配置了忽略 `/css/**`, `/js/**`, 和 `/images/**` 这些静态资源路径,这些路径将不会受到Spring Security的保护和认证。

同时,`configure(HttpSecurity http)`方法配置了请求级别的安全性和授权策略,其中 `/admin/**` 路径需要具有 "ADMIN" 角色的用户来访问,`/user/**` 路径需要具有 "ADMIN" 或 "USER" 角色的用户来访问,其余的请求路径需要进行认证,并且使用默认的表单登录方式和注销设置。

请注意,此示例仅用于说明两种方法的区别和用途,并不表示一个完整的配置。具体的配置和规则需要根据您的项目需求进行调整。

你可能感兴趣的:(spring,java,后端)