Spring Security Oauth2限制账号登录人数

新增token工具类:

/**
 * token控制工具类
 * @author 大仙
 */
public class TokenUtil {
    /**
     * 存储token
     * @param telephone
     * @param redisTemplate
     * @param token
     * @return
     */
    public static Boolean pushToken(String telephone, RedisTemplate<String, TokenEntity> redisTemplate, String token, Date invalid){
        LocalDateTime invalidDate = invalid.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        long size = redisTemplate.opsForList().size(telephone);
        TokenEntity tokenEntity = new TokenEntity();
        tokenEntity.setInvalidDate(invalidDate);
        tokenEntity.setToken(token);
        if(size<=0){
            redisTemplate.opsForList().rightPush(telephone,tokenEntity);
        }else{
            List<TokenEntity> tokenEntities = redisTemplate.opsForList().range(telephone, 0, size);
            tokenEntities = tokenEntities.stream().filter(te -> te.getInvalidDate().isAfter(LocalDateTime.now())).collect(Collectors.toList());
            if(tokenEntities.size()>= Constant.MAX_LOGIN){
                return false;
            }
            tokenEntities.add(tokenEntity);
            redisTemplate.delete(telephone);
            tokenEntities.forEach(te->{
                redisTemplate.opsForList().rightPush(telephone,te);
            });
        }
        return true;
    }

    /**
     * 判断token是否有效
     * @param telephone
     * @param redisTemplate
     * @param token
     * @return true 有效 false: 无效
     */
    public static Boolean judgeTokenValid(String telephone, RedisTemplate<String, TokenEntity> redisTemplate, String token){
        long size = redisTemplate.opsForList().size(telephone);
        if(size<=0){
            return false;
        }else{
            List<TokenEntity> tokenEntities = redisTemplate.opsForList().range(telephone, 0, size);
            tokenEntities = tokenEntities.stream().filter(te->te.getToken().equals(token)).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(tokenEntities)){
                return false;
            }
            TokenEntity tokenEntity = tokenEntities.get(0);
            if(tokenEntity.getInvalidDate().isAfter(LocalDateTime.now())){
                return true;
            }
        }
        return false;
    }

    /**
     * 登出
     * @param telephone
     * @param redisTemplate
     * @param token
     */
    public static void logout(String telephone, RedisTemplate<String, TokenEntity> redisTemplate, String token){
        long size = redisTemplate.opsForList().size(telephone);
        if(size<=0){
            redisTemplate.delete(telephone);
        }else{
            List<TokenEntity> tokenEntities = redisTemplate.opsForList().range(telephone, 0, size);
            tokenEntities = tokenEntities.stream().filter(te->!te.getToken().equals(token)).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(tokenEntities)){
                redisTemplate.delete(telephone);
            }
            redisTemplate.delete(telephone);
            tokenEntities.forEach(te->{
                redisTemplate.opsForList().rightPush(telephone,te);
            });
        }
    }
}

在登录成功的时候,增加逻辑:参考:https://blog.csdn.net/zhuwei_clark/article/details/103979919

  //判断token的和方法性
        if(!TokenUtil.pushToken(((BaseUserDetail)authentication.getPrincipal()).getBaseUser().getTelephone(),tokenEntityRedisTemplate,token.getValue(),token.getExpiration())){
            return null;
        }

在退出增加逻辑:参考:https://blog.csdn.net/zhuwei_clark/article/details/103979939

TokenUtil.logout(telephone,tokenEntityRedisTemplate,accessToken);

在判断token层增加:

if(!TokenUtil.judgeTokenValid(accessTokenUtils.getUserInfo().getTelephone(),redisTemplate,accessTokenUtils.getAccessToken().getValue())){
            throw new AccessDeniedException("无权限!");
        }
发布了149 篇原创文章 · 获赞 36 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/zhuwei_clark/article/details/103979980