spring security 学习一

security5 版本修改了以前默认的basic认证方式,把它改成了表单的认证方式。

spring security的基本原理

security我把它理解成一组过滤器链,用户可以根据不同的需求配置绿色的filter,如UsernamePasswordAuthenticationFilter用于表单登录的filter,BasicAuthenticationFilter用户http basic 认证的filter。剩下的多个filter用户是无法配置,也无法改变其顺序。

FilterSecurityInterceptor是整个security过滤器链的最后一环,它决定你当前的请求是否经过了前面绿色filter的认证,通过了就可以访问后面rest服务,不能则抛出相关异常。

ExceptionTranslationFilter用来处理FilterSecurityInterceptor抛出的异常,引导用户进行下一步处理。当然们security不仅仅只有这三种过滤器。

spring security 学习一_第1张图片

自定义用户认证逻辑

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(),好处即使 相同密码 加密后的字符串 也是不同的 。

你可能感兴趣的:(spring security 学习一)