spring security使用他原本的整个框架,只修改两个位置:
1、在UsernamePasswordAuthenticationFilter前加入了一个自定义的filter,如果用户带了token来进行访问则——进行jwt拦截校验;如果没有则放行,dofilterchain(res,req),因为后面如果还是未登录状态,authenticed:false,就会被后面的拦截器,把请求返回的资源拦截。
2、重写UserDetailsService方法里的loadUserByUsername方法,实现从数据库中查找数据,原来框架默认方法是从内存InMemory里查找。
3、上面两个方法实现后接下里就是把内容配置到securityConfig里,并且自定义登录逻辑。将用户输入封装、然后调用authenticationManager.authenticate()方法进行验证。这个验证没有自定义,用的框架流程,在securityConfig进行了配置。
自定义登录逻辑:
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDB.getUsername(), user.getPassword());
Authentication authenticate = authenticationManager.authenticate(authenticationToken);
securityConfig:
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
//创建BCryptPasswordEncoder注入容器
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
//用户认证 在登录controller里需要使用,用Bean注解,将接口暴露出来
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
下面一定要过一遍的是authenticationManager.authenticate()的父框架验证流程