我有一个非常简单的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
只能访问。
我现在有点迷路了。你有什么想法吗?
非常感谢你!
1条答案
按热度按时间hpcdzsge1#
key斗篷以在访问管理解决方案中拥有最差的策略/访问工具而闻名,但是,您描述的问题似乎有点奇怪。
keydepot是一个访问管理工具,从策略的Angular 来看,它提供决策,它不强制执行这些决策,因此,由于策略评估按预期工作,您所需要做的就是从您的spring应用程序对评估enpoints进行api调用,如果是200,那么用户将访问,如果不是,则页面不显示。
另一种解决方案是使用预先制定的策略实施点,apache/nginxspring都有自己的custon策略实施点。
一些有用的链接:
如何在spring启动应用程序中使用keydepot策略执行器
密钥斗篷强制过滤器