15.3. 获取授权上下文
启用策略强制时,可以通过 org.keycloak.AuthorizationContext
从服务器获取的权限。此类提供了多种方法,您可以用来获取权限,并确定是否为特定资源或范围授予了权限。
在 Servlet 容器中获取授权上下文
HttpServletRequest request = // obtain javax.servlet.http.HttpServletRequest AuthorizationContext authzContext = (AuthorizationContext) request.getAttribute(AuthorizationContext.class.getName());
HttpServletRequest request = // obtain javax.servlet.http.HttpServletRequest
AuthorizationContext authzContext = (AuthorizationContext) request.getAttribute(AuthorizationContext.class.getName());
授权上下文可帮助您更好地控制服务器制定和返回的决策。例如,您可以根据与资源或范围关联的权限,使用它来构建动态菜单,其中项目会被隐藏或显示。
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 }
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 }
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 build of Keycloak,您可以获得创建更易于管理的代码的功能,这些代码直接侧重于资源,无论您使用的是 RBAC、属性的访问控制(ABAC)还是任何其他 BAC 变体。您有给定资源或范围的权限,或者您没有该权限。
现在,假设您的安全要求已更改,并且除了项目管理器外,PMO 也可以创建新项目。
安全要求变化,但使用红帽构建的 Keycloak 无需更改应用程序代码来满足新的要求。应用基于资源和范围标识符后,您只需要更改与授权服务器中特定资源关联的权限或策略的配置。在本例中,与项目资源
关联的权限和策略,或范围 urn:project.com:project:create
将被更改。