Spring Boot Keycloak - 如何验证承载令牌?

Posted

技术标签:

【中文标题】Spring Boot Keycloak - 如何验证承载令牌?【英文标题】:Spring Boot Keycloak - How to verify Bearer token? 【发布时间】:2017-09-13 09:38:26 【问题描述】:

Keycloak 版本 2.4.0_FINAL。

在我的 Spring Boot REST API 中,我想在 Keycloak 中验证不记名令牌。

我按照以下步骤操作:

http://www.keycloak.org/docs/2.4/securing_apps_guide/topics/oidc/java/spring-boot-adapter.html

我将 maven 依赖项和以下内容添加到 application.properties。

keycloak.realm = realm
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = app
keycloak.bearer-only = true
keycloak.credentials.secret = ...

keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /r/secure/*

下一步是什么?据我说,这是最后一步,但它似乎没有做任何事情。

更新 应用程序属性:

server.port = 8081
org.keycloak keycloak-tomcat8-adapter 2.4.0.Final
keycloak.realm = myapp
keycloak.auth-server-url = http://localhost:8080/auth
keycloak.ssl-required = external
keycloak.resource = mybackend
keycloak.bearer-only = true
keycloak.credentials.secret = ...
keycloak.use-resource-role-mappings = false

keycloak.securityConstraints[0].securityCollections[0].name = secure
keycloak.securityConstraints[0].securityCollections[0].patterns[0] = /r/secure/*

【问题讨论】:

你的问题是什么,什么不起作用? keycloak 何时验证令牌?我仍然可以在没有令牌的情况下访问 api,没有反馈。 spring boot 在哪个端口上运行,keycloak 在哪个端口上运行? 弹簧启动在 8081 端口(默认除外) 我已经让弹簧安全适配器 + 弹簧靴一起正常工作。但是,如果您的配置不适合您,您应该进行一些调试。启用 keycloak 适配器的日志(通过 logging.level.org.keycloak=DEBUG)并查看发生了什么。 【参考方案1】:

您的安全约束必须至少包含一个角色,即:

keycloak.security-constraints[0].securityCollections[0].authRoles[0]=admin

请务必在 keycloak 中添加此角色并将其分配给您的用户。

【讨论】:

感谢您解决此问题。 我现在在服务器上收到此错误:NOT_ATTEMPTED: bearer only 添加新问题:***.com/questions/43559997/… 我没有足够的声誉来评论其他问题,但由于某些原因,您的 Spring Boot 应用程序认为 http 请求不是 XHR 请求【参考方案2】:

如果您愿意,您可以使用 spring security 解决您的问题。我觉得更好。说明可以在here找到。

例如:

@Override
protected void configure(HttpSecurity http) throws Exception

    super.configure(http);
    http
            .authorizeRequests()
            .antMatchers("/customers*").hasRole("USER")
            .antMatchers("/admin*").hasRole("ADMIN")
            .anyRequest().permitAll();

【讨论】:

以上是关于Spring Boot Keycloak - 如何验证承载令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 微服务架构中使用 Keycloak 实现 JWT?

如何在嵌入式 Spring Boot Keycloak 中设置主题?

如何使用 Angular -> Spring Boot Oauth2 -> Keycloak 获取 keycloak 令牌

如何在 Spring Boot 应用程序中测试 Keycloak 身份验证?

如何使用 Keycloak 在 Spring Boot 中获取当前登录用户?

如何在 Spring Boot 应用程序中使用 Keycloak Policy Enforcer