认证授权原理
Spring Security核心就是一系列的过滤器链,当一个请求来的时候,首先要通过filer chains 的校验,每种校验方式 Spring security 都提供了对应的 filter,校验通过之后才会访问用户各种信息。
发送一个 request 时:
- 进入到
UsernamePasswordAuthenticationFilter
这个 filter 中,判断是否时表单认证,如果是则会进行校验,并做相应的标志 - 进入到
basicAuthenticationFilter
这个 filter 中,判断是否是 basic 的认证方式,如果是则会进行校验并做相应的标志 - 经过一系列其他的 filter ,比如 authorization ...
- 进入到
FilterSecurityInterceptor
这个 filter,校验用户是否有认证成功/认证成功后是否有相应的权限,如果没有则会进入到ExceptionTranslationFilter
中转换成相应的 exception 并返回;如果校验成功,则会访问 request
自定义认证逻辑
用户信息获取及校验逻辑
- 自定义获取用户的逻辑,实现
UserDetailsService
接口,并实现loadUserByUsername
接口;
@Component
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = new UserInfo();// 可以从数据库中根据 username 获取用户信息以及对应的权限
return userInfo;
}
}
- 其中需要返回一个
UserDetails
的实例,我们可以直接返回一个 Spring security 提供好的一个实例org.springframework.security.core.userdetails.User
, 也可以实现UserDetails
接口自定义一个UserDetails
实例。
public class UserInfo implements UserDetails{
private Long id;
private String name;
private String username;
private String password;
private String email;
private boolean isAccountNonExpired = true;
private boolean isAccountNonLocked = true;
private boolean isCredentialsNonExpired = true;
private boolean isEnabled = true;
}
处理密码加密逻辑
Spring Security 提供了几种默认的加密方法,比如:MD5,盐... ,我们也可以通过实现PasswordEncoder
接口并实现 encode
和 matches
方法来自定义一个加密方式。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
...
}
网友评论