spring security 学习一

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容