密钥斗篷中基于GET,POST,PUT,DELETE类型的身份验证

时间:2019-04-25 07:17:35

标签: java spring-boot microservices keycloak

我在URI为/product/{id}的API中有一个资源,并且在VIEW, GET, DELETE上进行了三项操作HttpMethod

如何管理仅允许一个用户VIEW和一个受admin VIEW, GET, DELETE的用户,即所有选项。

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

有人可以帮我实现这个问题或提出一些解决方法吗?

4 个答案:

答案 0 :(得分:4)

我猜您安装了Keycloak不仅是为了能够控制身份验证,而且还可以控制授权。然后,您根本不需要弹簧安全性。您需要使用Keycloak管理控制台为客户端启用授权并配置资源,策略和权限。这是documentation

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

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

您还可以使用Keycloak的“评估”标签来检查策略的工作方式。这将模拟客户端对资源的调用并显示结果

答案 1 :(得分:1)

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

<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();
      }
}

答案 2 :(得分:0)

首先,最合适的选择是使用基于注释的策略michanisam。 因此,在每个休息服务之前,您都需要编写其访问策略,例如:

@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);
}

因此,如您所见,上述方法仅允许admin访问,相同的注释也可以用于rest服务。要使用这种特性,您需要将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

答案 3 :(得分:0)

我也有同样的问题。以下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"