javascript
SpringBoot + Shiro 缓存记住密码
一般來講,記住密碼的基本處理,就是把用戶的一些基本信息(密碼)存入瀏覽器的Cookie,下次登錄的時候優(yōu)先驗證Cookie,后端做處理;以此來實現(xiàn)記住密碼的功能!使用shiro自帶的RememberMe功能,使用起來比較簡單,只需簡單的配置。
需注意一點的是,網(wǎng)站如果對安全性要求比較高的,一般都不建議有記住密碼的功能! 因為Cookie是保存在本機電腦瀏覽器里,不排除其他用戶能使用此電腦,拷走Cookie,導入其他電腦繼續(xù)使用您的賬號登錄!
shiro實現(xiàn)了身份驗證和權(quán)限驗證。但是,如果我們登錄之后多次訪問http://localhost:8080/userInfo/userDel的話,會發(fā)現(xiàn)權(quán)限驗證會每次都執(zhí)行一次。這是有問題的,因為像用戶的權(quán)限這些我們提供給shiro一次就夠了。
下面,我們開始給shiro添加緩存支持:
1.添加依賴
<!-- shiro ehcache --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.2.2</version></dependency><!--包含支持UI模版(Velocity,FreeMarker,JasperReports),郵件服務,腳本服務(JRuby),緩存Cache(EHCache),任務計劃Scheduling(uartz)。--><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency>2.注入緩存
在com.example.demo.config.Shiro.ShiroConfiguration中添加以下方法。
@Beanpublic EhCacheManager ehCacheManager() {System.out.println("ShiroConfiguration.getEhCacheManager()");EhCacheManager ehCacheManager = new EhCacheManager();ehCacheManager.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml");return ehCacheManager;}將緩存對象注入到SecurityManager中:
@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myShiroRealm());securityManager.setCacheManager(ehCacheManager()); //注入緩存對象。return securityManager;}3.添加配置文件
在src/main/resouces/config中添加ehcache-shiro.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <ehcache name="es"><diskStore path="java.io.tmpdir"/><!--name:緩存名稱。maxElementsInMemory:緩存最大數(shù)目maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。eternal:對象是否永久有效,一但設(shè)置了,timeout將不起作用。overflowToDisk:是否保存到磁盤,當系統(tǒng)當機時timeToIdleSeconds:設(shè)置對象在失效前的允許閑置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,默認值是0,也就是可閑置時間無窮大。timeToLiveSeconds:設(shè)置對象在失效前允許存活時間(單位:秒)。最大時間介于創(chuàng)建時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。diskPersistent:是否緩存虛擬機重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.diskSpoolBufferSizeMB:這個參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認是30MB。每個Cache都應該有自己的一個緩沖區(qū)。diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據(jù)指定的策略去清理內(nèi)存。默認策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進先出)或是LFU(較少使用)。clearOnFlush:內(nèi)存數(shù)量最大時是否清除。memoryStoreEvictionPolicy:Ehcache的三種清空策略;FIFO,first in first out,這個是大家最熟的,先進先出。LFU, Less Frequently Used,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit屬性,hit值最小的將會被清出緩存。LRU,Least Recently Used,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現(xiàn)有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。--><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"/><!-- 登錄記錄緩存鎖定10分鐘 --><cache name="passwordRetryCache"maxEntriesLocalHeap="2000"eternal="false"timeToIdleSeconds="3600"timeToLiveSeconds="0"overflowToDisk="false"statistics="true"></cache></ehcache>啟動項目,再多次訪問http://localhost:8080/userInfo/userDel,這時候只會在后臺打印一次配置權(quán)限的信息了,說明shiro緩存起了作用。
---------------------下面我們開始配置記住密碼-----------
1.在com.example.demo.config.Shiro.ShiroConfiguration中加入下面兩個方法:
//cookie對象;@Beanpublic SimpleCookie rememberMeCookie() {System.out.println("ShiroConfiguration.rememberMeCookie()");//這個參數(shù)是cookie的名稱,對應前端的checkbox的name = rememberMeSimpleCookie simpleCookie = new SimpleCookie("rememberMe");//<!-- 記住我cookie生效時間30天 ,單位秒;-->simpleCookie.setMaxAge(259200);return simpleCookie;}//cookie管理對象;@Beanpublic CookieRememberMeManager cookieRememberMeManager() {System.out.println("ShiroConfiguration.rememberMeManager()");CookieRememberMeManager manager = new CookieRememberMeManager();manager.setCookie(rememberMeCookie());return manager;}將rememberMeManager注入到SecurityManager中
@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myShiroRealm());securityManager.setCacheManager(ehCacheManager());securityManager.setRememberMeManager(cookieRememberMeManager()); //注入rememberMeManager;return securityManager;}在ShiroFilterFactoryBean中添加記住我過濾器user,添加user過濾器的資源在記住我或認證之后就可以直接訪問了。
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); ...filterChainDefinitionMap.put("/index", "user");filterChainDefinitionMap.put("/", "user"); ....最后,在login.html頁面添加記住我單選框
<P><input type="checkbox" name="rememberMe" />記住我</P>啟動項目,正常登錄后關(guān)閉瀏覽器,再打開瀏覽器輸入http://localhost:8080/index,這時候就可以直接訪問index頁面,不需要再登錄了。
總結(jié)
以上是生活随笔為你收集整理的SpringBoot + Shiro 缓存记住密码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员法律考试(5)-民法(2)
- 下一篇: gradle idea java ssm