SpringSecurity介绍

一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对访问权限进行控制嘛),应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。   spring security的主要核心功能为 认证和授权,所有的架构也是基于这两个核心功能去实现的。

SpringSecurity原理

众所周知 想要对对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP。所以springSecurity在我们进行用户认证以及授予权限的时候,通过各种各样的拦截器来控制权限的访问,从而实现安全。 以下为其主要的过滤器:

 	1. WebAsyncManagerIntegrationFilter 
        2. SecurityContextPersistenceFilter 
        3. HeaderWriterFilter 
        4. CorsFilter 
        5. LogoutFilter
        6. RequestCacheAwareFilter
        7. SecurityContextHolderAwareRequestFilter
        8. AnonymousAuthenticationFilter
        9. SessionManagementFilter
        10.ExceptionTranslationFilter
        11.FilterSecurityInterceptor
        12.UsernamePasswordAuthenticationFilter
        13.BasicAuthenticationFilter

SpringSecurity的核心组件


	1. SecurityContextHolder:提供对SecurityContext的访问
      	2. SecurityContext,:持有Authentication对象和其他可能需要的信息
      	3. AuthenticationManager 其中可以包含多个AuthenticationProvider
      	4. ProviderManager对象为AuthenticationManager接口的实现类
      	5. AuthenticationProvider 主要用来进行认证操作的类 调用其中的authenticate()方法去进行认证操作
      	6. Authentication:Spring Security方式的认证主体
      	7. GrantedAuthority:对认证主题的应用层面的授权,含当前用户的权限信息,通常使用角色表示
     	8. UserDetails:构建Authentication对象必须的信息,可以自定义,可能需要访问DB得到
      	9. UserDetailsService:通过username构建UserDetails对象,通过loadUserByUsername根据userName获取UserDetail对象 (可以在这里基于自身业务进行自定义的实现  如通过数据库,xml,缓存获取等)  

结合Springboot自定义安全配置

starter:

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>	

自定义一个配置类,继承WebSecurityConfigurerAdapter,重写参数为HttpSecurity的configure方法

/**
 * @ClassName WebSecurityConfig
 * @Description
 * @Author guofeiyang
 * @Date 2019/09/05 周四 21:05
 */
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    //登录成功处理器
    private final RabbitAuthenticationSuccessHandler rabbitAuthenticationSuccessHandler;

    //登录失败处理器
    private final RabbitAuthenticationFailureHandler rabbitAuthenticationFailureHandler;

    public WebSecurityConfig(RabbitAuthenticationSuccessHandler rabbitAuthenticationSuccessHandler, RabbitAuthenticationFailureHandler rabbitAuthenticationFailureHandler) {
        this.rabbitAuthenticationSuccessHandler = rabbitAuthenticationSuccessHandler;
        this.rabbitAuthenticationFailureHandler = rabbitAuthenticationFailureHandler;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests().requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/css/**").permitAll()
                .antMatchers("/js/**").permitAll()
                //.antMatchers("/logout").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .successHandler(rabbitAuthenticationSuccessHandler)
                .failureHandler(rabbitAuthenticationFailureHandler)
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .and()
            .csrf()
                .disable()
            .cors();//开启跨域

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(rabbitUserDetailsService()).passwordEncoder(passwordEncoder());
    }

    @Bean
    public RabbitUserDetailsService rabbitUserDetailsService(){
        return new RabbitUserDetailsService();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

未完待续