Shiro01

@[toc]html

shiro簡介

官網 在這裏插入圖片描述 Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、受權、密碼和會話管理。使用Shiro的易於理解的API,您能夠快速、輕鬆地得到任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。前端

框架說明

官網的框架說明 在這裏插入圖片描述 應用代碼直接交互的對象是==Subject==,也就是說Shiro的對外API核心就是Subject | api | 說明 | |--|--| | Subject |主體,表明當前’用戶’。這個用戶不必定是一個具體的人,與當前應用交互的任何東西都是Subject,如網絡爬蟲,機器人等;即一個抽象概念;全部Subject都綁定到SecurityManager,與Subject的全部交互都會委託給SecurityManager;能夠把Subject認爲是一個門面;SecurityManager纔是實際的執行者 | |Shiro SecurityManager | 安全管理器;即全部與安全有關的操做都會與SecurityManager交互;且它管理着全部Subject;能夠看出它是Shiro的核心,它負責與後邊介紹的其餘組件進行交互,能夠把它當作DispatcherServlet前端控制器 | | Realm |,Shiro從Realm獲取安全數據(如用戶、角色、權限),就是說SecurityManager要驗證用戶身份,那麼它須要從Realm獲取相應的用戶進行比較以肯定用戶身份是否合法;也須要從Realm獲得用戶相應的角色/權限進行驗證用戶是否能進行操做;能夠把Realm當作DataSource,即安全數據源。 |java

內部的框架

在這裏插入圖片描述 | 組件 | 說明 | |--|--| |Subject |主體,能夠看到主體能夠是任何能夠與應用交互的「用戶」 | |SecurityManager |至關於SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher;是Shiro的心臟;全部具體的交互都經過SecurityManager進行控制;它管理着全部Subject、且負責進行認證和受權、及會話、緩存的管理。 | | Authenticator | 認證器,負責主體認證的,這是一個擴展點,若是用戶以爲Shiro默認的很差,能夠自定義實現;其須要認證策略(Authentication Strategy),即什麼狀況下算用戶認證經過了; | | Authorizer | 受權器,或者訪問控制器,用來決定主體是否有權限進行相應的操做;即控制着用戶能訪問應用中的哪些功能; | | Realm | 能夠有1個或多個Realm,能夠認爲是安全實體數據源,即用於獲取安全實體的;能夠是JDBC實現,也能夠是LDAP實現,或者內存實現等等;由用戶提供;注意:Shiro不知道你的用戶/權限存儲在哪及以何種格式存儲;因此咱們通常在應用中都須要實現本身的Realm | |SessionManager |若是寫過Servlet就應該知道Session的概念,Session呢須要有人去管理它的生命週期,這個組件就是SessionManager;而Shiro並不只僅能夠用在Web環境,也能夠用在如普通的JavaSE環境、EJB等環境;全部呢,Shiro就抽象了一個本身的Session來管理主體與應用之間交互的數據;這樣的話,好比咱們在Web環境用,剛開始是一臺Web服務器;接着又上了臺EJB服務器;這時想把兩臺服務器的會話數據放到一個地方,這個時候就能夠實現本身的分佈式會話(如把數據放到Memcached服務器); | |SessionDAO | DAO你們都用過,數據訪問對象,用於會話的CRUD,好比咱們想把Session保存到數據庫,那麼能夠實現本身的SessionDAO,經過如JDBC寫到數據庫;好比想把Session放到Memcached中,能夠實現本身的Memcached SessionDAO;另外SessionDAO中可使用Cache進行緩存,以提升性能; | |CacheManager | 緩存控制器,來管理如用戶、角色、權限等的緩存的;由於這些數據基本上不多去改變,放到緩存中後能夠提升訪問的性能 | |Cryptography /krɪp’tɑgrəfi/ |密碼模塊,Shiro提升了一些常見的加密組件用於如密碼加密/解密的 |web

常見的單詞

| 單詞 | 說明 | |--|--| | Subject| 主體 | | Security |安全 | | Realm | 領域、範圍 | | Autherticator | 認證器 | | Authentication | 認證| | Authorizer |受權器 | | Authorization |受權 | Cryptography/krɪp’tɑgrəfi/ | 密碼、加密 | | Credential/krə’dɛnʃl/ | 證書、憑證 密碼 | |Matcher |匹配器 | | Principal/'prɪnsəpl/ | 身份 |數據庫

Shiro中的shiro.ini說明

shiro.ini放置在classpath路徑下shiro會自動查找。 ini配置文件中有四大主要配置類 main users roles urlsapache

main

提供了對根對象securityManager及其依賴對象的配置api

#建立對象
securityManager=org.apache.shiro.mgt.DefaultSecurityManager

其構造器必須是public空參構造器,經過反射建立相應的實例。緩存

  1. 對象名=全限定類名 相對於調用public無參構造器建立對象
  2. 對象名.屬性名=值 至關於調用setter方法設置常量值
  3. 對象名.屬性名=$對象引用 至關於調用setter方法設置對象引用

users

提供了對用戶/密碼及其角色的配置,用戶名=密碼,角色1,角色2 username=password,role1,role2   例如:配置用戶名/密碼及其角色,格式:「用戶名=密碼,角色1,角色2」,角色部分可省略。如:  安全

[users] 
root=123456 roles1

roles

提供了角色及權限之間關係的配置,角色=權限1,權限2 role1 = permission1 , permission2   例如:配置角色及權限之間的關係,格式:「角色=權限1,權限2」;如:服務器

[roles] 
role1=user:create,user:update 
role2=*

urls

用於web,提供了對web url攔截相關的配置,url=攔截器[參數],攔截器

/index.html = anon 
/admin/** = authc, roles[admin],perms["permission1"]

案例

添加依賴

<dependency>
	<groupId>org.apache.shiro</groupId>
	<artifactId>shiro-core</artifactId>
	<version>1.1.0</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-simple</artifactId>
	<version>1.6.1</version>
	<scope>test</scope>
</dependency>

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.12</version>
	<scope>test</scope>
</dependency>
<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>

添加shiro.ini文件

在這裏插入圖片描述 添加內容

[users]
root = 123456
# 帳號爲root 密碼是 123456

認證操做

public static void main(String[] args) {
		//一、獲取securityManager工廠對象
		Factory<SecurityManager> factory=
				new IniSecurityManagerFactory("classpath:shiro.ini");
		//二、經過factory對象獲取securityManager對象
		SecurityManager securityManager = factory.getInstance();
		//三、將SecurityManager對象添加到運行環境中
		SecurityUtils.setSecurityManager(securityManager);
		
		//四、獲取Subject對象
		Subject subject = SecurityUtils.getSubject();
		AuthenticationToken token =new UsernamePasswordToken("root","123456");
		//五、登陸操做
		try {
			subject.login(token);
			System.out.println("登陸成功.....");
		} catch (UnknownAccountException e) {
			System.out.println("用戶名錯誤.....");
		}catch(IncorrectCredentialsException e){
			System.out.println("密碼錯誤......");
		}
	}

在這裏插入圖片描述

相關文章
相關標籤/搜索