Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准().该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基于JWT安全认证机制来实现SSO登录;在这个过程中对于SSO的基础实现我们采用一台单独的SSO服务器来进行登录验证,一旦有某一台服务器登录后SSO服务器自然会有验证记录,其他域名下的服务器只需要和SSO服务器校验便可以知道用户是否登录(通过跨域实现),整体机制是构建与cookie之上。
JWT在SSO过程中起到了一种无状态传输的效果,我们只关心请求中所附加的token,通过token进行鉴权从而确认请求的合法性;这样的话整个实现不在立足于session,至于token的存储在前端是通过cookie或者localstorage实现我们并不关心。
1.基于shiro机制实现的方案尤其要注意以下几点:
1)多机器情况下,每台机器都用shiro控制,shiro的登录依赖自己的session,如果每台机器都产生自己的sessionid会导致同一域名下cookie存在大量的不同的sessionid;其次sessionid对于每次请求浏览器都会附加都请求cookie中,使得不同机器对sessionid的识别会出现模糊不清,导致登录不稳定!
2)SSO登录的解决方案有几种,如:共享cookie,共享session;我们是基于共享用户信息的cookie,传递JWT的形式来解决SSO登录的问题,所以去掉对session的依赖,以及不同域名下的token保证不一致各自维护自己的token,并且cookie中token通过域名,path等等做好限制;
3)SSO机制采用无状态原理(JWT原理)
这几点意味着每次请求在shiro中都需要进行shiro内部的登录(subject.login方法调用),实际测试来看shiro过滤器里面进行登录速度是非常快的,所以几乎不受什么影响。
2.JWT登录实现要注意的问题:
1)jwt的续签和注销~ 注销登录通过redis来解决
~ 统一通过redis设置的过期时间来管理用户登录的key,这个key一旦过期自动将用户重定向到登录页
2) token的过期时间问题
JWT对于传统的方式需要管理session,cookie比较麻烦,同时安全性上做的不是很好提供了一些比较好的处理方案,具体的JWT实现我这里不做过多的论述,留几个地址作为参考即可:
http://www.cnblogs.com/xiekeli/p/5607107.html
http://blog.csdn.net/a82793510/article/details/53509427