用户登录认证

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 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
嵌入式学习菌1 小时前
ESP32 ModbusTCP 分片缓存
java·后端·spring
vx_Biye_Design1 小时前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
程序员小杰@1 小时前
Spring Boot 常用注解分类速记
java·spring boot·后端
vx_Biye_Design1 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计
吴声子夜歌1 小时前
Nginx应用与运维——Nginx日志管理
java·运维·nginx
guo_wen_qiang2 小时前
云服务器nacos搭建-集群&持久化
java·运维·服务器
泡海椒2 小时前
JQuick-Excel dateFormat 转换实战:日期值与 FORMAT 显示格式的边界
开发语言·python·excel
白杨尚青2 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl