jwt+shiro
Posted 脚丫先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jwt+shiro相关的知识,希望对你有一定的参考价值。
一、jwt和shiro
jwt的核心是秘钥—json格式的被加密了的字符串(加密签名)。即:用户登录成功之后,服务端给用户浏览器返回一个token,以后用户浏览器要携带token再去向服务端发送请求,服务端校验token的合法性,合法则给用户看数据,否则,返回一些错误信息。
应用:两端开发:app开发、小程序开发。
shiro是一套权限管理框架,包括认证、授权等
二、区别
hiro和JWT是典型的有状态登陆和无状态登陆的代表,所谓的有状态和无状态,就是看信息存在哪儿,存在服务器端,就叫做有状态,存在客户端,就叫无状态。
有状态就是说把信息存储在session中,因为session是存在服务端的,也就是有状态的,无状态就是把信息存在cookie中,cookie是存在客户端的,也就是无状态。
无状态的好处很明显,不存在服务端,可以减少服务端的压力。
三、什么时候要用JWT
当我们要把服务器做成无状态时(即服务器端不会保存session),这里我们就可以用到JWT。首先,是要支持多端,一个api要支持H5, PC和APP三个前端,如果使用session的话对app不是很友好,而且session有跨域攻击的问题。其次,后端的服务是无状态的,所以要支持分布式的权限校验。当然这个不是主要原因了,因为session持久化在spring里面也就是加一行注解就解决的问题。不过,spring通过代理httpsession来做,总归觉得有点复杂。
四、token认证机制
token与session的不同主要在
①认证成功后,会对当前用户数据进行加密,生成一个加密字符串token,返还给客户端(服务器端并不进行保存)
②浏览器会将接收到的token值存储在Local Storage中,(通过js代码写入Local Storage,通过js获取,并不会像cookie一样自动携带)
③再次访问时服务器端对token值的处理:服务器对浏览器传来的token值进行解密,解密完成后进行用户数据的查询,如果查询成功,则通过认证,实现状态保持,所以,即时有了多台服务器,服务器也只是做了token的解密和用户数据的查询,它不需要在服务端去保留用户的认证信息或者会话信息,这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,解决了session扩展性的弊端。
五、原理
1.用户登陆之后,使用密码对账号进行签名生成并返回token并设置过期时间;
2.将token保存到本地,并且每次发送请求时都在header上携带token。
3.shiro过滤器拦截到请求并获取header中的token,并提交到自定义realm的doGetAuthenticationInfo方法。
4.通过jwt解码获取token中的用户名,从数据库中查询到密码之后根据密码生成jwt效验器并对token进行验证。
以上是关于jwt+shiro的主要内容,如果未能解决你的问题,请参考以下文章