security5 版本修改了以前默认的basic认证方式,把它改成了表单的认证方式。
spring security的基本原理
security我把它理解成一组过滤器链,用户可以根据不同的需求配置绿色的filter,如UsernamePasswordAuthenticationFilter用于表单登录的filter,BasicAuthenticationFilter用户http basic 认证的filter。剩下的多个filter用户是无法配置,也无法改变其顺序。
FilterSecurityInterceptor是整个security过滤器链的最后一环,它决定你当前的请求是否经过了前面绿色filter的认证,通过了就可以访问后面rest服务,不能则抛出相关异常。
ExceptionTranslationFilter用来处理FilterSecurityInterceptor抛出的异常,引导用户进行下一步处理。当然们security不仅仅只有这三种过滤器。
自定义用户认证逻辑
1.处理用户信息获取逻辑
实现UserDetailsService接口,实现loadUserByUsername(String s) 方法。在方法中编写自己的业务逻辑
public UserDetails loadUserByUsername(String s)throws UsernameNotFoundException {
log.info("登录的用户名 " + s);
return new User(s,"1234", AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
UserDetails 封装了security登录时候用到的所有信息,如权限,密码,用户名
boolean isAccountNonExpired() 账户没有过期,boolean isCredentialsNonExpired() 密码是否过期。
boolean isAccountNonLocked() 账户是否锁定(冻结),boolean isEnabled() 账户是否可用(删除)等信息
2.处理加密解密
security5中你必须给项目配置一个PasswordEncoder,否则会报 There is no PasswordEncoder mapped for the id "null"。
如果你不想配置 可以添加,当然这个方法已经过期了,建议安全还是配置PasswordEncoder
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
实际开发中,密码不可能明文存在数据库中,这时要用到PasswordEncoder接口
String encode(CharSequence var1) 这个方法是用来密码加密,这个方法是用户注册的时候我们调用,对密码进行加密,存库。
boolean matches(CharSequence var1, String var2) 加密后的代码和用户传入的密码是否匹配
@Override
protected void configure(AuthenticationManagerBuilder auth)throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder(){
return new Md5PasswordEncoder();
}
推荐使用 BCryptPasswordEncoder(),好处即使 相同密码 加密后的字符串 也是不同的 。