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