spring sercurity 基础
基本原理
一系列的过滤器组成的链路.如下图:
FilterSercurityInterceptor就是spring security处理鉴权的入口,在访问REST api 前都会经过这个过滤器,如果通过了鉴权才会跳转到对应api的入口
下面来分析在默认开启spring security的情况下各种场景的一些执行路径,通过流程图展示出来;
对应操作: 打断点在FilterSecurityInterceptor.doFilter()上,即可追踪其执行路径
自定义用户认证逻辑
自定义认证配置信息:
需要继承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
处理密码加密解密--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();
}
}
个性化用户认证流程
自定义登录界面
自定义登录成功处理
自定义登录失败处理