无状态(Stateless)Web应用机制

1、实现StatelessAuthcFilter:拦截所有stateless的请求
(1)isAccessAllowed():拦截后先进入该方法。直接返回false,交由onAccessDenied处理鉴权与登录逻辑。(原因参照说明1)
 
(2)参照抽象类AccessControlFilter重写两个onAccessDenied方法。先获取mappedValue处理鉴权,鉴权若通过则调用另一onAccessDenied处理登录逻辑。(此处省略onAccessDenied两个实现的代码片段)
(3)处理登录逻辑的onAccessDenied()中。获取客户端传输的sequence、token、params以及由以上三者经密钥生成的digest(摘要)。
(4)生成StatelessToken。StatelessToken继承自Shiro的AuthenticationToken,扩展了一些属性如username(token)、sequence(时间戳)、clientDigest(客户端生成的摘要)、params(除了摘要以外的参数)。
(5)委托给Realm进行登录验证。
(6)自定义函数onLoginFail,根据传入错误类型返回相应的json提示用户登录失败。以下情况,调用onLoginFail,并return false。
情况一:sequence、token、digest中有一个为空。(参数不全)
情况二:当前时间戳减去sequence,时间差超过一定时间。(可能为重放攻击)
情况三:委托为Realm进行登录,抛出异常。(各种原因的登录失败)
 
2、实现StatelessRealm
(1)重写doGetAuthenticationInfo方法(校验身份)。
首先,获取到StatelessAutncFilter中设置的StatelessToken,其属性sequence、token、params、clientDigest。
其次,根据token字符串到数据库中查找Token对象(用户从移动端用账号密码登录时生成,包含token字符串,唯一密钥,当前User,有效期相关)。
再次,根据和前端同样的规则用secret生成密钥。
然后,在服务器端生成客户端参数的消息摘要。
最后,进行身份校验。
(2)重写doGetAuthorizationInfo方法(鉴权)。
 
3、配置applicationContext-shiro.xml
(1)配置StatelessRealm,关闭缓存。
(2)配置SecurityManager,在其realms的property中配置StatelessRelam。
(2)配置StatelessAuthcFilter,并在filterChainDefinitions配置stateless过滤器。
 
 
 
说明:
1、StatelessAuthcFitler的每次请求都需要登录,必须进入onAccessDenied处理登录逻辑。如果在isAccessAllowed()中处理鉴权,通过则不进入onAccessDenied,不通过则进入onAccessDenied,达不到“stateless[customer]”的角色限制效果。
 

转载于:https://www.cnblogs.com/Mr-4/p/5133992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值