9.3. 获取授权上下文
启用策略强制后,可通过 org.keycloak.AuthorizationContext 获得从服务器获取的权限。此类提供了多种方法,您可以使用 获取权限,以及是否被授予特定资源或范围的权限。
在 Servlet 容器中获取授权上下文
HttpServletRequest request = ... // obtain javax.servlet.http.HttpServletRequest
KeycloakSecurityContext keycloakSecurityContext =
(KeycloakSecurityContext) request
.getAttribute(KeycloakSecurityContext.class.getName());
AuthorizationContext authzContext =
keycloakSecurityContext.getAuthorizationContext();
有关如何获取 KeycloakSecurityContext 的详情,请参考适配器配置。使用由 Red Hat Single Sign-On 支持的任何 servlet 容器运行应用程序时,应该有足够的上下文。
授权上下文可帮助您更好地控制服务器所做的决策和返回。例如,您可以根据与资源或范围关联的权限,使用它来构建隐藏或显示项目的动态菜单。
if (authzContext.hasResourcePermission("Project Resource")) {
// user can access the Project Resource
}
if (authzContext.hasResourcePermission("Admin Resource")) {
// user can access administration resources
}
if (authzContext.hasScopePermission("urn:project.com:project:create")) {
// user can create new projects
}
AuthorizationContext 代表 Red Hat Single Sign-On 授权服务的主要功能之一。在上面的例子中,您可以看到受保护的资源没有直接与管理它们的策略关联。
使用基于角色的访问控制(RBAC)为例一些类似的代码:
if (User.hasRole('user')) {
// user can access the Project Resource
}
if (User.hasRole('admin')) {
// user can access administration resources
}
if (User.hasRole('project-manager')) {
// user can create new projects
}
虽然这两个示例都满足相同的要求,但它们以不同的方式实现。在 RBAC 中,角色仅 隐式 定义其资源的访问权限。通过 Red Hat Single Sign-On,您可以创建更可管理的代码,直接侧重于您的资源,无论您使用 RBAC、基于属性的访问控制(ABAC),还是其它 BAC 变体。您没有给定资源或范围的权限,或者您没有。
现在,假设您的安全要求已经有所变化,除了项目经理外,PMO 也能够创建新项目。
安全要求改变,但红帽单点登录不需要更改应用程序代码来满足新的要求。应用基于资源和范围标识符后,您只需要更改与授权服务器中特定资源关联的权限或策略的配置。在本例中,与项目资源关联的权限和策略,或范围 urn:project.com:project:create 将被更改。