我在URI为/product/{id}
的API中有一个资源,并且在VIEW, GET, DELETE
上进行了三项操作HttpMethod
。
如何管理仅允许一个用户VIEW
和一个受admin
VIEW, GET, DELETE
的用户,即所有选项。
我看过Keycloak Adapter Policy Enforcer
,但是我不明白它是如何工作的。
我没有在创建权限中获得方法选项。
有人可以帮我实现这个问题或提出一些解决方法吗?
答案 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应用程序中控制数据安全性和服务安全性的最佳方法。
答案 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"