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

描述

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

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

以上三種方法,均可以作到登陸成功之後把用戶對象存放到session中,可是都沒有考慮到一點,使用 保存登陸(Remembere) 進行自動登陸的狀況,以上的幾個方法都不會被調用,也沒有找到 onRemembereLogin 相似的接口。數據庫

解決方案

在須要用戶登陸權限的地方添加一個過濾器: 判斷若是用戶是登陸狀態,而且session裏的用戶對象爲空,則去數據庫中查詢用戶對象放入session中。session

代碼以下:app

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配置:ide

<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 中加上:ui

/** = user,userSession

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

相關文章
相關標籤/搜索