Shiro 和jwt

Shiro与JWT:安全框架与身份验证详解

Shiro

Subject currentUser=SecurityUtils.getSubject()
Session session=currentUser.getSession()
currentUser.isAuthenticated()
currentUser.getPrincipal()
currentUser.hasRole("schwartz")
currentUser.ispermitted("lightsaber:wield")
currentUser.logout();注销

三大组件

第一:Subject用户
第二: SecurityManager管理用户
第三: Realm 数据
Subject:主体,相当与是请求过来的"用户"
SecurityManager: 是 Shiro 的心脏;所有具体的交互都通过 SecurityManager 进行拦截并控制;它管理着所有 Subject、且负责进行认证和授权、及会话、缓存的管理
Authenticator:认证器,负责主体认证的,即确定用户是否登录成功,我们可以使用  Shiro 提供的方法来认证,有可以自定义去实现,自己判断什么时候算是用户登录成功
Authrizer:授权器,即权限授权,给 Subject 分配权限,以此很好的控制用户可访问的资源
Realm:一般我们都需要去实现自己的 Realm ,可以有1个或多个 Realm,即当我们进行登录认证时所获取的安全数据来源(帐号/密码)
SessionManager:为了可以在不同的环境下使用 session 功能,shiro 实现了自己的 sessionManager ,可以用在非 web 环境下和分布式环境下使用
SessionDAO:对 session 的 CURD 操作
CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;
Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密的。

添加shiro内置过滤器

ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
Map  filterMap.put("/user","authc");
bean.setFilterChainDefinitionMap(filterMap)

JWT

JSON WEB TOKEN
主要是认证和授权
jwt由三部分组成,中间用点拼接
1 header //存放算法
{
‘typ’:‘JWT’ //类型
‘alg’:‘hs256’ //算法
}
2 Payload //载荷 ,存储主要信息
{
‘sub’:‘123’
‘name’:‘john’
‘admin’:true
}
3 Signature //加密 把header和payload进行合并加密

我对jwt的简单认识

主要是对于用户身份认证这块
传统的方式
1 客户端发送请求,服务端响应,把信息存入session,并生成一个sessionId给客户端,当客户端发送二次请求时,直接对比就行了。
缺点在于一般服务都是分布式的,我其他几个服务器里的session并没有保存。
解决的三种办法,1 保存在一个公共的地方,比如说数据库呀啥的
2 就是session sticky,就是说,你这个用户访问的永远都是一个服务器
3 session复制,把这个session复制到其他机器上
解决的第四种方式,就是jwt, 去中心化,把数据保存在客户端上
简单来说,客户端第一次发送请求,服务端接收到,判断这个用户账户密码是否正确,如果错误,就直接返回,如果正确,就生成jwt,并返回给客户端,一般是放在header上,当客户第二次发起请求时,服务端捕获到cookie,从cookie中拿到jwt,然后对jwt进行解析,根据header和Payload编码,编码后生成Signature,然后对比看看两个Signature是否相同,如果签名成功,则放行。
问题1 :我根据客户端的cookie破解Signature的密钥,那样的话,我不是可以随意更改header和payload的值自己生成一个jwt?,那样的话服务端如何识别?
jwt的密钥是保存在服务端的,它的加密是不可逆的。
问题2: 比如说两个人a和b,b是京东的程序员。两个网站淘宝和京东,我用a访问了淘宝,又访问了京东,等于说我的cookie中存了两个token,a访问京东的时候把cookie发给京东,那京东拿着cookie解析出淘宝的token,那不就是说它可以用a的token直接访问淘宝?这不是乱了吗?
不是,客户端发送的时候只会发送那个服务器的token。
问题3:
我搞个抓包软件,捕获一个路由器的所有请求,那么这个路由器肯定有所有请求token啊,比如说我家的wifi,我和我妈都在连接,我妈登录了淘宝,我捕获到这个信息了,我直接拿着我妈的token登录淘宝,那我不是拥有我妈的账户了吗?虽然可能获取不到支付的权限,但是我妈其他所有权限我都能看到吧?不知道路边的wifi不让连是不是这个原因?
https可能会补获mac地址,但是mac地址高手应该能伪装吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值