Apache Shiro 用戶信息保存在session方案


描述

在使用shiro的時候,經常會有一種需求: 把登錄成功后的用戶對象存放到session中,方面其他地方調用。存放到session這個步驟到底應該在哪里去做,有幾個地方比較合適:

  • 調用 Subject.login() 的時候
  • 使用 cas 進行單點認證的時候,集成 CasFilter 重寫 onLoginSuccess() 方法
  • 實現 AuthenticationListener 接口,實現 onSuccess 接口

以上三種方法,都可以做到登錄成功以后把用戶對象存放到session中,但是都沒有考慮到一點,使用 保存登錄(Remembere) 進行自動登錄的情況,以上的幾個方法都不會被調用,也沒有找到 onRemembereLogin 類似的接口。

解決方案

在需要用戶登錄權限的地方添加一個過濾器: 判斷如果用戶是登錄狀態,並且session里的用戶對象為空,則去數據庫中查詢用戶對象放入session中。

代碼如下:

public class UserSessionFilter extends AccessControlFilter {
  @Override
  protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
      Subject subject = getSubject(request, response);
      if (subject == null) {
          // 沒有登錄
          return false;
      }
      HttpSession session = WebUtils.toHttp(request).getSession();
      Object sessionUsername = session.getAttribute(GlobalConstant.SESSION_AUTH_LOGIN_USERNAME);
      if (sessionUsername == null) {
         // 你自己的邏輯
      }
      return true;
  }

  @Override
  protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
      return true;
  }

  @Override
  protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
      return true;
  }
}

spring配置:

<bean id="userSessionFilter" class="com.chinamedcom.his.common.auth.UserSessionFilter"/>
<!-- 在ShiroFilterFactoryBean的filters中加入 -->
<property name="filters">
    <util:map>
        <entry key="userSession" value-ref="userSessionFilter"/>
        <!-- ..... -->
        <!-- 你的其他filter -->
    </util:map>
</property>

在 filterChainDefinitions 中加上:

/** = user,userSession

本文轉載自:https://sqzryang.com/blog/2016/09/22/Apache-Shiro-user-information-stored-in-the-session-plan/?utm_source=tuicool&utm_medium=referral


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM