Shiro-授权

什么是授权

  • 授权,即访问控制,控制谁能访问哪些资源。
  • 主体进行身份认证后需要分配权限,方可访问系统的资源,对于某些资源没有权限是无法访问的这就是授权。

使用 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

@Override
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"));
    }
}
posted @ 2021-02-22 16:24  BNTang  阅读(81)  评论(0编辑  收藏  举报