spring sercurity 基础

基本原理

一系列的过滤器组成的链路.如下图:

SpringSercurity基本原理-LMLPHP


FilterSercurityInterceptor就是spring security处理鉴权的入口,在访问REST api 前都会经过这个过滤器,如果通过了鉴权才会跳转到对应api的入口

SpringSercurity基本原理-LMLPHP

下面来分析在默认开启spring security的情况下各种场景的一些执行路径,通过流程图展示出来;

对应操作: 打断点在FilterSecurityInterceptor.doFilter()上,即可追踪其执行路径

SpringSercurity基本原理-LMLPHP


自定义用户认证逻辑

自定义认证配置信息:

需要继承WebSecurityConfigurerAdapter,并重写其configure()方法.

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 说明: 重写security的配置方法
     * @author suwenguang
     * @date 2019/6/7
     * @return void <- 返回类型
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //配置
        http.formLogin()
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated();
    }
}

处理用户信息获取逻辑--UserDetailsService

@Component
@Slf4j
public class UserCertificationService implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        log.info("用户名:{}", username);
        log.info("密码:{}",passwordEncoder.encode("123456"));
        //根据username到数据库获取用户信息
        return new User(username, passwordEncoder.encode("123456")
                ,true,true,true,true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,user"));
    }
}

处理用户校验逻辑--UserDetails

UserDetails是个接口,可以实现等方式创建自己系统的子类,以达到扩展的效果.当然也可以使用自带的.org.springframework.security.core.userdetails.User

UserDetails内部提供如下的四种状态

  • 账号是否已过期 isAccountNonExpired
  • 账号是否锁定 isAccountNonLocked
  • 密码是否已过期 isCredentialsNonExpired
  • 账号是否启用 isCredentialsNonExpired

SpringSercurity基本原理-LMLPHP

处理密码加密解密--PasswordEncoder

配置一个PasswordEncoder

@Configuration
public class PasswordEncoderConfig {
    /**
     * 说明: 注入一个明文密码的加解密
     * @author suwenguang
     * @date 2019/6/7
     * @return org.springframework.security.crypto.password.PasswordEncoder <- 返回类型
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

个性化用户认证流程

自定义登录界面

自定义登录成功处理

自定义登录失败处理

06-08 04:23