用户登录认证

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);
    }
相关推荐
王桑.几秒前
Spring中IoC的底层原理
java·后端·spring
Liii4036 分钟前
Java集合详细讲解
java·开发语言
落羽的落羽11 分钟前
【C++】哈希扩展——位图和布隆过滤器的介绍与实现
linux·服务器·开发语言·c++·人工智能·算法·机器学习
猿究院_xyz23 分钟前
微信小程序与echarts联动安卓真机测试出现黑色阴影
前端·javascript·微信小程序·小程序·echarts
fish_xk23 分钟前
类和对象(二)
开发语言·c++·算法
lly20240626 分钟前
Python 列表(List)详解
开发语言
Han.miracle27 分钟前
Spring Boot 项目从入门到排障:核心结构、依赖管理与启动全解析
java·jar
深蓝电商API33 分钟前
从 “能爬” 到 “稳爬”:Python 爬虫中级核心技术实战
开发语言·爬虫·python
麦麦鸡腿堡34 分钟前
Java_通过反射获取类的结构信息
java·开发语言
IT_陈寒34 分钟前
Redis性能翻倍的5个冷门技巧,90%开发者都不知道的深度优化方案
前端·人工智能·后端