ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SpringBoot 通过token进行身份验证,存储redis

2021-10-01 21:34:53  阅读:237  来源: 互联网

标签:return String redis 身份验证 token userInfo public Constants SpringBoot


1、创建token接口

public interface TokenManager {

    /**
     * 创建token
     * @param userInfo
     * @return
     */
    String getToken(UserInfo userInfo);

    /**
     * 刷新用户
     * @param token
     */
    void refreshUserToken(String token);

    /**
     * 用户退出登陆
     * @param token
     */
    void loginOff(String token);

    /**
     * 获取用户信息
     * @param token
     * @return
     */
    UserInfo getUserInfoByToken(String token);

}

2、token实现类

@Component
public class RedisTokenManager implements TokenManager {

    @Autowired
    private RedisUtils redisUtils;

    @Autowired
    private GlobalConfig globalConfig;

    /**
     * 创建token
     * @param userInfo
     * @return
     */
    public String getToken(UserInfo userInfo){
        //使用uuid作为源token
        String token = UUID.randomUUID().toString().replace("-", "");
        String token_format=String.format(Constants.TOKEN_FORMAT,token);
        redisUtils.set(token_format,userInfo,globalConfig.getTokenExpires());
        return token;
    }

    /**
     * 刷新用户
     * @param token
     */
    public void refreshUserToken(String token){
        token=String.format(Constants.TOKEN_FORMAT,token);
        if(redisUtils.exists(token)){
            redisUtils.setExpireTime(token, globalConfig.getTokenExpires());
        }
    }

    /**
     * 用户退出登陆
     * @param token
     */
    public void loginOff(String token){
         token=String.format(Constants.TOKEN_FORMAT,token);
         redisUtils.remove(token);
    }

    /**
     * 获取用户信息
     * @param token
     * @return
     */
    public UserInfo getUserInfoByToken(String token){
        token=String.format(Constants.TOKEN_FORMAT,token);
        if(redisUtils.exists(token)){
            return (UserInfo)redisUtils.get(token);
        }
        return null;
    }
}

3、对TokenManager进行二次封装,每次操作不需要token参数

@Component
public class AuthManager {

    @Autowired
    private TokenManager tokenManager;

    /**
     * 获取请求体
     * @return
     */
    public HttpServletRequest getRequest(){
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    /**
     * 登录
     * @param userInfo
     * @return
     */
    public String signIn(UserInfo userInfo){
        return tokenManager.getToken(userInfo);
    }

    /**
     * 获取该访问用户信息
     * @return
     */
    public UserInfo getUserInfo(){
        HttpServletRequest request=getRequest();
        String token=request.getAttribute(Constants.USER_TOKEN).toString();
        UserInfo userInfo=tokenManager.getUserInfoByToken(token);
        if(userInfo==null){
            throw new AuthException("该用户已过期", HttpStatus.UNAUTHORIZED.value());
        }
        return userInfo;
    }

    /**
     * 刷新该登录用户,延时
     */
    public void refreshUserInfo(){
        HttpServletRequest request=getRequest();
        String token=request.getAttribute(Constants.USER_TOKEN).toString();
         tokenManager.refreshUserToken(token);
    }

    /**
     * 注销该访问用户
     */
    public void loginOff(){
        HttpServletRequest request=getRequest();
        String token=request.getAttribute(Constants.USER_TOKEN).toString();
        tokenManager.loginOff(token);
    }
}

4、

对用户进行控制,部分接口可以不登陆访问

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthIgnore {

}

5、拦截器:

@Component
public class AuthorizationInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        AuthIgnore annotation;
        if(handler instanceof HandlerMethod) {
            annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class);
        }else{
            return true;
        }

        //如果有@AuthIgnore注解,则不验证token
        if(annotation != null){
            return true;
        }

        //获取用户凭证
        String token = request.getHeader(Constants.USER_TOKEN);
        if(StringUtils.isBlank(token)){
            token = request.getParameter(Constants.USER_TOKEN);
        }
        if(StringUtils.isBlank(token)){
            Object obj = request.getAttribute(Constants.USER_TOKEN);
            if(null!=obj){
                token=obj.toString();
            }
        }

        //token凭证为空
        if(StringUtils.isBlank(token)){
            throw new AuthException(Constants.USER_TOKEN + "不能为空", HttpStatus.UNAUTHORIZED.value());
        }

        return true;
    }
}

标签:return,String,redis,身份验证,token,userInfo,public,Constants,SpringBoot
来源: https://blog.csdn.net/douxingpeng1/article/details/90115936

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有