shiro學習(1)-初始shiro

shiro框架

應用代碼直接交互的對象是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,即安全數據源

shiro內部框架結構

組件 說明
Subject 主體,可以看到主體可以是任何可以與應用交互的“用戶”;
SecurityManage 相當於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提高了一些常見的加密組件用於如密碼加密/解密的。

 shiro中常見單詞

單詞 說明
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 urls

main

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

[main]
#定義憑證匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher

其構造器必須是public空參構造器,通過反射創建相應的實例。

  • 對象名=全限定類名 相對於調用public無參構造器創建對象
  • 對象名.屬性名=值 相當於調用setter方法設置常量值
  • 對象名.屬性名=$對象引用 相當於調用setter方法設置對象引用

users

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

[users]
coco=123456,role1
admin=123456,role2

roles

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

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

 如果只有角色沒有對應的權限,可以不配roles

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.4.1</version>
</dependency>

創建shiro.ini配置文件 

[users]
admin=123456

認證操作

    @Test
	public void demoOne(){
		// 裝入 INI 配置
		Factory<SecurityManager> factory = new      IniSecurityManagerFactory("classpath:shiro.ini");
		//創建SecurityManager對象
		SecurityManager instance = factory.getInstance();
		//使SecurityManager可以訪問
		SecurityUtils.setSecurityManager(instance);
		//接受提交的用戶名和密碼: 
		UsernamePasswordToken tooken = new UsernamePasswordToken("admin","123456");
		//獲取當前主體
		Subject subject = SecurityUtils.getSubject();
		try {
			subject.login(tooken);
		} catch (AuthenticationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("是否認證成功:" + subject.isAuthenticated());
	}

認證賬號密碼是否正確

流程描述

  • 創建token令牌,token中有用戶提交的認證信息即賬號和密碼
  • 執行subject.login(token),最終由securityManager通過Authenticator進行認證
  • Authenticator的實現ModularRealmAuthenticator調用realm從ini配置文件取用戶真實的賬號和密碼,這裏使用的是IniRealm(shiro自帶)
  • IniRealm先根據token中的賬號去ini中找該賬號,如果找不到則給ModularRealmAuthenticator返回null,如果找到則匹配密碼,匹配密碼成功則認證通過。
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章