【问题标题】:GET , POST , PUT , DELETE type based Authentication in keycloakkeycloak 中基于 GET 、 POST 、 PUT 、 DELETE 类型的身份验证
【发布时间】:2019-09-14 13:31:04
【问题描述】:

我在 API 中有一个资源,其 URI 为 /product/{id},并在 HttpMethod 基础上执行三个操作 VIEW, GET, DELETE

如何管理一个用户只允许VIEWadmin 允许VIEW, GET, DELETE 即所有选项。

我见过Keycloak Adapter Policy Enforcer,但是我不明白它是如何工作的。 我没有在创建权限中获得方法选项。

有人可以帮我实现这个或建议一些方法来做到这一点。

【问题讨论】:

  • 您想在哪里放置您的授权?在数据库中?然后你想在运行时确定谁可以做什么?
  • 不,我想将我的授权放在 url 和 method type 中。如果我将使用与 /products/{id} 相同的 url 进行编辑、删除和获取单个产品。对于编辑方法类型,方法类型不同,对于删除,我使用了方法类型删除,那么我如何使用 keycloak 管理授权。我已经实现了基于角色的身份验证但现在我想要基于 uri 的身份验证

标签: java spring-boot microservices keycloak


【解决方案1】:

首先,最合适的选择是使用基于注释的策略机制。 所以在每一个休息服务之前,你需要编写它的访问策略,例如:

@Secured("ROLE_VIEWER")
public String getUsername() {
    SecurityContext securityContext = SecurityContextHolder.getContext();
    return securityContext.getAuthentication().getName();
}

如您所见,getUsername() 方法将只被查看器允许。

@Secured("ROLE_ADMIN")
public boolean isValidUsername(String username) {
     return userRoleRepository.isValidUsername(username);
}

所以你看到上面的方法只允许管理员访问,同样的注解也可以用于其他服务。要使用这种功能,您需要将 Spring Security 与您的 Spring Boot 应用程序集成。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

有关更多详细信息,您可以查看这篇文章,但我确实认为这是在 Spring Boot 应用程序中控制数据安全性和服务安全性的最佳方式。

参考:https://www.baeldung.com/spring-security-method-security

【讨论】:

  • 谢谢!但我不想要基于角色的 Authantication 。我想要基于 URL 和方法类型的身份验证。
【解决方案2】:

您需要的是弹簧安全性。您可以使用以下方法将其添加到您的项目中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

您可以像这样定义您的安全设置(我假设其他配置已经完成):

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

// ...

  @Override
  protected void configure(HttpSecurity http) throws Exception {

        http
                //HTTP Basic authentication
                .httpBasic()
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/product/**").hasRole("USER")
                .antMatchers(HttpMethod.POST, "/product").hasRole("ADMIN")
                .antMatchers(HttpMethod.PUT, "/product/**").hasRole("ADMIN")
                .antMatchers(HttpMethod.PATCH, "/product/**").hasRole("ADMIN")
                .antMatchers(HttpMethod.DELETE, "/product/**").hasRole("ADMIN")
                .and()
                .csrf().disable()
                .formLogin().disable();
      }
}

【讨论】:

  • 不,这不是 SO 用户想要的。根据您的代码,只有 USER 可以访问 /product/** GET。管理员将无法执行GET,这不是用户想要的功能。
【解决方案3】:

我猜你安装 Keycloak 是因为它不仅可以控制身份验证,还可以控制授权。那么你根本不需要弹簧安全。您需要为您的客户端启用授权并使用 Keycloak 管理控制台配置资源、策略和权限。这里是documentation

为了能够更精细地控制您的资源,请使用策略实施器并将 HTTP 方法映射到此处所述的范围:How to add HTTP methods in Keycloak resources for Authorization (Without adapters)

值得一看的好例子之一是authz-spring-boot。具有完整的授权流程,但没有方法限制,可以手动添加。

您还可以使用 Keycloak 上的“评估”选项卡检查您的政策是如何运作的。这会模拟客户端对资源的调用并显示结果

【讨论】:

  • 方法 + URI 未在文档中提及。你能举个例子吗?
  • 首先,您应该为您的客户端启用授权。然后出现“授权”菜单。其次,你去授权->资源->创建新过滤器。在 Filter URIS 下,您可以放置​​ URI + 方法。例如“POST /api/*”。在操作下,您将定义相关的权限。例如可以执行此 POST 的用户或组
  • 非常有用的功能是“评估”菜单。使用它进行测试。您可以选择用户、客户端、资源并查看它是否通过您的规则。
  • 文档中确实没有提到这一点,但我在示例中的某个地方找到了它。经过测试,它工作正常。
  • 抱歉回复晚了,@RicardoCampos。我仔细检查了这个例子,发现我的回答并不完全正确。要定义资源方法授权,您首先需要启用策略实施器,如此处所述stackoverflow.com/questions/62323931/… 然后您可以将方法定义为客户端->授权-授权范围的范围之后,您可以将此范围与 URI 一起使用,以基于 HTTP 过滤您的请求方法
【解决方案4】:

我也遇到了同样的问题。以下answer 提供了解释。

因此,您可以将 HTTP 方法定义为范围并通过 following Keycloak API 检查权限。

curl -X POST \
  http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \
  -H "Authorization: Bearer ${access_token}" \
  --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
  --data "audience={resource_server_client_id}" \
  --data "permission=Resource A#GET"

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2012-02-03
    • 2021-11-10
    • 2016-02-19
    相关资源
    最近更新 更多