描述
在使用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