【发布时间】:2019-03-27 19:13:41
【问题描述】:
我正在使用 Keycloak 5、Spring Boot 2 和 Angular 7 创建一个 SPA。
一切都很好,甚至application.properties 中的 keycloack 配置和角色保护。但是当我尝试创建一个 Bean 来获取用户令牌数据时,我收到了一个空 bean。不明白为什么,和Keycloak文档里的代码一样……
import javax.servlet.http.HttpServletRequest;
import org.keycloak.KeycloakSecurityContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@Configuration
public class KeycloakConfig {
/**
* Retorna o contexto de segurança do Keycloak.
*
* @return
*/
@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public KeycloakSecurityContext accessToken() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
return (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
}
}
启动配置:
keycloak.enabled = true
keycloak.auth-server-url = http://acesso.tre-pa.jus.br/auth
keycloak.realm = TRE-PA
keycloak.resource = acesso-sistemas-service
keycloak.credentials.secret = ca70294a-af51-4abb-81f9-234566de2c7c
keycloak.ssl-required = external
keycloak.use-resource-role-mappings = false
keycloak.bearer-only = true
keycloak.autodetect-bearer-only = true
keycloak.principal-attribute = preferred_username
logging.level.org.keycloak = DEBUG
spring.main.allow-bean-definition-overriding = true
# spring.autoconfigure.exclude = org.keycloak.adapters.springboot.KeycloakSpringBootConfiguration
keycloak.securityConstraints[0].securityCollections[0].name = secured-area
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /secured/*
keycloak.securityConstraints[1].securityCollections[0].patterns[1] = /admin/*
keycloak.securityConstraints[1].authRoles[0] = DEVELOPER
keycloak.securityConstraints[1].securityCollections[0].name = service-area
keycloak.securityConstraints[1].securityCollections[0].patterns[0] = /service/*
【问题讨论】:
-
你能链接到keycloak docs部分,它解释了这样做吗?您基本上是在告诉您在当前 HTTP 请求中需要一个名为
org.keycloak.KeycloakSecurityContext的属性,我认为它不存在。您应该从会话 IMO 中检索它。 -
也许这种方式不再有效,因为它是不同的版本。
-
@Please_Dont_Bully_Me_SO_Lords 我遇到了同样的问题。如果您找到任何解决方案,请告诉我。另外你能告诉我你在哪里找到了 keycloak-spring-boot-starter 的文档吗?
标签: java spring-boot keycloak