Spring secrity 自定义密码验证(结合JWT)

20 篇文章 0 订阅
5 篇文章 0 订阅

        众所周知,在Spring secrity中,密码验证由框架进行,但在实际项目开发中,交给secrity原生处理就显得有点局限了。而我们要做的自定义登录,就要去重写一些内容了。

        首先,继承UsernamePasswordAuthenticationFilter 去重写下方方法,获取自定义登录接口的相关信息,再对用户名和密码处理。

  @Override
    public Authentication attemptAuthentication(HttpServletRequest request,
                                                HttpServletResponse response) throws AuthenticationException {
        // 从输入流中获取到登录的信息

//            UserVerify loginUser = new ObjectMapper().readValue(request.getInputStream(), UserVerify.class);
        String username = request.getParameter("usercode");
        String password = request.getParameter("password");

        return authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(username, password)
        );

        之后,spring会通过你设置的密码加密方式以及loadUserByUsername方法中的逻辑进行验证,再之后的验证成功与否会有不同的处理。

  //登陆成功处理
@Override
    protected void successfulAuthentication(HttpServletRequest request,
                                            HttpServletResponse response,
                                            FilterChain chain,
                                            Authentication authResult) {

        UserVerify jwtUser = (UserVerify) authResult.getPrincipal();
        Integer id = jwtUser.getId();
        String usercode = jwtUser.getUsercode();
        String username = jwtUser.getUsername();
        String password = jwtUser.getPassword();
        String faculty = jwtUser.getFaculty();
        List<GrantedAuthority> authorities = jwtUser.getAuthorities();
        log.info("jwtUser:" + jwtUser.toString());
        String token = jwtUtils.createToken(id,usercode,password,username,faculty,authorities);

        // 返回创建成功的token
        // 但是这里创建的token只是单纯的token
        // 按照jwt的规定,最后请求的时候应该是 `Bearer token`
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        response.setHeader("token", token);
        Map map = new HashMap();
        map.put("response", response);
        map.put("token", token);
        ReturnUtil.success("登陆成功!", map);
    }
 //登录失败处理
    @Override
    protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException {
        response.getWriter().write("authentication failed, reason: " + failed.getMessage());
    }

       最后对token的生成,验证也需要专门去写。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值