我有一个API的资源,其URI是/product/{id}
,并在VIEW, GET, DELETE
上进行三个操作HttpMethod
。
如何管理一个用户只允许VIEW
和admin
被允许VIEW, GET, DELETE
即所有选项。
我曾见过Keycloak Adapter Policy Enforcer
,但我不明白它是如何工作的。我没有在create permission中获取方法选项。
有人可以帮助我实现这个或建议一些方法来实现它。
你需要的是弹簧安全。您可以使用以下方法将其添加到项目中:
<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();
}
}
首先,最合适的选择是使用基于注释的策略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访问,同样的注释也可用于休息服务。要使用这个facelity,您需要将spring security与spring boot应用程序集成在一起。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
有关更多详细信息,请查看本文,但我确实看到这是控制Spring启动应用程序中的数据安全性和服务安全性的最佳方法。