手把手教你,使用JWT实现单点登录(下)

简介: JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案之一,今天我们一起来揭开它神秘的面纱!

最后,在controller层用户登录之后,创建一个token,存放在头部即可

/**
 * 登录
 * @param userDto
 * @return
 */
@JwtIgnore
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
public UserVo login(@RequestBody UserDto userDto, HttpServletResponse response){
    //...参数合法性验证
    //从数据库获取用户信息
    User dbUser = userService.selectByUserNo(userDto.getUserNo);
    //....用户、密码验证
    //创建token,并将token放在响应头
    UserToken userToken = new UserToken();
    BeanUtils.copyProperties(dbUser,userToken);
    String token = JwtTokenUtil.createToken(JSONObject.toJSONString(userToken));
    response.setHeader(JwtTokenUtil.AUTH_HEADER_KEY, token);
    //定义返回结果
    UserVo result = new UserVo();
    BeanUtils.copyProperties(dbUser,result);
    return result;
}

到这里基本就完成了!

其中AuthenticationInterceptor中用到的JwtIgnore是一个注解,用于不需要验证token的方法上,例如验证码的获取等等。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface JwtIgnore {
    boolean value() default true;
}

WebContextUtil是一个线程缓存工具类,其他接口通过这个方法即可从token中获取用户信息。

public class WebContextUtil {
    //本地线程缓存token
    private static ThreadLocal<String> local = new ThreadLocal<>();
    /**
     * 设置token信息
     * @param content
     */
    public static void setUserToken(String content){
        removeUserToken();
        local.set(content);
    }
    /**
     * 获取token信息
     * @return
     */
    public static UserToken getUserToken(){
        if(local.get() != null){
            UserToken userToken = JSONObject.parseObject(local.get() , UserToken.class);
            return userToken;
        }
        return null;
    }
    /**
     * 移除token信息
     * @return
     */
    public static void removeUserToken(){
        if(local.get() != null){
            local.remove();
        }
    }
}

最后,启动项目,我们来用postman测试一下,看看头部返回结果。

47.jpg

我们把返回的信息提取处理,使用浏览器的base64对前两个部分进行解密。

  • 第一部分,也就是header,结果如下:

48.jpg

第二部分,也就是playload,结果如下:

49.jpg

可以很清晰的看到,头部、载荷的信息都可以通过base64解密出来。

所以,一定别在token中存放敏感信息

当我们需要请求其它服务接口时,只需要在请求头部headers中加入Authorization参数即可。

50.jpg

当权限拦截器验证通过之后,在接口方法中只需要通过WebContextUtil工具类就可以获取用户信息。

//获取用户token信息
UserToken userToken = WebContextUtil.getUserToken();

四、总结

JWT相比session方案,因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVAJavaScriptPHP等很多语言都可以使用,而session方案只针对JAVA

因为有了payload部分,所以JWT可以存储一些其他业务逻辑所必要的非敏感信息。

同时,保护好服务端secret私钥非常重要,因为私钥可以对数据进行验证、解密!

如果可以,请使用https协议!

相关文章
|
20天前
|
存储 缓存 NoSQL
【带你读源码】GToken替换JWT实现SSO单点登录
今天和大家分享一下使用GoFrame的gtoken替换jwt实现sso登录的经验。
|
10月前
|
JSON 安全 算法
看完就懂-SpringSecurity+JWT 实现单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
303 0
|
存储 JSON NoSQL
浅析单点登录(重点讲解OAuth2+JWT)
浅析单点登录(重点讲解OAuth2+JWT)
541 0
浅析单点登录(重点讲解OAuth2+JWT)
|
存储 缓存 NoSQL
通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录
今天和大家分享一下使用GoFrame的gtoken替换jwt实现sso登录的经验,为了让大家更好的理解会带大家读一下重点的源码。
125 0
通过阅读源码解决项目难题:GToken替换JWT实现SSO单点登录
|
存储 JSON NoSQL
单点登录和JWT的介绍与使用
最近复习之前做的项目中包含的知识,看了之前看的视频的笔记,并结合自己的理解写下了这篇关于JWT知识的博客,希望能加深自己的印象以及帮助的诸位小伙伴儿们
252 1
|
安全 Java Spring
Spring Security + JWT 实现单点登录,还有谁不会。。。(5)
Spring Security + JWT 实现单点登录,还有谁不会。。。(5)
161 0
Spring Security + JWT 实现单点登录,还有谁不会。。。(5)
|
安全 Java Spring
Spring Security + JWT 实现单点登录,还有谁不会。。。(4)
Spring Security + JWT 实现单点登录,还有谁不会。。。(4)
140 0
Spring Security + JWT 实现单点登录,还有谁不会。。。(4)
|
安全 Java Spring
Spring Security + JWT 实现单点登录,还有谁不会。。。(3)
Spring Security + JWT 实现单点登录,还有谁不会。。。(3)
139 0
Spring Security + JWT 实现单点登录,还有谁不会。。。(3)
|
安全 Java Spring
Spring Security + JWT 实现单点登录,还有谁不会。。。(2)
Spring Security + JWT 实现单点登录,还有谁不会。。。(2)
148 0
Spring Security + JWT 实现单点登录,还有谁不会。。。(2)
|
JSON 安全 算法
Spring Security + JWT 实现单点登录,还有谁不会。。。(1)
Spring Security + JWT 实现单点登录,还有谁不会。。。
371 0
Spring Security + JWT 实现单点登录,还有谁不会。。。(1)