首页 > 解决方案 > 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 应用程序中的端点与给定的资源相关联,以便在发出请求时评估权限?

标签: spring-bootkotlinspring-securityauthorizationkeycloak

解决方案


„<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", "…&quot; )
            .hasRole( "super-user" )
            .anyRequest( )
            .permitAll( );
    }
…
}

在没有您的应用程序和配置的更具体细节的情况下,以上是一个草图。但这是一般方法。

要更具体地掌握上述一般方法,请下载并使用我最近为另一个答案实施的这个 MRE 。


推荐阅读