v准备内容
v简单的shiro无状态认证
无状态认证拦截器
Subject工厂
注意,这里禁用了session
无状态Realm
无状态Token
shiro配置文件
这里禁用了回话调度器的session存储
web.xml配置
token生成工具类
简单测试一下
补充Spring中多重属性赋值处理
以上参考 开涛老师的博文!
v相对复杂一点的shiro无状态认证
*加入session,放入redis中(user_name作为key值,token作为hash值,当前登录时间作为value值)
*用户登录互斥操作:如果互斥,清除redis中该用户对应的状态,重新写入新的状态;如果不互斥,写入新的状态,刷新key值,并检测该用户其他的状态是否已经超时(根据key值获取到所有的 key和hashKey的组合,判断value[登入时间]+timeout[超时时间] >= curtime[当前时间]),如果超时则清除状态。
*使用esapi进行token的生成
*认证信息,如果是web端则从cookie中获取,ajax从header中获取;如果是移动端也是从header中获取
session manager逻辑
无状态认证过滤器
dubbo服务调用时上下文的传递问题
思路:认证过滤器中 通过MDC将上下文信息写入到InheritableThreadLocal中,写一个dubbo的过滤器。在过滤器中判断,如果是消费一方,则将MDC中的上下文取出来放入dubbo的context变量中;如果是服务方,则从dubbo的context中拿出上下文,解析并放入MDC以及InvocationInfoProxy(下面会提到)类中
Subject工厂
同样禁用掉session的创建
无状态Realm
这里使用自定义 session manager去校验
无状态token
token处理器
将一些必须字段和扩展字段进行通过esapi 的hash算法进行加密,生成token串,最终的token = token处理器标识+过期时间+原token
shiro配置文件
通过InvocationInfoProxy这个类(基于ThreadLocal的),可以拿到用户相关的参数信息
还有esapi和cache的相关代码到项目里看一下吧
v项目地址
欢迎访问,无状态shiro认证组件!