获取授权上下文
启用强制策略时,从服务器获取的权限可通过org.keycloak.AuthorizationContext获得。此类提供了几种可用于获取权限的方法,并确定是否为特定资源或作用域授予权限。
获取Servlet容器中的授权上下文:
HttpServletRequest request = ... // obtain javax.servlet.http.HttpServletRequest
KeycloakSecurityContext keycloakSecurityContext =
(KeycloakSecurityContext) request
.getAttribute(KeycloakSecurityContext.class.getName());
AuthorizationContext authzContext =
keycloakSecurityContext.getAuthorizationContext();
注意:有关如何获取KeycloakSecurityContext的更多详细信息,请参阅适配器配置。上述示例应该足以在使用Keycloak支持的任何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代表Keycloak的主要功能之一。从上面的示例可以看出,受保护的资源不直接与管理它们的策略相关联。
考虑使用基于角色的访问控制(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中,角色仅隐含地定义其资源的访问。使用Keycloak,您可以获得创建更易于管理的代码的功能,无论您是使用RBAC,基于属性的访问控制(ABAC)还是任何其他BAC变体,都可直接关注资源。是否拥有给定资源或作用域的权限,或者没有。
现在,假设您的安全要求有所改变,除了项目经理之外,PMO还可以创建新的项目。安全要求发生变化,但是使用Keycloak,无需更改应用程序代码来满足新的要求。一旦您的应用程序基于资源和范围标识符,您只需要更改授权服务器中特定资源关联的权限或策略的配置。在这种情况下,与项目资源和/或范围相关联的权限和策略urn:project.com:project:create将被更改。
使用AuthorizationContext获取授权客户端实例
AuthorizationContext还可用于获取对您的应用程序配置的授权客户端API的引用:
ClientAuthorizationContext clientContext = ClientAuthorizationContext.class.cast(authzContext);
AuthzClient authzClient = clientContext.getClient();
在某些情况下,由策略执行者保护的资源服务器需要访问授权服务器提供的API。使用AuthzClient实例,资源服务器可以与服务器进行交互,以创建资源或以编程方式检查特定的权限。