新聞中心
Shiro是一個優(yōu)秀的Java安全框架,通過Shiro的使用可以簡化Java應(yīng)用程序的安全開發(fā),加快應(yīng)用程序的開發(fā)速度。然而,在使用Shiro時需要注意數(shù)據(jù)庫的更新問題,否則會出現(xiàn)一些意想不到的問題。本文將詳細介紹Shiro安全框架數(shù)據(jù)庫更新的注意事項。

一、 對Shiro權(quán)限管理表的更新
在使用Shiro時,需要創(chuàng)建Shiro權(quán)限管理表,例如:user、role、permission等表。這些表記錄了用戶、角色、權(quán)限等相關(guān)信息。當對Shiro權(quán)限管理表進行更新時,需要注意以下幾個問題。
1. 遷移數(shù)據(jù)
當需要更新Shiro權(quán)限管理表結(jié)構(gòu)時,需要先遷移舊數(shù)據(jù)到新表結(jié)構(gòu)中,否則會導(dǎo)致數(shù)據(jù)丟失,用戶、角色、權(quán)限等信息都無法被正確處理。因此,必須在不影響原有應(yīng)用程序的情況下,將舊數(shù)據(jù)移動到新的數(shù)據(jù)表中。
2. 檢測表關(guān)聯(lián)關(guān)系
在更新Shiro權(quán)限管理表結(jié)構(gòu)時,需要關(guān)注表之間的關(guān)聯(lián)關(guān)系,否則會出現(xiàn)關(guān)聯(lián)數(shù)據(jù)不匹配的情況。例如,如果在更新Shiro角色表時,沒有考慮到該表和其他表之間的關(guān)聯(lián)關(guān)系,則會導(dǎo)致角色關(guān)聯(lián)的用戶數(shù)據(jù)出現(xiàn)問題。
3. 更新表結(jié)構(gòu)
在更新Shiro權(quán)限管理表結(jié)構(gòu)時,需要小心修改表結(jié)構(gòu),避免出現(xiàn)不兼容的問題。例如,如果刪除了某個字段,而該字段在應(yīng)用程序中被引用,則會導(dǎo)致應(yīng)用程序無法正常工作。
二、Shiro緩存更新
Shiro安全框架以緩存來提高性能,緩存分為權(quán)限緩存和會話緩存。Shiro權(quán)限緩存基于用戶、角色和權(quán)限信息,緩存這些信息提高Shiro性能。Shiro會話緩存則是緩存Shiro會話,會話緩存可以顯著提高應(yīng)用程序性能。當需要更新緩存時,需要注意以下幾個問題。
1. 更新頻率
在更新緩存時,需要注意更新頻率的問題,過于頻繁的緩存更新會導(dǎo)致性能下降,因此需要根據(jù)實際情況,選擇合適的緩存更新頻率。
2. 緩存清除
在緩存更新過程中,需要清除緩存中舊的數(shù)據(jù),否則會導(dǎo)致數(shù)據(jù)混亂。例如,當用戶密碼被更新時,需要清除緩存中該用戶的舊密碼數(shù)據(jù),否則用戶登錄時會出現(xiàn)認證失敗的問題。
3. 緩存更新機制
在更新緩存時需要考慮緩存更新機制,例如,當Shiro權(quán)限緩存更新時,需要考慮權(quán)限緩存數(shù)據(jù)的同步。即,當用戶、角色或權(quán)限表發(fā)生變更時,需要清除舊的權(quán)限緩存,并重新緩存新的權(quán)限數(shù)據(jù)。
三、Shiro密碼加密算法更新
在使用Shiro時,需要對密碼進行加密。Shiro提供了多種密碼加密算法,如MD5和SHA-1等。當需要修改密碼加密算法時,需要注意以下幾個問題。
1. 算法兼容性
在修改密碼加密算法時需要注意算法的兼容性問題,如果在應(yīng)用程序中采用了新的密碼加密算法,而Shiro權(quán)限管理表中保存的密碼使用的是舊的密碼加密算法,則會導(dǎo)致密碼無法匹配,用戶無法認證。
2. 數(shù)據(jù)庫升級腳本
在修改密碼加密算法后,需要將權(quán)限管理表中舊的密碼數(shù)據(jù)轉(zhuǎn)換為新的密碼加密算法。因此,在密碼加密算法更新時,需要同時更新數(shù)據(jù)庫升級腳本,以便實現(xiàn)舊密碼數(shù)據(jù)的轉(zhuǎn)換。
四、結(jié)論
Shiro安全框架是一個極具擴展性的Java安全框架,但是在使用Shiro時,需要特別注意數(shù)據(jù)庫更新問題,避免出現(xiàn)數(shù)據(jù)丟失和應(yīng)用程序無法正常工作的問題。因此,在更新Shiro數(shù)據(jù)庫時,需要認真對待,并充分測試,以確保Shiro安全框架正常運行。
相關(guān)問題拓展閱讀:
- java框架有哪些常用框架
- Shiro的 rememberMe 功能使用指導(dǎo)為什么rememberMe設(shè)置了沒作用
java框架有哪些常用框架
十大常用框架:
一、SpringMVC
二、Spring
三、Mybatis
四、Dubbo
五、Maven
六、RabbitMQ
七、Log4j
八、Ehcache
九、Redis
十、Shiro
延展閱讀:
一、SpringMVC
SpringWebMVC是一種基于Java的實現(xiàn)了WebMVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringWebMVC也是要簡化我們?nèi)粘eb開發(fā)的。
模型(Model)封裝了應(yīng)用程序的數(shù)據(jù)和一般他們會組成的POJO。
視圖(View)是負責呈現(xiàn)模型數(shù)據(jù)和一般它生成的HTML輸出,客戶端的瀏覽器能夠解釋。
控制器(Controller)負責處理用戶的請求,并建立適當?shù)哪P?,并把它傳遞給視圖渲染。
Spring的web模型-視圖-控制器(MVC)框架是圍繞著處理所有的HTTP請求和響應(yīng)的的設(shè)計。
SpringWebMVC處理請求的流程
具體執(zhí)行步驟如下:
1、首先用戶發(fā)送請求————>前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;圖2-1中的1、2步驟;
2、頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數(shù)到一個對象,這個對象在SpringWebMVC中叫命令對象,并進行驗證,然后將命令對象委托給業(yè)務(wù)對塌寬知象進行處理;處理完畢后返回一個(模型數(shù)據(jù)和邏輯視圖名);圖2-1中的3、4、5步驟;
3、前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;圖2-1中的步驟6、7;
4、前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶,圖2-1中的步驟8;至此整個結(jié)束。
二、Spring
2.1、IOC容器:wwwblogs/linjiqin/archive/2023/11/04/.html
IOC容器就是具有依賴注入功能的容器,IOC容器負責實例化、定位、巧和配置應(yīng)用程序中的對象及建立這些對象間的依賴。應(yīng)用程序無需直接在代碼中new相關(guān)的對象,應(yīng)用程序由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表者。
2.2、AOP:blog.csdn.net/moreevan/article/details/
簡單地說,就是將那些與業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責任封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可操作性團消和可維護性。AOP代表的是一個橫向的關(guān)系
AOP用來封裝橫切關(guān)注點,具體可以在下面的場景中使用:
權(quán)限
Caching緩存
Contextpassing內(nèi)容傳遞
Errorhandling錯誤處理
Lazyloading懶加載
Debugging調(diào)試
logging,tracing,profilingandmonitoring記錄跟蹤優(yōu)化校準
Performance性能優(yōu)化
Persistence持久化
Resourcepooling資源池
同步
事務(wù)
三、Mybatis
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis使用簡單的XML或注解用于配置和原始映射,將接口和Java的POJOs(PlainOldJavaObjects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。
總體流程:
(1)加載配置并初始化
觸發(fā)條件:加載配置文件
將SQL的配置信息加載成為一個個對象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲在內(nèi)存中。
(2)接收調(diào)用請求
觸發(fā)條件:調(diào)用Mybatis提供的API
傳入?yún)?shù):為SQL的ID和傳入?yún)?shù)對象
處理過程:將請求傳遞給下層的請求處理層進行處理。
(3)處理操作請求觸發(fā)條件:API接口層傳遞請求過來
傳入?yún)?shù):為SQL的ID和傳入?yún)?shù)對象
處理過程:
(A)根據(jù)SQL的ID查找對應(yīng)的對象。
(B)根據(jù)傳入?yún)?shù)對象解析對象,得到最終要執(zhí)行的SQL和執(zhí)行傳入?yún)?shù)。
(C)獲取數(shù)據(jù)庫連接,根據(jù)得到的最終SQL語句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫執(zhí)行,并得到執(zhí)行結(jié)果。
(D)根據(jù)對象中的結(jié)果映射配置對得到的執(zhí)行結(jié)果進行轉(zhuǎn)換處理,并得到最終的處理結(jié)果。
(E)釋放連接資源。
(4)返回處理結(jié)果將最終的處理結(jié)果返回。
MyBatis最強大的特性之一就是它的動態(tài)語句功能。如果您以前有使用JDBC或者類似框架的經(jīng)歷,您就會明白把SQL語句條件連接在一起是多么的痛苦,要確保不能忘記空格或者不要在columns列后面省略一個逗號等。動態(tài)語句能夠完全解決掉這些痛苦。
四、Dubbo
Dubbo是一個分布式服務(wù)框架,致力于提供高性能和透明化的RPC(遠程過程調(diào)用協(xié)議)遠程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案。簡單的說,bbo就是個服務(wù)框架,如果沒有分布式的需求,其實是不需要用的,只有在分布式的時候,才有bbo這樣的分布式服務(wù)框架的需求,并且本質(zhì)上是個服務(wù)調(diào)用的東東,說白了就是個遠程服務(wù)調(diào)用的分布式框架。
1、透明化的遠程方法調(diào)用,就像調(diào)用本地方法一樣調(diào)用遠程方法,只需簡單配置,沒有任何API侵入。
2、軟負載均衡及容錯機制,可在內(nèi)網(wǎng)替代F5等硬件負載均衡器,降低成本,減少單點。
3、服務(wù)自動注冊與發(fā)現(xiàn),不再需要寫死服務(wù)提供方地址,注冊中心基于接口名查詢服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者。
節(jié)點角色說明:
Provider:暴露服務(wù)的服務(wù)提供方。
Consumer:調(diào)用遠程服務(wù)的服務(wù)消費方。
Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心。
Monitor:統(tǒng)計服務(wù)的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心。
Container:服務(wù)運行容器。
五、Maven
Maven這個個項目管理和構(gòu)建自動化工具,越來越多的開發(fā)人員使用它來管理項目中的jar包。但是對于我們程序員來說,我們最關(guān)心的是它的項目構(gòu)建功能。
六、RabbitMQ
消息隊列一般是在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節(jié)省了服務(wù)器的請求響應(yīng)時間,從而提高了系統(tǒng)的吞吐量。
RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務(wù)器。
Erlang是一門動態(tài)類型的函數(shù)式編程語言。對應(yīng)到Erlang里,每個Actor對應(yīng)著一個Erlang進程,進程之間通過消息傳遞進行通信。相比共享內(nèi)存,進程間通過消息傳遞來通信帶來的直接好處就是消除了直接的鎖開銷(不考慮Erlang虛擬機底層實現(xiàn)中的鎖應(yīng)用)。
AMQP(AdvancedMessageQueueProtocol)定義了一種消息系統(tǒng)規(guī)范。這個規(guī)范描述了在一個分布式的系統(tǒng)中各個子系統(tǒng)如何通過消息交互。
七、Log4j
日志記錄的優(yōu)先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
八、Ehcache
EhCache是一個純Java的進程內(nèi)緩存框架,具有快速、精干等特點,是Hibernate中默認的。Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,JavaEE和輕量級容器。它具有內(nèi)存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAPapi等特點。
優(yōu)點:
1、快速
2、簡單
3、多種緩存策略
4、緩存數(shù)據(jù)有兩級:內(nèi)存和磁盤,因此無需擔心容量問題
5、緩存數(shù)據(jù)會在虛擬機重啟的過程中寫入磁盤
6、可以通過RMI、可插入API等方式進行分布式緩存
7、具有緩存和緩存管理器的偵聽接口
8、支持多緩存管理器實例,以及一個實例的多個緩存區(qū)域
9、提供Hibernate的緩存實現(xiàn)
缺點:
1、使用磁盤Cache的時候非常占用磁盤空間:這是因為DiskCache的算法簡單,該算法簡單也導(dǎo)致Cache的效率非常高。它只是對元素直接追加存儲。因此搜索元素的時候非常的快。如果使用DiskCache的,在很頻繁的應(yīng)用中,很快磁盤會滿。
2、不能保證數(shù)據(jù)的安全:當突然kill掉java的時候,可能會產(chǎn)生沖突,EhCache的解決方法是如果文件沖突了,則重建cache。這對于Cache數(shù)據(jù)需要保存的時候可能不利。當然,Cache只是簡單的加速,而不能保證數(shù)據(jù)的安全。如果想保證數(shù)據(jù)的存儲安全,可以使用BekeleyDBJavaEdition版本。這是個嵌入式數(shù)據(jù)庫??梢源_保存儲安全和空間的利用率。
九、Redis
redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set()、zset(sortedset_有序)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。
Redis數(shù)據(jù)庫完全在內(nèi)存中,使用磁盤僅用于持久性。相比許多鍵值數(shù)據(jù)存儲,Redis擁有一套較為豐富的數(shù)據(jù)類型。Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從服務(wù)器。
1.2、Redis優(yōu)點:
(1)異??焖伲篟edis的速度非???,每秒能執(zhí)行約11萬,每秒約81000條記錄。
(2)支持豐富的數(shù)據(jù)類型:Redis支持更大多數(shù)開發(fā)人員已經(jīng)知道像列表,,有序,散列數(shù)據(jù)類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數(shù)據(jù)類型更好。
(3)操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務(wù)器將獲得更新后的值。
(4)多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發(fā)布/訂閱),任何短暫的數(shù)據(jù),應(yīng)用程序,如Web應(yīng)用程序會話,網(wǎng)頁命中計數(shù)等。
1.3、Redis缺點:
(1)單線程
(2)耗內(nèi)存
十、Shiro
ApacheShiro是Java的一個安全框架,旨在簡化身份驗證和授權(quán)。Shiro在JavaSE和JavaEE項目中都可以使用。它主要用來處理身份認證,授權(quán),企業(yè)會話管理和加密等。Shiro的具體功能點如下:
(1)身份認證/登錄,驗證用戶是不是擁有相應(yīng)的身份;
(2)授權(quán),即權(quán)限驗證,驗證某個已認證的用戶是否擁有某個權(quán)限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色?;蛘呒毩6鹊尿炞C某個用戶對某個資源是否具有某個權(quán)限;
(3)會話管理,即用戶登錄后就是一次會話,在沒有退出之前,它的所有信息都在會話中;會話可以是普通JavaSE環(huán)境的,也可以是如Web環(huán)境的;
(4)加密,保護數(shù)據(jù)的安全性,如密碼加密存儲到數(shù)據(jù)庫,而不是明文存儲;
(5)Web支持,可以非常容易的集成到Web環(huán)境;
Caching:緩存,比如用戶登錄后,其用戶信息、擁有的角色/權(quán)限不必每次去查,這樣可以提高效率;
(6)shiro支持多線程應(yīng)用的并發(fā)驗證,即如在一個線程中開啟另一個線程,能把權(quán)限自動傳播過去;
(7)提供測試支持;
(8)允許一個用戶假裝為另一個用戶(如果他們允許)的身份進行訪問;
(9)記住我,這個是非常常見的功能,即一次登錄后,下次再來的話不用登錄了。
Shiro的 rememberMe 功能使用指導(dǎo)為什么rememberMe設(shè)置了沒作用
官方清缺的文檔有說明,isRemembered和isAuthenticated是互斥的
isRemembered是在服務(wù)器上記錄一個cookie說明你這個用戶登陸過并答塌辯且被記住了
效果類似于亞馬遜頁面上,他會記衫孝住近期登陸過的用戶(Subject)
但是你進行敏感操作的時候還是要重新登錄敲賬號密碼的,也就是必須重新進行Authentication
也就是說如果你的攔截器配置了authc或者其他需要認證之后才能使用的
shiro的rememberMe功能就不起作用了
印象中有一個url攔截器可以過濾這個,不記得名字了
采用這個解決方案的前提是,你必須自己先實現(xiàn)一個realm,不過這個我相信大家都會實現(xiàn)的,畢竟默認的不是jdbcRealm ,真正的項目都是要查數(shù)據(jù)庫才能確定用戶是否登錄的。那么我就假定大家的項目中都有那么一個負責驗證登錄的 JdbcRealm, 并且是采用用戶名密碼認證的,在 doGetAuthenticationInfo 方法里面是采用如下的方轎枯穗法來做認證
…
info = new SimpleAuthenticationInfo(username, password.toCharArray(), getName());
這個前提條件保證你的閉卜principal是username,相信大部分人根據(jù)教程做shiro的時候都采用了這種方式
STEP1 復(fù)寫 FormAuthenticationFilter 的 isAccessAllowed 方法敗枯
做一個新類繼承FormAuthenticationFilter ,并復(fù)寫 isAccessAllowed 方法
package com.yqr.jxc.shiro;
import javax.annotation.Resource;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import com.yqr.jxc.service.global.GlobalUserService;
public class RememberAuthenticationFilter extends FormAuthenticationFilter {
@Resource(name=”globalUserService”)
private GlobalUserService globalUserService;
/**
* 這個方法決定了是否能讓用戶登錄
*/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//如果 isAuthenticated 為 false 證明不是登錄過的,同時 isRememberd 為true 證明是沒登陸直接通過記住我功能進來的
if(!subject.isAuthenticated() && subject.isRemembered()){
//獲取session看看是不是空的
Session session = subject.getSession(true);
//隨便拿session的一個屬性來看session當前是否是空的,我用userId,你們的項目可以自行發(fā)揮
if(session.getAttribute(“userId”) == null){
//如果是空的才初始化,否則每次都要初始化,項目得慢死
//這邊根據(jù)前面的前提假設(shè),拿到的是username
String username = subject.getPrincipal().toString();
//在這個方法里面做初始化用戶上下文的事情,比如通過查詢數(shù)據(jù)庫來設(shè)置session值,你們自己發(fā)揮
globalUserService.initUserContext(username, subject);
}
}
//這個方法本來只返回 subject.isAuthenticated() 現(xiàn)在我們加上 subject.isRemembered() 讓它同時也兼容remember這種情況
return subject.isAuthenticated() || subject.isRemembered();
}
}
STEP2 設(shè)置使用這個新的 AuthenticationFilter (認證過濾器)
如果你用的是spring那么
…
/** = rememberAuthFilter
…
如果你用的是 ini 文件,那么
rememberAuthFilter=com.yqr.jxc.shiro.RememberAuthenticationFilter
#將之前的 /** = authc 替換成 rememberAuthFilter
…
/** = rememberAuthFilter
然后重啟項目我們來測試一下,先登錄一次系統(tǒng),然后直接關(guān)掉瀏覽器,然后打開瀏覽器直接輸入系統(tǒng)某個頁面的地址,發(fā)現(xiàn)可以直接進去了,session什么的也設(shè)置好了
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機房服務(wù)器托管租用。
網(wǎng)頁名稱:Shiro安全框架:數(shù)據(jù)庫更新注意事項 (shiro更新數(shù)據(jù)庫)
文章源于:http://www.5511xx.com/article/dhjooge.html


咨詢
建站咨詢
