Shiro框架中,有3個重要的概念
1.Subject
類似於我們平常所使用的“用戶”概念,但用戶常常是指人,而Subject還可能是其他的第三方軟件等等,所以在這裏用的是Subject這一概念而不是User
2.SecurityManager
Shiro架構中的核心,爲Subject管理安全操作
3.Reamls
連接Subject和SecurityManager的橋樑,相當於dao層,配置Shiro時,最起碼要有一個Reamls
小demo:
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
AuthenticationToken token = new UsernamePasswordToken("marksg","password");
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
2.securityManager實例化。
3.使securityManager可訪問
4.獲取用戶名和密碼
5.獲取當前用戶
6.login
Shiro.ini:
[user]
residentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz
mark sg=password,test
[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5
[urls]
test/target=roles[admin]
test/target1=anno
test/target2=authc
其中,user的命名規則爲:
username=password,role1,role2......roleN
roles的命名規則爲:
rolename=Perm1,Perm2,......PermN
所以,上面的ini文件中
mark sg=password,test,admin
<pre name="code" class="plain">admin = *
的意思是,mark sg這principal(username)的credential(password)爲password,擁有的角色爲test,admin
其中admin有"*"這一權限
[urls]下表示的含義爲:
(1)test/target0=roles[admin],表示路徑test/target1只有擁有admin這一ROLE的用戶纔可以訪問
(2)test/target1=anno,表示路徑test/target1是所有人都可以訪問的路徑
(3)test/target2=authc,表示路徑test/target2只有通過了登錄驗證的用戶纔有權限可以訪問
那麼回到代碼中的第4行
<pre name="code" class="java">AuthenticationToken token = new UsernamePasswordToken("marksg","password");
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
因爲我們已經讀取了ini文件了,所以這裏的我們的login操作時,
實際上市將token這一對象傳入,然後檢查是否有符合的principal和credential都符合的情況
如果沒有則會報錯,有的話則成功login
在Login以後可以用currentUser.getPrincipal()輸出當前的subject