用户登录认证

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);
    }
相关推荐
电梯界知识分子1 分钟前
江西抚州临川九尊府五层别墅:受限楼梯间里,全黑铝合金观光井道配曳引龙门架的落地记录
大数据·前端·网络·算法·家用电梯
雪落漂泊5 分钟前
C++智能指针
开发语言·jvm·c++
木井巳10 分钟前
【记忆化搜索】斐波那契数
java·算法·leetcode·深度优先·剪枝·推荐算法
清水白石00814 分钟前
别被 `Process.start()` 骗了:Python multiprocessing 从面试题到线上生产的进程启动机制实战
开发语言·python
geovindu22 分钟前
java: Task Scheduler
java·开发语言·后端
神奇小梵26 分钟前
java的特殊语法点,与常规语言相异的点
java·开发语言
晴天1628 分钟前
Web 页面内存溢出与 CPU 溢出:区别、诊断与最佳实践
前端·javascript
摸鱼仙人~35 分钟前
需求深度分析提示词-grill me
前端·chrome
Highcharts.js39 分钟前
常见报错排雷指南3:兼容性问题的官方解法
前端·javascript·react.js·可视化·highcharts·报错解法
无巧不成书021841 分钟前
Tomcat 下载后使用全指南:解压、环境配置、启动验证与常见问题排查
java·tomcat