用户登录认证

1.前端账号密码数据通过请求体方式发送给后端接口

2.后端拿到账号密码进行校验

java 复制代码
 // 令牌自定义标识
    @Value("${token.header}")
    private String header;

    // 令牌秘钥
    @Value("${token.secret}")
    private String secret;

    // 令牌有效期
    @Value("${token.expireTime}")
    private int expireTime;
java 复制代码
public void loginCheck(String username, String password)
    {
        //依据业务进行账号密码校验
        //用户名密码校验成功后,生成token
        //利用Spring Security框架封装用户信息
        UsernamePasswordAuthenticationToken authenticationToken = new                 
                   UsernamePasswordAuthenticationToken(username, password);
        //讲封装的信息设置存储当前安全上下文
        AuthenticationContextHolder.setContext(authenticationToken);       
        //AuthenticationManager是Spring Security中用于处理身份验证请求的接口。它接收一个Authentication对象(此是一个UsernamePasswordAuthenticationToken),认证成功authenticate方法会返回一个填充了用户权限和其他详细信息的Authentication对象
        authentication = authenticationManager.authenticate(authenticationToken);
//认证失败抛出AuthenticationException

//成功后
    authentication.getPrincipal();//获取当前用户主体信息
//生成token
    createToken(loginUser);
    }

//生成token
public String createToken(LoginUser loginUser)
    {
        String token = IdUtils.fastUUID();
        loginUser.setToken(token);
        refreshToken(loginUser);

        Map<String, Object> claims = new HashMap<>();
        claims.put(Constants.LOGIN_USER_KEY, token);
        return createToken(claims);
    }

private String createToken(Map<String, Object> claims)
    {
        String token = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS512, secret).compact();
        return token;
    }


//刷新token
public void refreshToken(LoginUser loginUser)
    {
        loginUser.setLoginTime(System.currentTimeMillis());
        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
        // 根据uuid将loginUser缓存
        String userKey = getTokenKey(loginUser.getToken());
        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
    }

3.用户信息存放redis中

java 复制代码
public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
    {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }
相关推荐
Ticnix几秒前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人3 分钟前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
JH30735 分钟前
为什么switch不支持long
java
twl7 分钟前
OpenClaw 深度技术解析
前端
gpfyyds6668 分钟前
Python代码练习
开发语言·python
崔庆才丨静觅10 分钟前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人19 分钟前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼22 分钟前
shadcn/ui,给你一个真正可控的UI组件库
前端
盐真卿23 分钟前
python第八部分:高级特性(二)
java·开发语言
茉莉玫瑰花茶26 分钟前
C++ 17 详细特性解析(5)
开发语言·c++·算法