文章目錄
- 前言
- 一、Shrio
- 1、什么是shiro
- 2、為什么使用shrio
- 二、主要類
- 2.1、Subject
- 2.2、SecurityManager
- 2.3、Realms
- 三、認證授權
- 3.1、認證(Authentication)
- 3.2、授權(authorization)
- 四、入門示例
- 參考文章
前言
簡單入門介紹
一、Shrio
http://shiro.apache.org/
1、什么是shiro
Apache Shiro?(trademark)是一個功能強大且易于使用的Java安全框架,用于執行身份驗證,授權,加密和會話管理。使用Shiro易于理解的API,您可以快速輕松地保護任何應用程序-從最小的移動應用程序到最大的Web和企業應用程序。
2、為什么使用shrio
易于使用 -易于使用是該項目的最終目標。應用程序安全性可能非常令人困惑和沮喪,并被視為“必要的邪惡”。如果您使它易于使用,以使新手程序員可以開始使用它,那么就不必再痛苦了。
全面 -Apache Shiro聲稱沒有其他具有范圍廣度的安全框架,因此它很可能是滿足安全需求的“一站式服務”。
靈活 -Apache Shiro可以在任何應用程序環境中工作。盡管它可以在Web,EJB和IoC環境中運行,但并不需要它們。Shiro也不要求任何規范,甚至沒有很多依賴性。
具有Web功能 -Apache Shiro具有出色的Web應用程序支持,允許您基于應用程序URL和Web協議(例如REST)創建靈活的安全策略,同時還提供一組JSP庫來控制頁面輸出。
可插拔 -Shiro干凈的API和設計模式使它易于與許多其他框架和應用程序集成。您會看到Shiro與Spring,Grails,Wicket,Tapestry,Mule,Apache Camel,Vaadin等框架無縫集成。
支持 -Apache Shiro是Apache Software Foundation(Apache軟件基金會)的一部分,該組織被證明以其社區的最大利益行事。項目開發和用戶群體友好的公民隨時可以提供幫助。如果需要,像Katasoft這樣的商業公司也可以提供專業的支持和服務。
二、主要類
2.1、Subject
import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
Subject currentUser = SecurityUtils.getSubject();
Subject一詞是一個安全術語,基本上表示“當前正在執行的用戶”。
它只是意味著“當前正在與軟件交互的東西”。它只是不被稱為“用戶”,因為“用戶”一詞通常與人類相關聯。在安全的世界,術語“主題”可以指一個人,但也有會談進程,守護進程帳戶,或任何類似。
2.2、SecurityManager
主題的“幕后”對應對象是SecurityManager。主題代表當前用戶的安全操作,而SecurityManager管理所有用戶的安全操作。它是Shiro體系結構的核心,
并充當一種“傘”對象,引用了許多內部嵌套的安全組件,這些安全組件構成了一個對象圖。它管理著所有 Subject、且負責進行認證和授權、及會話、緩存的管理。
每個應用程序幾乎總是有一個SecurityManager實例。它本質上是一個應用程序單例(盡管不必是靜態單例)普通的Java代碼,Spring XML,YAML,.properties和.ini文件等進行配置
ini文件方式,實例化SecurityManager 配置:
#CredentialsMatcher 認證匹配器
cm = org.apache.shiro.authc.credential.HashedCredentials
Matcher
cm.hashAlgorithm = SHA-512
cm.hashIterations = 1024
#Base64 encoding (less text):
cm.storedCredentialsHexEncoded = false
[users]
jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB
[roles]
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.Factory;
// 1。加載INI配置
Factory factory =
new IniSecurityManagerFactory(“ classpath:shiro.ini”);
// 2。創建SecurityManager
SecurityManager securityManager = factory.getInstance();
// 3。使它可訪問
SecurityUtils.setSecurityManager(securityManager);
2.3、Realms
Realms充當Shiro與應用程序的安全數據之間的“橋梁”或“連接器”,
也就是說,當需要真正與安全性相關的數據(例如用戶帳戶)進行交互以執行身份驗證(登錄)和授權(訪問控制)時,Shiro會從為應用程序配置的一個或多個Realms中查找其中的許多內容。本質上是特定于安全性的DAO:它封裝了數據源的連接詳細信息,并根據需要使關聯數據可用于Shiro。
#數據源
dataSource=org.apache.commons.dbcp.BasicDataSource
#數據源鏈接要素
dataSource.driverClassName=oracle.jdbc.driver.OracleDriver
dataSource.url=jdbc:oracle:thin:@localhost:1521:orcl
dataSource.username=scott
dataSource.password=tiger
#jdbcrealm
jdbcrealm=org.apache.shiro.realm.jdbc.JdbcRealm
#jdbcrealm需要用到的數據源
jdbcrealm.dataSource=KaTeX parse error: Expected 'EOF', got '#' at position 13: dataSource #?開啟查找權限 jdbcrea…jdbcrealm
三、認證授權
3.1、認證(Authentication)
身份驗證是驗證用戶身份的過程。也就是說,當用戶通過應用程序進行身份驗證時,他們在證明自己實際上就是他們所說的身份。有時也稱為“登錄”。這通常是一個三步過程。
- 收集用戶的標識信息(稱為主體 用戶名)和支持身份的憑證(稱為憑據 密碼)。
AuthenticationToken token = new UsernamePasswordToken(username, password); - 將主體和憑據提交到系統。
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token); - 如果提交的憑據與系統對該用戶身份的期望匹配,則認為該用戶已通過身份驗證。如果它們不匹配,則不認為用戶已通過身份驗證。
try {
currentUser.login(token);
//通過身份驗證,執行其他業務
} catch (IncorrectCredentialsException ice) {
//密碼錯誤
} catch (LockedAccountException lae) {
//賬戶鎖定(默認系統不提供,可以編寫代碼過程中自己實現)
}
… //許多其他異常
catch (AuthenticationException ae) {
//上面配置的異常的父類
}
3.2、授權(authorization)
授權本質上是訪問控制-控制用戶可以在應用程序中訪問的內容(例如資源,網頁等)。大多數用戶通過使用角色和權限等概念來執行訪問控制。也就是說,通常根據分配給他們的角色和/或權限,允許用戶執行某項操作或不執行某項操作。
判斷角色:
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?
}
四、入門示例
參考文章
個人筆記,不同意見,望有交流
直接可以點擊跳轉連接
作者