SpringSecurity的基本原理
SpringSecurity框架作为一款安全框架,可以拦截我们的请求,默认情况下使用的是basic认证的方式,如图一那样。但是,这种方式很不友好,每次的密码都是动态的变化的,无法自定义,我们可以在application.properties配置security.basic.enabled=false进行关闭。但是此时谁都可以访问我们的接口,很不安全。此时可以在在跟包下创建一个BrowswerSecurityConfig类,集成WebSecurityConfiguerAdapter适配器,此时访问就是如图二那样http.formLogin()//表示使用表单登录.and().authorizeRequests()//表示对请求的授权.anyRequest()//对任何请求授权.authenticated();//都需要身份认证
SpringSecurity的原来剖析
SpringSecurity实际上是一系列的过滤器链
1.UsernamepasswordAuthenticationFilter主要负责表单的认证
2.BasicAuthenticationFilter主要负责SpringSecurity默认的basic认证
3.ExceptionTranslationFilter:根据抛出的错误跳转到对应的页面
4.FilterSecurityInterceptor是过滤器类,根据我们的配置是否可以访问后台的接口
自定义用户认证逻辑
1.处理用户信息获取逻辑
要获取用户的信息就需要实现UserDetailsService,并且实现UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;方法
2.处理用户校验逻辑用户的校验可以使用关联我们的数据库,根据数据库的数据来进行校验,校验之后会返回一个UserDtails对象。这个对象类如下:
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
//用户名
String getPassword();
//密码
String getUsername();
//账户是否超时
boolean isAccountNonExpired();
//账户是否被冻结
boolean isAccountNonLocked();
//密码是否失效
boolean isCredentialsNonExpired();
//是否可用
boolean isEnabled();
}
3.处理密码加密解密需要在BrowswerSecurityConfig.java配置passwordEncoder加密器
/**
* 配置密码编码器
* [@return](https://my.oschina.net/u/556800)
*/
[@Bean](https://my.oschina.net/bean)
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
在MyUserDetailsService中的代码如下:
[@Component](https://my.oschina.net/u/3907912)
public class MyUserDetailService implements UserDetailsService {
@Autowired
PasswordEncoder passwordEncoder;
private Logger logger = LoggerFactory.getLogger(MyUserDetailService.class);
[@Override](https://my.oschina.net/u/1162528)
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
logger.info("登录用户名:"+s);
String password = passwordEncoder.encode("123");
logger.info("用户密码:"+password);
return new User(s,password/*"123"*/,
true,true,true,true,
AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}