当前位置: 首页 > 知识库问答 >
问题:

Spring Security+Keycloak授权:如何将endpoint与资源相关联?

陆翰学
2023-03-14

我使用spring-boot-starter-securitykeycloak-spring-security-adapter创建了一个Spring Boot应用程序,并使用Keycloak对用户进行身份验证。

现在我想使用KeyCloak的授权服务对我的API进行细粒度访问控制。

在Keycloak中,我已经为我的客户启用了授权。我已经创建了一个角色,并将该角色分配给我的测试用户。我已经创建了一个资源和一个基于资源的权限,并添加了一个基于角色的策略。使用评估功能,我已经确认,我的用户有权访问我的资源。

假设我有一个带有一个endpoint的以下控制器。

@RestController
class GreetingController {

    @GetMapping("/hello")
    fun getPatientInfo(principal: Principal): String {
        return "Hello, ${principal.name}!"
    }
}

现在我的问题是:如何将Spring Boot应用程序中的endpoint与给定的资源相关联,以便在发出请求时评估权限?

共有1个答案

蒋联
2023-03-14

“……如何将Spring Boot应用程序中的endpoint与给定资源相关联,以便在发出请求时评估权限?……”

举个例子,让我们说…

  • 您的Keycloak服务器在端口8585上运行
  • 您的应用程序服务器在端口8080上运行
  • 您的领域命名为“MyRealm
  • 您的资源名为“my-client-resource
  • 您的角色名为“超级用户
#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
…
@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( );
    }
…
}

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

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

 类似资料:
  • 我有以下场景:一个客户端应用程序试图访问API网关后面的APIendpoint。我想验证(使用id和秘密)应用程序,如果它是应用程序A允许它访问endpoint/信用,如果它是应用程序B允许它访问endpoint/借方。 我假设API网关应该验证一个调用是否应该被拒绝。你能告诉我我的工作流应该是什么样子,我应该使用什么Keycloak功能吗?

  • 密钥锁留档中写到,令牌endpoint可用于在授权代码流中获取临时代码,或通过隐式流、直接授权或客户端授权获取令牌。 但是即使使用response_type=code,我也无法获得授权码:只能获得令牌。我该怎么做呢? 我的测试请求: 资料来源:https://www.keycloak.org/docs/latest/server_admin/index.html#keycloak-服务器oidc-

  • 我有一个JHipster网关和微服务,目前配置为通过KeyCloak使用OAuth/OIDC。目前,所有资源都可供经过身份验证的用户使用。我希望使用keycloak中可用的细粒度安全性(启用对JHipster微服务客户机id的授权),通过资源id(如keycloak文档中所引用的)https://www.keycloak.org/docs/latest/authorization_services

  • 我正在尝试构建一个微服务架构。我已经了解了API网关的一些好处,比如:负载平衡、调用多个微服务并聚合结果、缓存管理等。所以我决定将它包含在我的系统中。 我的问题是,我应该在网关层还是在每个微服务endpoint单独实现授权?例如,在网关上验证用户,并以解密的形式将用户声明传递给每个服务调用的授权逻辑。 在调用每个服务之前授权一些聚合似乎是有意义的,并且节省了处理时间。然而,授权逻辑实际上是单个服务

  • 随着 Jekyll 被更广泛的使用,一系列的教程、框架、扩展、示例和其他各种有用的资源也相继出现。下面列出了一些最流行的 Jekyll 资源合辑的链接。 Jekyll 提示和技巧,以及示例 与 GitHub Pages 集成的技巧 重用代码并保持文档同步至最新的示例。 使用 Simple Form 来集成一个简单的联系表单 JekyllBootstrap.com 提供了详细的解释,例子和辅助代码让

  • Windows 命令行界面 cmder 的官方网站 宁皓网《命令行》视频课程 宁皓网《我的工作流程:Windows》视频课程里的命令行 宁皓网《我的工作流程》视频课程里的终端