1.一般授权
-
授权:给身份认证通过的任授予某些资源的访问权限
-
权限的粒度 粗粒度 细粒度
-
粗粒度
User 具有 CRUD 的操作 通常指的是表的操作 -
细粒度
-
只允许查询 id=1 的用户 使用业务代码实现
-
Shiro 的授权是粗粒度
-
角色:角色就是权限的集合
代码实现:
package com.shiro1;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import java.util.Arrays;
public class TestA {
public static void main(String[] args) {
//[1]解析shiro.ini文件
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//[2]通过SecurityManager工厂获得SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//[3]把SecurityManager对象设置到运行环境中
SecurityUtils.setSecurityManager(securityManager);
//[4]通过SecurityUtils获得主体subject
Subject subject = SecurityUtils.getSubject();
//[5]书写自己输入的账号和密码---相当于用户自己输入的账号和密码
//我们拿着自己书写用户名密码去和shiro.ini 文件中的账号密码比较
UsernamePasswordToken token = new UsernamePasswordToken("zs", "123");
try {
//[6]进行身份的验证
subject.login(token);
} catch (IncorrectCredentialsException e) {
System.out.println("登录失败");
}
//授权的查询
//基于角色的授权
boolean flag = subject.hasRole("role1");
System.out.println(flag);
//判断是否具有多个角色
boolean[] booleans = subject.hasRoles(Arrays.asList("role1", "role3"));
for(Boolean b:booleans){
System.out.println(b);
}
//可以使用checkRole判断指定用户是否具有对应角色
//如果指定用户下没有对应的角色就会抛出异常UnauthorizedException
/* subject.checkRole("role3");
subject.checkRoles("role1","role2");*/
//基于资源的授权
boolean flag2 = subject.isPermitted("iii");
System.out.println(flag2);
//判读是否具有多个资源
boolean permittedAll = subject.isPermittedAll("add", "oo", "ii");
//通过checkPermission 进行判断指定用户下是否有指定的资源
//如果没有就会抛出UnauthorizedException
subject.checkPermission("uu");
subject.checkPermissions("ii", "ooo", "add");
}
}
#指定具体的用户
[users]
zs=123,role1,role2
DQC=root
#角色的定义
[roles]
role1=add,update,delete
role2=find
#给对象中的属性赋值
#[main]
运行结果:
2.Shiro 中的授权检查的 3 种方式
- 编程式
- 注解式
package com.shiro1;
import org.apache.shiro.authz.annotation.RequiresRoles;
public class Role {
//加上后只有管理员可以访问这个方法
@RequiresRoles("管理员")
public void aa(){
}
}
- 标签配置
//在jsp中使用可以让持有add角色的人访问标签里的内容
<shiro:hasPermission name="add">
<a>添加操作</a>
</shiro:hasPermission>