8.5 使用 AuthorizationManager 管理角色和权限
本章包括以下主题:
■ 8.1 认证和授权管理的相关对象
■ 8.2 ESXi 和 vCenter 服务器的认证和授权
■ 8.3 从 UserDirectory 获取用户和组信息
■ 8.4 使用 HostLocalAccountManager 管理 ESXi 用户
■ 8.5 使用 AuthorizationManager 管理角色和权限
■ 8.6 通过 SessionManager 认证用户
■ 8.7 使用凭据库(Credential Store)自动登录
■ 8.8 使用 LicenseManager 管理许可证
本小节从第5节开始
AuthorizationManager 是处理分配给用户或组(使用 HostLocalAccountManager 定义)的权限和角色的服务接口,
AuthorizationManager 方法允许你创建、修改及管理角色和许可权限,并获取在系统中定义的角色和许可权限的信息。
如果一个预定一定角色满足不了你的需求,可定义一个新的仅包含最小所需权限集的角色。
根据对象所关联的许可权限,AuthorizationManager 还可以访问或阻止访问指定的服务器对象。
AuthorizationManager 用于关联角色和许可权限的方法如下:
■ Roles Management
AddAuthorizationRole、RemoveAuthorizationRole 和 UpdateAuthorizationRole。
查看5.1 和 5.2。
■ Permissions Management
MergePermissions、RemoveEntityPermission、ResetEntityPermissions、RetrieveAllPermissions, RetrieveEntityPermissions、RetrieveRolePermissions 和 SetEntityPermissions。
查看5.3。
下图 8.4 类图显示了 AuthorizationManager 的这些方法及一些关联的数据对象。
图 8.4 - AuthorizationManager 托管对象
AuthorizationManager 属性允许访问信息,例如:
■ privilegeList 属性返回一个在系统上定义的所有权限列表,作为一个 AuthorizationPrivilege 数据对象的数组。权限由VMware 定义,在系统中的对象和属性上。这些权限是固定的,不能被客户端应用程序改变。
可查阅 权限引用 里面列的权限列表。
■ roleList 属性返回所有当前定义的角色,包括定义的系统的角色,作为一个 AuthorizationRole 数据对象的数组。
8.5.1 使用角色合并权限集
角色是指定的一个或多个权限的集合,角色通常是为在系统中有共同职责的一群人定义的,如管理员,每个角色有0到多个权限。
ESXi 定义系统角色和用户角色。
■ 系统角色:不能被修改或删除
■ 用户角色:用于不同用户群体或限制对附加工具的访问。
vCenter 服务器和 ESXi 系统中包含了若干个预定义的用户角色。你也可以使用这些预定义的用户角色作为起点创建新的角色。
下表更详细地描述了这两种类型的角色,并列出当前可用的角色作为示例。
系统和示例角色
8.5.2 修改 Sample 角色创建新角色
系统角色不能被修改删除,但是可以创建新的角色或修改 Sample 角色。
使用 API 创建新角色步骤如下:
从 ServiceInstance.content 的 ServiceContent 对象开始,为服务器获取 AuthorizationManager 的一个托管对象引用;
调用 AddAuthorizationRole 方法。参数是:一个 AuthorizationManager 的引用、角色名、需要分配给角色的权限数组。
AddAuthorizationRole 返回一个 roleId 整型值(xsd: int),该id是系统分配给新定义的角色的。
在随后的代码中,使用 roleID 将角色分配给特定的用户或组。
8.5.3 通过许可授权
当你使用某个 AuthorizationManager 对象来分配或修改权限时,会使用到 Permission 数据对象,Permission 与有一权限集的主体相关联,一个 permission 确定了:
■ 该许可权限应用的用户或主(主体)
■ 包含应该授予用户或组的权限的角色
■ 该许可权限应用的到实体的托管对象引用
每个托管实体至少有一个与其关联的 Permission 对象,一个托管实体可以有多个 Permission 分配给它,有效地为不同的用户或组授予不同的权限。
Permissions 是为托管实体定义的,无论是显式还是通过继承。
获取 Permissions 信息
具有管理员角色的用户可以获得不同级别的 Permission 对象的详细信息。
■ 对于一个 Permission 对象数组,调用 AuthorizationManager.RetrieveAllPermissions 方法
■ 对于指定的清单对象,如托管实体、folders、datacenters 或 虚拟服务,调用 AuthorizationManager.RetrieveEntityPermissions 方法
■ 对于一个在系统中对应的角色,调用 AuthorizationManager.RetrieveRolePermissions 方法
设置、更改或删除许可权限
Permission 数据对象关联所需权限,与主体(用户,组)在一个对象上执行操作,主体通过它们的角色拥有权限。
要设置或更新一个对象的许可权限,使用 AuthorizationManager.SetEntityPermissions 方法。
在实体上设置许可权限
从与 ServiceInstance 关联的 ServiceContent 对象为服务器获取一个到
AuthorizationManager.SetEntityPermissions 的引用,例如:ManagedObjectReference hostAuthorizationManager = service.getAuthorizationManager();
创建一个 Permission 数据对象,该对象标识用户(或组)名称、角色、权限应该应用的实体,和是否应将权限应用于该实体的子实体。
例如,下面的代码片段创建了一个在清单根目录上的许可权限,授予用户管理员角色到根文件夹及其所有子目录。
Permission per = new Permission();
per.setGroup(false);
per.setPrincipal(“new_user_name”);
per.setRoleId(-1);
per.setPropagate(true);
per.setEntity(rootFolder);
在复杂的实体中不能直接对子实体设置许可权限,对于复杂实体,在父实体上设置许可权限,并设置 propagate(传播)标记为 true,以将许可权限应用到子实体上。
要用一组新的权限来替换现有的权限,使用 AuthorizationManager.ResetEntityPermissions 方法。
组成员在权限上的影响
用户可能是多个组的成员,系统对多组成员关系的处理如下:
■ 权限被应用于清单对象,从包含对象到每个它的子实体
■ 如果用户没有明确的用户级权限,那么组级权限就像直接授予用户一样
■ 在相同对象上具有权限的多组成员会导致权限的联合。
■ 用户级权限总是优先于组级权限
应用许可权限到托管实体
下面的创建用户账户示例展示了一些创建一个用户账户及应用权限于实体(根据角色授予用户账户访问权限)所需的代码,该角色在这个例子中分配的 roleId 为4,定义为一个 “Virtual Machine Power User”。
该例子使用 AuthorizationManager 授予用户许可权限,并与清单中的托管实体(例中的是 rootFolder)关联这些许可权限。
该例子用到 apputil 帮助类访问对象。
示例:创建用户账户
...
ManagedObjectReference _authManRef = _sic.getAuthorizationManager();
public class CreateUser {
private static AppUtil appUtil= null;
private void createUser() throws Exception {
ManagedObjectReference hostLocalAccountManager = appUtil.getConnection().getServiceContent().getAccountManager();
ManagedObjectReference hostAuthorizationManager =
appUtil.getConnection().getServiceContent().getAuthorizationManager();
// Create a user
HostAccountSpec hostAccountSpec = new HostAccountSpec();
hostAccountSpec.setId(userName);
hostAccountSpec.setPassword(password);
hostAccountSpec.setDescription("my delegated admin auto-agent software");
appUtil.getConnection().getService().createUser(hostLocalAccountManager, hostAccountSpec);
ManagedObjectReference rootFolder = appUtil.getConnection().getServiceContent().getRootFolder();
Permission permission = new Permission();
permission.setGroup(false);
permission.setPrincipal(userName);
// Assign the Virtual Machine Power User role
permission.setRoleId(4);
permission.setPropagate(true);
permission.setEntity(rootFolder);
appUtil.getConnection().getService().setEntityPermissions(hostAuthorizationManager, rootFolder,
new Permission [] {permission});
...
原文:
VMware vSphere 6.5 Documentation Center:Managing Roles and Permissions with AuthorizationManager