用户登录认证

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);
    }
相关推荐
吠品7 分钟前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
CarIise23 分钟前
CSS选择器与样式关联
前端·css·tensorflow
动词ing1 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse1 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言
亚历克斯神1 小时前
智能搜索系统的升级复盘——从 Elasticsearch 到混合检索的检索质量提升
java·spring·微服务
丰锋ff1 小时前
基于 Qt 的智慧社区物业管理系统
开发语言·qt
里欧跑得慢2 小时前
CSS 模块化架构的演进:BEM、CSS Modules 到 CSS-in-JS 的反思
前端·css·flutter·web·css-in-js
夜不会漫长2 小时前
C++入门(1)
开发语言·c++·算法
IT_陈寒2 小时前
Vue的computed属性把我坑惨了,原来我一直用错姿势
前端·人工智能·后端
大鹏说大话2 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python