天天看點

無狀态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的相關代碼到項目裡看一下吧