08.關於shiro集成Spring、SpringMvc、SpringData實現remenberMe

今天寫登陸功能,想要實現記住我功能,而後處處找了一些,始終不夠完整,因而我就本身研究了最終實現以下web

1.在登陸頁面加入「記住我」複選框,以下

<input type="checkbox" name="rememberMe" value="true">記住我</input>

須要注意的是,這裏的name,只能寫爲remeberMe,由於shiro內部集成了會自動獲取這個字段的值,後面的value="true",這個是我本身加上去的,至關因而一個默認值,默認爲記住我狀態算法

2.後臺Controller裏面接收參數:

//獲取當前登陸主體  
Subject subject = SecurityUtils.getSubject();  
//若是當前用戶尚未認證  
try {  
    //若是當前主體未認證,就開始認證  
  if (!subject.isAuthenticated()) {  
  
        //將傳入的用戶名和密碼封裝到UsernamePasswordToken  
        subject.login(token);  
        Employee employee = (Employee)  subject.getPrincipal();  
        //登陸成功以後將當前用戶對象放到session中去  
        SessionUtil.setUserSession(employee);  
        //記住我  
         token.setRememberMe(true);  
  }  
  
    return new AjaxResult();

須要注意的是,我作的是在這裏登陸成功以後,就直接就setRememberMe(true),固然,這裏能夠本身加判斷,有if語句和三目均可以實現,基於你的需求不同而已。數據庫

3.配置權限

我這裏是自定義的map集合來動態獲取數據庫中的權限,以及添加新的權限請求,若是須要具體配置的方法介紹,能夠留言apache

public class MyFilterChainDefinitionMap {  
  
    @Autowired  
    private IPermissionService permissionService;  
  
    /**  
    * 動態獲取數據庫中的權限  
    * @return  
    */  
    public Map<String,String> createMap(){  
  
    //準備一個map集合  
    Map<String,String> map = new LinkedHashMap<>();  
  
    //經過注入的IPermissionService對象來查找出全部的Permission(權限對象)  
    List<Permission> permissionList = permissionService.findAll();  
  
    //循環遍歷全部的Permission  
    for (Permission permission : permissionList) {  
        //在過程當中,動態添加權限 --//url(=== /employee/save) 對應 sn(=== employee:save)           //ArvinPermission是自定義的過濾器  
        map.put(permission.getUrl(),"ArvinPermission["+permission.getSn()+"]");  
    }  
        //直接放行登陸請求  
        map.put("/login","anon");  
  
        //這裏用於對全部的靜態資源進行放行  
        map.put("/static/**","anon");  
        //註銷請求  
        map.put("/logout","logout");  
        //攔截全部請求,須要認證才能通行  
        //map.put("/**","authc");  
  
        // --- /** = user 表示對訪問全部地址對認證過的用戶進行放行  
        map.put("/**","user");  
        return map;  
  
  }  
}

在這個裏面就是將原來的map.put("/**","authc"); 替換爲map.put("/**","user"); ,至關於原來全部的請求都須要認證,而如今就是全部的請求對認證過的主體進行放行(不等於不須要權限訪問全部連接)cookie

4.shiro.xml配置

<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <!--設置cookie的名稱-->
        <constructor-arg value="rememberMe"/>
        <property name="httpOnly" value="true"/>
        <!--30*24*60*60 = 2592000(天*小時*分鐘*秒鐘) 設置cookie的存活時間 -->
        <property name="maxAge" value="2592000"/><!-- 30 天 -->
</bean>
    
<!-- rememberMe 管理器 -->  
<!--rememberMe 管理器,cipherKey 是加密 rememberMe Cookie 的密鑰;默認 AES 算法-->  
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">  
 <property name="cipherKey" value=" #{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>  
 <property name="cookie" ref="rememberMeCookie"/>  
</bean>  
  
<!-- 會話ID生成器 -->  
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>  
  
<!-- 會話Cookie模板,使用sid存儲sessionid -->  
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
 <constructor-arg value="sid"/>  
 <property name="httpOnly" value="true"/>  
  <!--這裏就是設置的一次會話管半個小時-->  
  <property name="maxAge" value="180000"/>  
</bean>  
  
<!-- 會話DAO -->  
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">  
 <property name="activeSessionsCacheName" value\="shiro-activeSessionCache"/>  
 <property name="sessionIdGenerator" ref="sessionIdGenerator"/>  
</bean>  
  
<!-- 會話驗證調度器 -->  
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">  
 <property name="sessionValidationInterval" value="1800000"/>  
 <property name="sessionManager" ref="sessionManager"/>  
</bean>  
  
<!-- 會話管理器 -->  
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  
  <!--失效時間,單位爲毫秒-->  
  <property name="globalSessionTimeout" value="1800000"/>  
  <!--&lt;!&ndash;刪除無效session&ndash;&gt; -->  
  <property name="deleteInvalidSessions" value="true"/>  
 <property name="sessionValidationSchedulerEnabled" value="true"/>  
 <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>  
 <property name="sessionDAO" ref="sessionDAO"/>  
 <property name="sessionIdCookieEnabled" value="true"/>  
 <property name="sessionIdCookie" ref="sessionIdCookie"/>  
</bean>

這裏配置結束以後,須要再將sessionManagerrememberMeManager配置進shiro的核心對象securityManagersession

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="arvinRealm"/>
        <property name="sessionManager" ref="sessionManager"/>
        <!--引入記住我屬性-->
        <property name="rememberMeManager" ref="rememberMeManager"/>
    </bean>

到這裏,咱們的記住我功能就所有實現ui

相關文章
相關標籤/搜索