摘要:的很容易反映出常見的工作流程。權(quán)限檢查是執(zhí)行授權(quán)的另一種方式。在安全框架領(lǐng)域提供了一些獨(dú)特的東西一致的會(huì)話,可用于任何應(yīng)用程序和任何架構(gòu)層。
1. Apache Shiro 四基石Apache Shiro?是一個(gè)功能強(qiáng)大且易于使用的Java安全框架,可執(zhí)行身份驗(yàn)證,授權(quán),加密和會(huì)話管理。借助Shiro易于理解的API,可以快速輕松地保護(hù)任何應(yīng)用程序 - 從最小的移動(dòng)應(yīng)用程序到最大的Web和企業(yè)應(yīng)用程序。
shiro通過以下為平臺的應(yīng)用程序的提供安全API。
Authentication : 身份認(rèn)證,通常稱為 “用戶登錄”。
Authorization:授權(quán)。
Crpytography:保護(hù)或隱藏會(huì)被窺探的數(shù)據(jù)。
Session Management:會(huì)話session管理
shiro提供一些輔助功能,如:Web應(yīng)用程序安全、單元測試、多線程支持,但都圍繞這四基石為準(zhǔn)。
1.1 Authentication身份驗(yàn)證是驗(yàn)證用戶身份的過程。也就是說,當(dāng)用戶使用應(yīng)用程序進(jìn)行身份驗(yàn)證時(shí),他們證明他們實(shí)際上是他們所說的人。這有時(shí)也被稱為“登錄”。這通常是一個(gè)三步過程。
收集用戶的標(biāo)識信息,稱為主體,并支持身份證明,稱為憑證。
將主體和憑據(jù)提交給系統(tǒng)。
如果提交的憑據(jù)與系統(tǒng)對該用戶標(biāo)識(主體)的期望值匹配,則認(rèn)為該用戶已通過身份驗(yàn)證。如果它們不匹配,則不會(huì)將用戶視為已通過身份驗(yàn)證。
每個(gè)人都熟悉的這個(gè)過程的一個(gè)常見例子是用戶名/密碼組合。當(dāng)大多數(shù)用戶登錄軟件應(yīng)用程序時(shí),他們通常會(huì)提供用戶名(主體)和支持密碼(憑證)。如果存儲(chǔ)在系統(tǒng)中的密碼(或其表示)與用戶指定的密碼匹配,則認(rèn)為它們已經(jīng)過身份驗(yàn)證。
Shiro以簡單直觀的方式支持相同的工作流程。正如我們所說,Shiro有一個(gè)以主題為中心的API - 幾乎所有你在運(yùn)行時(shí)用Shiro做的事都是通過與當(dāng)前正在執(zhí)行的Subject進(jìn)行交互來實(shí)現(xiàn)的。因此,要登錄主題,只需調(diào)用其登錄方法,傳遞一個(gè)AuthenticationToken實(shí)例,該實(shí)例表示提交的主體和憑據(jù)(在本例中為用戶名和密碼)。
//1. Acquire submitted principals and credentials:
AuthenticationToken token = new UsernamePasswordToken(username, password);
//2. Get the current Subject:
Subject currentUser = SecurityUtils.getSubject();
//3. Login:
currentUser.login(token);
Shiro的API很容易反映出常見的工作流程。您將繼續(xù)將此簡單性視為所有主題操作的主題。調(diào)用login方法時(shí),SecurityManager將接收AuthenticationToken并將其分派給一個(gè)或多個(gè)已配置的域,以允許每個(gè)域根據(jù)需要執(zhí)行身份驗(yàn)證檢查。每個(gè)Realm都能夠根據(jù)需要對提交的AuthenticationTokens做出反應(yīng)。但是如果登錄嘗試失敗會(huì)發(fā)生什么?如果用戶指定了錯(cuò)誤的密碼該怎么辦?您可以通過對Shiro的運(yùn)行時(shí)AuthenticationException作出反應(yīng)來處理故障.
//3. Login:
try {
currentUser.login(token);
} catch (IncorrectCredentialsException ice) { …
} catch (LockedAccountException lae) { …
}
…
catch (AuthenticationException ae) {…
}
可以選擇捕獲其中一個(gè)AuthenticationException子類并進(jìn)行具體反應(yīng),或者通常處理任何AuthenticationException(例如,向用戶顯示通用的“不正確的用戶名或密碼”消息)。根據(jù)應(yīng)用要求,您可以選擇。
在成功登錄主題后,它們將被視為已通過身份驗(yàn)證,通常您允許它們使用您的應(yīng)用程序。但僅僅因?yàn)橛脩糇C明了他們的身份并不意味著他們可以在您的應(yīng)用程序中做任何他們想做的事情。這引出了下一個(gè)問題,“我如何控制允許用戶做什么?”決定允許用戶做什么稱為授權(quán)。我們將介紹Shiro如何啟用授權(quán)。
1.2 Authorization授權(quán)本質(zhì)上是訪問控制 - 控制用戶可以在應(yīng)用程序中訪問的內(nèi)容,例如資源,網(wǎng)頁等。大多數(shù)用戶通過使用角色和權(quán)限等概念來執(zhí)行訪問控制。也就是說,通常允許用戶基于分配給他們的角色和/或許可來做某事或不做某事。然后,您的應(yīng)用程序可以根據(jù)對這些角色和權(quán)限的檢查來控制公開的功能。正如您所料,Subject API允許您非常輕松地執(zhí)行角色和權(quán)限檢查。例如,清單7中的代碼片段顯示了如何檢查Subject是否已分配了某個(gè)角色。
if ( subject.hasRole(“administrator”) ) {
//show the ‘Create User’ button
} else {
//grey-out the button");
}
權(quán)限檢查是執(zhí)行授權(quán)的另一種方式。如上例所示檢查角色會(huì)遇到一個(gè)重大缺陷:您無法在運(yùn)行時(shí)添加或刪除角色。代碼使用角色名稱進(jìn)行了硬編碼,因此如果您更改了角色名稱和/或配置,您的代碼就會(huì)被破壞!如果需要能夠在運(yùn)行時(shí)更改角色的含義,或者根據(jù)需要添加或刪除角色,則必須依賴其他內(nèi)容。
if ( subject.isPermitted(“user:create”) ) {
//show the ‘Create User’ button
} else {
//grey-out the button");
}
通過擁有反映應(yīng)用程序原始功能的權(quán)限,只需要更改權(quán)限更改應(yīng)用程序的功能時(shí)檢查。反過來,您可以在運(yùn)行時(shí)根據(jù)需要為角色或用戶分配權(quán)限。
這樣,任何分配了“user:create”權(quán)限的角色或用戶都可以單擊“創(chuàng)建用戶”按鈕,這些角色和分配甚至可以在運(yùn)行時(shí)更改,提供非常靈活的安全模型。
“user:create”字符串是遵循某些解析約定的權(quán)限字符串的示例。Shiro通過WildcardPermission開箱即用,支持這種約定。WildcardPermission在創(chuàng)建安全策略時(shí)非常靈活,甚至支持實(shí)例級訪問控制等內(nèi)容。
if ( subject.isPermitted(“user:delete:jsmith”) ) {
//delete the ‘jsmith’ user
} else {
//don’t delete ‘jsmith’
}
1.3 Session Management
Apache Shiro在安全框架領(lǐng)域提供了一些獨(dú)特的東西:
? 一致的會(huì)話API,可用于任何應(yīng)用程序和任何架構(gòu)層。也就是說,Shiro為任何應(yīng)用程序啟用了會(huì)話編程范例 - 從小型守護(hù)程序獨(dú)立應(yīng)用程序到最大的集群Web應(yīng)用程序。這意味著希望使用會(huì)話的應(yīng)用程序開發(fā)人員不再需要使用Servlet或EJB容器,否則就不需要它們。
但也許Shiro會(huì)話最重要的好處之一就是它們與容器無關(guān)。這具有微妙但極其強(qiáng)大的含義。例如,
讓我們考慮會(huì)話群集。有多少特定于容器的方法來集群會(huì)話以進(jìn)行容錯(cuò)和故障轉(zhuǎn)移?Tomcat的做法與Jetty有所不同,它與Websphere等不同。但是通過Shiro會(huì)話,您可以獲得與容器無關(guān)的群集解決方案。Shiro的體系結(jié)構(gòu)允許可插入的Session數(shù)據(jù)存儲(chǔ),例如企業(yè)緩存,關(guān)系數(shù)據(jù)庫,NoSQL系統(tǒng)等。這意味著您可以配置一次會(huì)話群集,無論您的部署環(huán)境如何( Tomcat,Jetty,JEE Server或獨(dú)立應(yīng)用程序),它都將以相同的方式工作。 2. Shiro會(huì)話的另一個(gè)好處是,如果需要,可以跨客戶端技術(shù)共享會(huì)話數(shù)據(jù)。例如,如果需要,Swing桌面客戶端可以參與同一個(gè)Web應(yīng)用程序會(huì)話 - 如果最終用戶同時(shí)使用兩者,則會(huì)很有用。那么如何在任何環(huán)境中訪問主題會(huì)話?有兩種主題方法,如下例所示:
Session session = subject.getSession();
Session session = subject.getSession(boolean create);
? 這些方法在概念上與HttpServletRequest API相同。第一種方法將返回Subject的現(xiàn)有Session,或者如果還沒有,它將創(chuàng)建一個(gè)新的并返回它。第二種方法接受一個(gè)布爾參數(shù),該參數(shù)確定是否將創(chuàng)建新的Session(如果它尚不存在)。獲得主題會(huì)話后,您幾乎可以使用它與HttpSession相同。Shiro團(tuán)隊(duì)認(rèn)為HttpSession API對Java開發(fā)人員來說最為舒適,因此我們保留了很多感覺。當(dāng)然,最大的區(qū)別在于您可以在任何應(yīng)用程序中使用Shiro Sessions,而不僅僅是Web應(yīng)用程序。
Session session = subject.getSession(); session.getAttribute(“key”, someValue); Date start = session.getStartTimestamp(); Date timestamp = session.getLastAccessTime(); session.setTimeout(millis); ...1.4 Cryptography
加密是為了混淆或隱藏?cái)?shù)據(jù),所以,第三方不能窺探到對應(yīng)數(shù)據(jù)。Shiro的加密使用了JDK的相關(guān)加密。
Cryptography在加密中包含了:
hashes加密
密碼加密
JDK中的MessageDigest
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.digest(bytes);
byte[] hashed = md.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
shiro的hash
String encodedPassword = new Sha512Hash(password,salt,count).toBase64();
與JDK的Cipher API相比,Shiro示例更簡單:
您可以直接實(shí)例化CipherService - 沒有奇怪或令人困惑的工廠方法。
密碼配置選項(xiàng)表示為兼容JavaBeans的getter和setter - 沒有奇怪且難以理解的“轉(zhuǎn)換字符串”。
加密和解密在單個(gè)方法調(diào)用中執(zhí)行。
沒有強(qiáng)制檢查異常。如果你愿意,可以抓住Shiro的CryptoException
Shiro的CipherService API還有其他好處,例如支持基于字節(jié)數(shù)組的加密/解密(稱為“塊”操作)以及基于流的加密/解密(例如,加密音頻或視頻)的能力。
Java密碼學(xué)不需要痛苦。Shiro的加密支持旨在簡化您保護(hù)數(shù)據(jù)安全的工作。
2. Apache Shiro 三大主要概念Shiro的架構(gòu)有三個(gè)主要概念 - Subject,SecurityManager和Realms。
2. 1 Subject? Subject 這個(gè)詞是一個(gè)安全術(shù)語,基本上是指“當(dāng)前正在執(zhí)行的用戶”。但它不被稱為“用戶”,因?yàn)椤坝脩簟边@個(gè)詞通常與人類有關(guān)。在安全的世界,術(shù)語“主題”可以指一個(gè)人,但也有可能是進(jìn)程,守護(hù)進(jìn)程帳戶,或任何類似。它只是意味著“當(dāng)前與軟件交互的東西”。但是,對于大多數(shù)意圖和目的,我們可以將其視為Shiro的“用戶”概念。您可以在代碼中的任何位置輕松獲取Shiro Subject,如下所示。
import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();
? 獲得 Subject 后,可以立即訪問當(dāng)前用戶希望使用Shiro執(zhí)行的90%所有的操作的信息,例如登錄,注銷,訪問其會(huì)話,執(zhí)行授權(quán)檢查等等 。但稍后會(huì)詳細(xì)介紹。這里的關(guān)鍵點(diǎn)是Shiro的API在很大程度上是直觀的,因?yàn)樗从沉碎_發(fā)人員在 ‘per-user’ 安全控制中思考的自然傾向。在代碼中的任何位置訪問主題也很容易,允許在需要的任何地方進(jìn)行安全操作。
2.2 SecurityManagerSubject 的管理者則為 SecurityManager 。Subject表示當(dāng)前用戶的操作模式,而 SecurityManager 管理 所有用戶 的安全操作。SecurityManager 是Shiro的核心,充當(dāng)一種“傘形”對象,它引用了許多形成對象圖的內(nèi)部嵌套安全組件。
每個(gè)應(yīng)用程序幾乎總是有一個(gè)SecurityManager實(shí)例。它本質(zhì)上是一個(gè)應(yīng)用程序單例(盡管它不需要是靜態(tài)單例)。與Shiro中的幾乎所有內(nèi)容一樣,默認(rèn)的SecurityManager實(shí)現(xiàn)是POJO,可以使用任何兼容POJO的配置機(jī)制進(jìn)行配置 - 普通Java代碼,Spring XML,YAML,.properties和.ini文件等。基本上任何能夠?qū)嵗臇|西可以使用類和調(diào)用JavaBeans兼容的方法。
[main] cm = org.apache.shiro.authc.credential.HashedCredentialsMatcher cm.hashAlgorithm = SHA-512 cm.hashIterations = 1024 #Base64 encoding(less text): cm.storedCredentialsHexEncoded = false iniRealm.credentialsMatcher = $cm [users] jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2 asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB
從以上配置中,我們可以看到使用INI配置Shiro時(shí),有兩個(gè)關(guān)鍵配置項(xiàng):[main] 和 [users]
[main]部分用于配置SecurityManager對象和/或SecurityManager使用的任何對象(如Realms)。在此示例中,我們看到正在配置兩個(gè)對象:
cm對象,是Shiro的HashedCredentialsMatcher類的一個(gè)實(shí)例。如您所見,cm實(shí)例的各種屬性正在通過"嵌套點(diǎn)"語法(清單3中所示的IniSecurityManagerFactory使用的約定)來配置,以表示對象圖導(dǎo)航和屬性設(shè)置。
iniRealm對象,它是SecurityManager用于表示以INI格式定義的用戶帳戶的組件。
在[users]部分指定用戶帳戶的靜態(tài)列表 - 方便簡單應(yīng)用程序或測試時(shí)。
// 1。加載INI配置
Factory factory =
new IniSecurityManagerFactory(“classpath:shiro.ini”);
// 2。創(chuàng)建SecurityManager
SecurityManager securityManager = factory.getInstance();
// 3。使其可訪問
SecurityUtils.setSecurityManager(securityManager);
3. Realms
Realms充當(dāng)Shiro與應(yīng)用程序的“橋梁”或‘連接器“,也就是說,當(dāng)實(shí)際與安全相關(guān)的數(shù)據(jù)(如用戶帳戶)進(jìn)行交互以執(zhí)行身份驗(yàn)證(登錄)和授權(quán)(訪問控制)時(shí),Shiro會(huì)從為應(yīng)用程序配置的一個(gè)或多個(gè)領(lǐng)域中查找許多這些內(nèi)容。
Realm本質(zhì)上是一個(gè)特定于安全性的DAO:它封裝了數(shù)據(jù)源的連接細(xì)節(jié),并根據(jù)需要使相關(guān)數(shù)據(jù)可用于Shiro。配置Shiro時(shí),必須至少指定一個(gè)Realm用于身份驗(yàn)證和/或授權(quán)??梢耘渲枚鄠€(gè)Realm,但至少需要一個(gè)。
Shiro提供了開箱即用的Realms,可以連接到許多安全數(shù)據(jù)源(也稱為目錄),如LDAP,關(guān)系數(shù)據(jù)庫(JDBC),文本配置源(如INI和屬性文件等)。如果默認(rèn)域不符合您的需要,可以插入自己的Realm實(shí)現(xiàn)來表示自定義數(shù)據(jù)源。
[main] ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm ldapRealm.userDnTemplate = uid={0},ou=users,dc=mycompany,dc=com ldapRealm.contextFactory.url = ldap://ldapHost:389 ldapRealm.contextFactory.authenticationMechanism = DIGEST-MD54. Web Support
通過配置網(wǎng)絡(luò)請求、限制等,以此達(dá)到請求攔截,以及過濾請求,并將請求到對應(yīng)資源。
配置網(wǎng)絡(luò)過濾:
<filter>
<filter-name>ShiroFilterfilter-name>
<filter-class>
org.apache.shiro.web.servlet.IniShiroFilter
filter-class>
filter>
<filter-mapping>
<filter-name>ShiroFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
此過濾器可以讀取前面提到的shiro.ini配置,因此無論部署環(huán)境如何,您都可以獲得一致的配置體驗(yàn)。配置完成后,Shiro過濾器將過濾每個(gè)請求,并確保在請求期間可以訪問特定于請求的主題。并且因?yàn)樗鼤?huì)過濾每個(gè)請求,您可以執(zhí)行特定于安全性的邏輯,以確保只允許滿足特定條件的請求。
4.1 特定于URL的篩選器鏈Shiro通過其創(chuàng)新的URL過濾器鏈接功能支持特定于安全性的過濾規(guī)則。它允許您為任何匹配的URL模式指定ad-hoc過濾器鏈。這意味著您可以使用Shiro的過濾機(jī)制在執(zhí)行安全規(guī)則(或規(guī)則組合)方面具有很大的靈活性 - 遠(yuǎn)遠(yuǎn)超過您可以多帶帶在web.xml中定義過濾器。
[urls] /assets/** = anon /user/signup = anon /user/** = user /rpc/rest/** = perms[rpc:invoke], authc /** = authc
上面看到的過濾器名稱(anon,user,perms,authc)是Shiro提供的特殊安全相關(guān)過濾器。可以混合和匹配這些安全篩選器,以創(chuàng)建非常自定義的安全體驗(yàn)。還可以指定您可能擁有的任何其他現(xiàn)有Servlet過濾器。
4.2 網(wǎng)絡(luò)會(huì)話管理對于Web應(yīng)用程序,Shiro默認(rèn)其會(huì)話基礎(chǔ)結(jié)構(gòu)使用我們以前習(xí)慣的現(xiàn)有Servlet容器會(huì)話。也就是說,當(dāng)你調(diào)用方法 subject.getSession()和 subject.getSession(boolean)時(shí),Shiro將返回由Servlet容器的HttpSession實(shí)例支持的Session實(shí)例。
這種方法的優(yōu)點(diǎn)在于調(diào)用subject.getSession()的業(yè)務(wù)層代碼與Shiro Session實(shí)例交互 - 它沒有“知識”它正在使用基于Web的HttpSession對象。在跨建筑層保持清潔分離時(shí),這是一件非常好的事情。
如果已經(jīng)在Web應(yīng)用程序中啟用了Shiro的本機(jī)會(huì)話管理,因?yàn)樾枰猄hiro的企業(yè)會(huì)話功能(如與容器無關(guān)的群集),當(dāng)然希望HttpServletRequest.getSession()和HttpSession API與“本機(jī)”會(huì)話一起使用,不是servlet容器會(huì)話。
如果你必須重構(gòu)任何使用HttpServletRequest和HttpSession API的代碼來改為使用Shiro的Session API,那將是非常令人沮喪的。Shiro當(dāng)然不會(huì)指望你這樣做。相反,Shiro完全實(shí)現(xiàn)了Servlet規(guī)范的Session部分,以支持Web應(yīng)用程序中的本機(jī)會(huì)話。這意味著無論何時(shí)調(diào)用相應(yīng)的HttpServletRequest或HttpSession方法調(diào)用,Shiro都會(huì)將這些調(diào)用委托給其內(nèi)部本地Session API。
5. Apache Shiro框架 “彩蛋”Apache Shiro框架中還有其他一些對保護(hù)Java應(yīng)用程序有用的功能,例如:
跨線程維護(hù)主題的線程和并發(fā)支持(Executor和ExecutorService支持)
Callable和Runnable支持將邏輯作為特定主題執(zhí)行
“運(yùn)行為”支持假設(shè)另一個(gè)主題的身份(例如在管理應(yīng)用程序中有用)
測試線束支持,使得在單元和集成測試中完全測試Shiro安全代碼非常容易
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7246.html
摘要:簡介為一個(gè)基于框架的微服務(wù)方案以下簡稱其余略文檔簡介簡介首先關(guān)于以及等介紹以及微服務(wù)的概念在此略過本文中介紹的方法基于框架但實(shí)現(xiàn)思路和核心類應(yīng)該可以在其他框架中通用一首先闡述一下研究這個(gè)東西的出發(fā)點(diǎn)一開始在中也是使用的配置文件完成對的配置的 Nutzboot簡介: ?NutzBoot為一個(gè)基于Nutz框架的微服務(wù)方案,以下簡稱NB!其余略... ?NB文檔簡介:http://www.n...
摘要:大家好,今天給大家分享一個(gè)權(quán)限管理的框架的,說實(shí)話本來我是準(zhǔn)備看的,畢竟是家族的框架,和整合更加容易一些。官方給出的介紹是是一個(gè)強(qiáng)大且易用的安全框架執(zhí)行身份驗(yàn)證授權(quán)密碼學(xué)和會(huì)話管理。由此可知,的主要功能是認(rèn)證授權(quán)加密密和會(huì)話管理。 showImg(https://segmentfault.com/img/bV1BsT?w=1726&h=256); 大家好,今天給大家分享一個(gè)權(quán)限管理的框...
摘要:大家好,今天給大家分享一個(gè)權(quán)限管理的框架的,說實(shí)話本來我是準(zhǔn)備看的,畢竟是家族的框架,和整合更加容易一些。官方給出的介紹是是一個(gè)強(qiáng)大且易用的安全框架執(zhí)行身份驗(yàn)證授權(quán)密碼學(xué)和會(huì)話管理。由此可知,的主要功能是認(rèn)證授權(quán)加密密和會(huì)話管理。 showImg(https://segmentfault.com/img/bV1BsT?w=1726&h=256); 大家好,今天給大家分享一個(gè)權(quán)限管理的框...
閱讀 1695·2023-04-25 20:16
閱讀 3882·2021-10-09 09:54
閱讀 2713·2021-09-04 16:40
閱讀 2527·2019-08-30 15:55
閱讀 843·2019-08-29 12:37
閱讀 2749·2019-08-26 13:55
閱讀 2918·2019-08-26 11:42
閱讀 3164·2019-08-23 18:26