我目前正在尝试为一个简单的Sping Boot 后端应用程序实现安全性。为此,我打算将Keycloak与Spring Security结合使用。在尝试了几十个教程设置(只是一个基本的过滤器/ SecurityConfig)之后,我对为什么SecurityFilterChain
不能工作一无所知。
作为参考-以下是我的依赖项:
- org.springframework. Boot :spring-boot-starter:3.1.0
- org.springframework. Boot :spring-boot-starter-web:3.1.0
- Boot :spring-boot-starter-oauth2-client:3.1.0
- Boot :spring-boot-starter-security:3.1.0
- Boot :spring-boot-starter-oauth2-resource-server:3.1.0
- org.projectlombok:lombok:1.18.26
- org.springframework. Boot :spring-boot-starter-test:3.1.0
Sping Boot 3.1.0!由于网上的材料是过去两年的,我也尝试了不同的版本通过(eidogg)。<spring-security.version>6.1.1</spring-security.version>
等)
至于我的application.properties
,我添加了最基本的设置:
spring.security.oauth2.client.registration.keycloak.client-id=[client-id]
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.scope=openid
spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8080/realms/dev
spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username
就这样!现在来看看我经历过的不同方法 * 不成功 *:
1. Tutorial from Baeldung
在那里,它指定了用于@Bean
的SecurityConfig,返回SecurityFilterChain
:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/customers*")
.hasRole("USER")
.anyRequest()
.permitAll();
http.oauth2Login()
.and()
.logout()
.addLogoutHandler(keycloakLogoutHandler)
.logoutSuccessUrl("/");
http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
return http.build();
}
...显然,'authorizeRequests()'
已经过时了。同样适用于'oauth2Login()'
(甚至标记为删除)!
2. GitHub Issue #10187讨论
在前面提到的问题中,一个深入的讨论爆发了,许多成员分享了他们的代码片段。这是一个非常新的主题(2022年),因此我认为它仍然适用于当前的标准。
@Configuration
@RequiredArgsConstructor
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final KeycloakLogoutHandler keycloakLogoutHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() //
.anyRequest().fullyAuthenticated() //
.and().oauth2Client() //
.and().oauth2Login().tokenEndpoint().and().userInfoEndpoint().userAuthoritiesMapper(userAuthoritiesMapper()) //
.and().and()
.logout().addLogoutHandler(keycloakLogoutHandler)
;
}
private GrantedAuthoritiesMapper userAuthoritiesMapper() {
[...]
我玩了一些沿着的东西。再说一次...除了已知的标记为deprecated
(oauth2Client()
,oauth2Login()
等)的罪魁祸首之外,最大的问题是WebSecurityConfigurerAdapter
也被弃用了。当打开issue #12514时,我被告知应该继续使用类似于第一种方法的SecurityFilterChain
。
无论哪种方式,我已经烧了大约10+教程现在,无法找到一个工作项目,这是-考虑到KeyCloak的大小-非常奇怪。我发现的唯一好的信息是去年的旧KeyCloak adapters were deprecated...虽然我还没有使用过它们,正如你在上面看到的。
有人能帮我吗?我想设置一个SIMPLESecurityConfig
来构建基础。只需从请求中获取承载令牌(顺便说一句,KeyCloak相关的设置工作),然后验证JWT并将用户角色/权限与端点上的所需角色进行比较 (最好不是全局设置,而是每个端点的本地设置)。
1条答案
按热度按时间46scxncf1#
如果你的Spring应用只是作为一个资源服务器,请看我的例子:https://github.com/dasniko/keycloak-bookshop-demo/tree/master/msgbroker
在依赖项中,只有
org.springframework.boot:spring-boot-starter-oauth2-resource-server
。application.properties
只需要配置spring.security.oauth2.resourceserver.jwt.issuer-uri
,SecurityConfig类也很小。