1. shiro默认自带的realm和常见使用方法
- realm作用:Shiro 从 Realm 获取安全数据
- 默认自带的realm:idae查看realm继承关系,有默认实现和自定义继承的realm
- 两个概念
- principal : 主体的标示,可以有多个,但是需要具有唯一性,常见的有用户名,手机号,邮箱等
- credential:凭证, 一般就是密码
- 所以一般我们说 principal + credential 就账号 + 密码
- 开发中,往往是自定义realm , 即集成 AuthorizingRealm,重写AuthorizingRealm的getAuthorizationInfo方法
2. Shiro内置 ini realm 操作
在springboot的resources资源目录下创建shiro.ini 配置文件,将下面内容复制进去
1 [users] 2 # 格式 name=password,role1,role2,..roleN 3 jack = 456, user 4 xdclass = 123, root, admin 5 # 格式 role=permission1,permission2...permissionN 也可以用通配符 6 # 下面配置user的权限为所有video:find,video:buy,如果需要配置video全部操作crud 则 user = video:* 7 [roles] 8 user = video:find,video:buy 9 # 下面定义了游客角色具有商品模块的查询,购买权限以及评论模块的所有权限 10 visitor= good:find,good:buy,comment:* 11 # 'admin' role has all permissions, indicated by the wildcard '*' 12 admin = *
xdclass = 123, root, admin 表示,xdclass这个用户密码是123,具有 root 和admin两个角色,
user = video:find,video:buy 表示,普通用户角色具有视频的查看,购买权限,
admin = * 表示admin角色具有所有的权限
测试代码:
1 package net.xdclass.xdclassshiro; 2 3 import org.apache.shiro.SecurityUtils; 4 import org.apache.shiro.authc.UsernamePasswordToken; 5 import org.apache.shiro.config.IniSecurityManagerFactory; 6 import org.apache.shiro.mgt.DefaultSecurityManager; 7 import org.apache.shiro.mgt.SecurityManager; 8 import org.apache.shiro.realm.SimpleAccountRealm; 9 import org.apache.shiro.subject.Subject; 10 import org.apache.shiro.util.Factory; 11 import org.junit.Before; 12 import org.junit.Test; 13 14 /** 15 * iniRealm操作 16 */ 17 public class QuicksStratTest5_2 { 18 19 @Test 20 public void testAuthentication() { 21 //通过配置文件创建SecurityManager工厂 22 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 23 // 获取SecurityManager实例 24 SecurityManager securityManager = factory.getInstance(); 25 //设置当前上下文 26 SecurityUtils.setSecurityManager(securityManager); 27 28 //获取当前subject(application应用的user) 29 Subject subject = SecurityUtils.getSubject(); 30 // 模拟用户输入 31 UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("jack","456"); 32 // 33 subject.login(usernamePasswordToken); 34 System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); //认证结果(是否已授权):true 35 //最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法 36 System.out.println("是否有对应的角色:" + subject.hasRole("root")); //是否有对应的角色:false 37 //获取登录 账号 38 System.out.println("getPrincipal():" + subject.getPrincipal()); //getPrincipal():jack 39 //校验角色,没有返回值,校验不通过,直接跑出异常 40 subject.checkRole("user"); 41 // user jack有video的find权限,执行通过 42 subject.checkPermission("video:find"); 43 // 是否有video:find权限:true 44 System.out.println("是否有video:find权限:" + subject.isPermitted("video:find")); 45 // 是否有video:delete权限:false 46 System.out.println("是否有video:delete权限:" + subject.isPermitted("video:delete")); 47 //user jack没有video的删除权限,执行会报错:org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [video:delete] 48 subject.checkPermission("video:delete"); 49 // subject.logout(); 50 // System.out.println("logout后认证结果:" + subject.isAuthenticated()); 51 } 52 53 @Test 54 public void testAuthentication2() { 55 //通过配置文件创建SecurityManager工厂 56 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); 57 // 获取SecurityManager实例 58 SecurityManager securityManager = factory.getInstance(); 59 //设置当前上下文 60 SecurityUtils.setSecurityManager(securityManager); 61 //获取当前subject(application应用的user) 62 Subject subject = SecurityUtils.getSubject(); 63 // 模拟用户输入 64 UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("xdclass","123"); 65 subject.login(usernamePasswordToken); 66 System.out.println("认证结果(是否已授权):" + subject.isAuthenticated()); // 认证结果(是否已授权):true 67 //最终调用的是org.apache.shiro.authz.ModularRealmAuthorizer.hasRole方法 68 System.out.println("是否有admin角色:" + subject.hasRole("admin")); //是否有admin角色:true 69 System.out.println("是否有root角色:" + subject.hasRole("root")); //是否有root角色:true 70 //获取登录 账号 71 System.out.println("getPrincipal():" + subject.getPrincipal()); //getPrincipal():xdclass 72 // admin角色具有所有权限 73 subject.checkPermission("video:find"); 74 // 是否有video:find权限:true 75 System.out.println("是否有video:find权限:" + subject.isPermitted("video:find")); //是否有video:find权限:true 76 // 是否有video:delete权限:true 77 System.out.println("是否有video:delete权限:" + subject.isPermitted("video:delete")); // 是否有video:find权限:true 78 // 结果为true,如果subject.checkPermission校验不通过,则抛出异常 79 subject.checkPermission("video:delete"); 80 } 81 }