SpringSecurity 实现token 认证
实现token 认证
·
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
// 由于过滤器 比 servelt 先加载 在这里注入一下 负责 TokenAuthenticationTokenFilter 中redisuntity
@Bean
public TokenAuthenticationTokenFilter getTokenFiter(){
return new TokenAuthenticationTokenFilter();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//http.addFilterBefore(new VerCodeFi lter("/Login/Login"), UsernamePasswordAuthenticationFilter.class);
http.addFilterBefore(getTokenFiter(), UsernamePasswordAuthenticationFilter.class);
http
.authorizeRequests()
.antMatchers("/Login/**").permitAll() // 放行Login
.anyRequest().authenticated() // 所有请求都需要验证
.and()
.formLogin() // 使用默认的登录页面
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.csrf().disable();// post请求要关闭csrf验证,不然访问报错;实际开发中开启,需要前端配合传递其他参数
}
}
public class TokenAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private RedisUtils redisUtils;
public TokenAuthenticationTokenFilter(){
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//1、获取请求头携带的token
String token = request.getHeader("token");
if(!StringUtils.hasText(token)){
//不需要token的路由可以直接放行
filterChain.doFilter(request,response);
return;
}
Object o =redisUtils.get(token);
if (o==null){
response.setStatus(200);
response.setCharacterEncoding("utf-8");
response.getWriter().write(JSON.toJSONString(Result.failed(401,"token 非法","")));
return;
}
Map<String,String> maps=new HashMap<>();
Map Values = JSON.parseObject(o.toString(), maps.getClass());
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(Values.get("role").toString()));
UsernamePasswordAuthenticationToken authenticationToken=new UsernamePasswordAuthenticationToken(new Userdto(), null, authorities);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request,response); //放行
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)