什么是授权
- 授权,即访问控制,控制谁能访问哪些资源。
- 主体进行身份认证后需要分配权限,方可访问系统的资源,对于某些资源没有权限是无法访问的这就是授权。
使用 ini 的形式配置权限信息
- 在 ini 文件中设置用户、角色、权限的配置规则。
- 用户名=密码,角色1,角色2 ...
- 首先根据用户名找角色,再根据角色找权限,角色是权限集合。
- 权限字符串的规则
- “资源标识符:操作:资源实例标识符”
- 对哪个资源的哪个实例具有什么操作。
-
:
是资源 / 操作 / 实例的分割符。 - 权限字符串也可以使用
*
通配符。
如下将给出一个配置示例如下所示,修改 shiro.ini:
[users]
#用户bntang的密码是1234,此用户具有role1和role2两个角色
#用户jonathan_lee的密码是1234,此用户具有role2一个角色
bntang=1234,role1,role2
jonathan_lee=1234,role2
[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
自定义 Realm 的形式权限
修改 MyRealm.java
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 获取身份信息
Object principal = principals.getPrimaryPrincipal();
// 根据用户名查询该用户的角色和权限
List<String> roles = new ArrayList<>();
roles.add("role1");
roles.add("role2");
List<String> permissions = new ArrayList<>();
permissions.add("user:create");
permissions.add("user:delete");
// 把角色和权限与 subject 关联在一起,然后进行返回
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRoles(roles);
info.addStringPermissions(permissions);
return info;
}
然后修改之前的测试类,具体修改的内容或者新增的内容如下代码所示, 在认证成功之后才去做授权, 判断当前的用户是否有某一个角色和某一个权限
/**
* @author BNTang
*/
public class Demo {
public static void main(String[] args) {
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("BNTang", "12345");
try {
subject.login(token);
} catch (UnknownAccountException e) {
System.out.println("用户名不存在");
e.printStackTrace();
} catch (IncorrectCredentialsException e) {
System.out.println("密码错误");
e.printStackTrace();
}
System.out.println("是否认证" + subject.isAuthenticated());
subject.logout();
System.out.println("是否认证" + subject.isAuthenticated());
// 判断当前用户有没有角色1
System.out.println(subject.hasRole("role1"));
// 判断当前用户是否同时具备多个角色
System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role3")));
// 判断是否有某一个权限
System.out.println(subject.isPermitted("user:create"));
// 判断是否同时有多个权限
System.out.println(subject.isPermittedAll("user:create", "user:update"));
}
}