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