天天看点

无状态shiro认证组件(禁用默认session)

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  无状态认证拦截器

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

View Code

  Subject工厂

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  注意,这里禁用了session

  无状态Realm

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  无状态Token

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  shiro配置文件

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  这里禁用了回话调度器的session存储

  web.xml配置

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  token生成工具类

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  简单测试一下

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  补充Spring中多重属性赋值处理

无状态shiro认证组件(禁用默认session)

  *加入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逻辑

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  无状态认证过滤器

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  dubbo服务调用时上下文的传递问题

  思路:认证过滤器中 通过MDC将上下文信息写入到InheritableThreadLocal中,写一个dubbo的过滤器。在过滤器中判断,如果是消费一方,则将MDC中的上下文取出来放入dubbo的context变量中;如果是服务方,则从dubbo的context中拿出上下文,解析并放入MDC以及InvocationInfoProxy(下面会提到)类中

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  同样禁用掉session的创建

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  这里使用自定义 session manager去校验

  无状态token

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  token处理器

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  将一些必须字段和扩展字段进行通过esapi 的hash算法进行加密,生成token串,最终的token = token处理器标识+过期时间+原token

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  通过InvocationInfoProxy这个类(基于ThreadLocal的),可以拿到用户相关的参数信息

无状态shiro认证组件(禁用默认session)
无状态shiro认证组件(禁用默认session)

  还有esapi和cache的相关代码到项目里看一下吧