spring-boot - Spring Security + Keycloak 授权:如何将端点与资源相关联?
问题描述
我已经创建了一个 Spring Boot 应用程序,spring-boot-starter-security
并且keycloak-spring-security-adapter
使用 Keycloak 对用户进行身份验证按预期工作。
我现在想使用 Keycloak 的授权服务对我的 API 进行细粒度的访问控制。
在 Keycloak 中,我为我的客户启用了授权。我创建了一个角色并将该角色分配给我的测试用户。我创建了一个资源和一个基于资源的权限,并添加了一个基于角色的策略。使用评估功能,我已经确认我的用户有权访问我的资源。
假设我有以下带有一个端点的控制器。
@RestController
class GreetingController {
@GetMapping("/hello")
fun getPatientInfo(principal: Principal): String {
return "Hello, ${principal.name}!"
}
}
现在我的问题是:如何将 Spring Boot 应用程序中的端点与给定的资源相关联,以便在发出请求时评估权限?
解决方案
„<em>...如何将 Spring Boot 应用程序中的端点与给定资源关联,以便在发出请求时评估权限?...</em>“</p>
举个例子,比如说……</p>
- 您的 Keycloak 服务器正在端口 8585 上运行
- 您的应用程序服务器正在端口 8080 上运行
- 你的领域被命名为“<em>
myrealm
”</li> - 您的资源名为“<em>
my-client-resource
”</li> - 您的角色名为“<em>
super-user
”</li>
然后在你的 Spring Boot 应用程序的application.properties文件中设置……</p>
#port on which the application would run
server.port = 8080
keycloak.realm = myrealm
keycloak.auth-server-url = http://localhost:8585/auth
keycloak.ssl-required = none
#keycloak resource is the client ID
keycloak.resource = my-client-resource
keycloak.use-resource-role-mappings = true
keycloak.public-client = true
…
# Configures what ${principal.name} will return
keycloak.principal-attribute=preferred_username
然后,您可以使用……连接到 Spring Boot 的 Keycloak 配置中……</p>
…
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity( prePostEnabled = true )
@ComponentScan( basePackageClasses = KeycloakSecurityComponents.class )
public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {
@Override
public void configure( HttpSecurity http ) throws Exception {
super.configure( http );
http.authorizeRequests( )
.antMatchers( "/hello", "…" )
.hasRole( "super-user" )
.anyRequest( )
.permitAll( );
}
…
}
在没有您的应用程序和配置的更具体细节的情况下,以上是一个草图。但这是一般方法。
推荐阅读
- r - 以组内匹配的行元素为条件进行变异
- elasticsearch - 所有特定属性的 Elasticsearch 动态模板
- python - 对受 CloudFlare 保护的 API 的 Python 请求返回 403
- python - 我正在尝试交换列表中的两个元素,但是在第一次交换之后,它会不断被交换,因为它符合要交换的条件
- java - 如何使用@WebMvcTest 连接千分尺
- jquery - 使用带有ajax jquery的codeignter上传多个文件
- matplotlib - 如何在 Matplotlib 中获得固定高度(以像素为单位)、固定数据 x/y 纵横比并自动移除移除水平空白边距?
- jquery - 使用 jQuery 时获取 rails 对象 id 的问题
- asp.net - Angular 8 使用 ASP NET Core 3.1 Web Api 时出现 CORS 策略问题
- amazon-web-services - 使用 Circleci 和 Terraform 在 ECS Fargate 上持续部署和交付