通过key斗篷保护单个资源不受spring引导的影响

nnsrf1az  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(325)

我有一个非常简单的spring-boot应用程序,在 /repositories 以及 /persons .
这是我的 build.gradle 文件。

plugins {
    id 'org.springframework.boot' version '2.4.0'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

// use java 11 until keycloak is fixed
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencyManagement {
    imports {
        mavenBom "org.keycloak.bom:keycloak-adapter-bom:12.0.1"
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.keycloak:keycloak-spring-boot-starter'

    implementation 'org.flywaydb:flyway-core'
    runtime 'org.postgresql:postgresql'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

...
...

这是我的 SecurityConfig.java 文件。

@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) {
    var keycloakAuthenticationProvider = keycloakAuthenticationProvider();
    keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
    auth.authenticationProvider(keycloakAuthenticationProvider);
  }

  @Bean
  @Override
  protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
    return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http.authorizeRequests()
        .antMatchers("/persons*")
        .hasRole("user")
        .anyRequest()
        .permitAll();
  }

  @Bean
  public KeycloakConfigResolver keycloakConfigResolver() {
    return new KeycloakSpringBootConfigResolver();
  }
}

这是我的 application.yaml 文件。

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/postgres
    username: john
    password: john

keycloak:
  auth-server-url: http://localhost:8081/auth/
  realm: myrealm
  resource: myclient
  credentials:
    secret: 45d43bd6-5ab9-476c-83c8-67bd203a78ee

这一切都在我的本地机器上,keydeap和postgres是通过docker compose启动的。

version: "3.1"

volumes:
  postgres_data:
      driver: local

services:
  db:
    image: "postgres:13.1"
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: john
      POSTGRES_PASSWORD: john
  postgres:
    image: "postgres:13.1"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password
  keycloak:
    image: quay.io/keycloak/keycloak:12.0.1
    environment:
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycloak
      DB_USER: keycloak
      DB_SCHEMA: public
      DB_PASSWORD: password
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: Pa55w0rd
    ports:
      - 8081:8080
    depends_on:
      - postgres

我有用户 zemirco 以及 one 他们都有 user 角色。这一切都很好的工作和路线 /persons 受保护,鉴于 /repositories 对所有人开放。
这是我的问题!我想获得个人资源,例如。 /person/1 . 我做不到:(我已经试了好几天了,但是运气不好。这是我的钥匙斗篷设置。
这是我的政策。

这是资源。

这是许可证。

在keydeap的评估过程中一切正常。但是,它不能直接在我的spring启动应用程序中工作。我仍然可以访问 /person/1 作为 zemirco 虽然用户 one 只能访问。
我现在有点迷路了。你有什么想法吗?
非常感谢你!

hpcdzsge

hpcdzsge1#

key斗篷以在访问管理解决方案中拥有最差的策略/访问工具而闻名,但是,您描述的问题似乎有点奇怪。
keydepot是一个访问管理工具,从策略的Angular 来看,它提供决策,它不强制执行这些决策,因此,由于策略评估按预期工作,您所需要做的就是从您的spring应用程序对评估enpoints进行api调用,如果是200,那么用户将访问,如果不是,则页面不显示。
另一种解决方案是使用预先制定的策略实施点,apache/nginxspring都有自己的custon策略实施点。
一些有用的链接:
如何在spring启动应用程序中使用keydepot策略执行器
密钥斗篷强制过滤器

相关问题