SpringSecurity 实现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验证,不然访问报错;实际开发中开启,需要前端配合传递其他参数
    }


}
  • 定义token 验证过滤器


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); //放行
    }
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security是一个强大的身份验证和授权框架,在Java应用程序中提供了安全保护。它可以帮助我们实现用户认证和授权的功能。Token认证是一种无状态的认证方式,其中令牌(Token)被用来验证用户身份。 在Spring Security中使用Token认证需要进行以下几个步骤: 1. 自定义UserDetailsService和UserDetails:我们需要实现UserDetailsService接口来自定义用户信息的获取逻辑,并通过实现UserDetails接口来包装用户的详细信息。 2. 集成Spring Security:如果认证服务器除了颁发token还提供一些用户信息相关的接口,我们建议集成Spring Security来实现多角色认证。 3. 定制认证和授权:Spring Security的核心是通过各种Filter来完成认证和授权。因此,我们需要对认证和授权进行定制。对于使用Token认证,整体流程是通过认证生成token并返回给前端,前端请求的header中附带token,资源服务器验证token的有效性并判定其权限,返回请求结果。在资源服务器验证token有效性的步骤中,我们可以根据实际情况进行定制: - 只验证token的有效期和密钥:这种方式不需要向数据库或缓存查询用户名和密码。 - 验证token中的用户是否存在:这种方式需要向数据库或缓存查询用户名。 综上所述,Spring Security和Token认证可以实现身份验证和授权的功能。我们可以通过自定义UserDetailsService和UserDetails来提供用户信息,集成Spring Security来实现多角色认证,通过定制认证和授权来支持Token认证,并根据实际情况选择验证token的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值