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