我有一个充当资源服务器的 Spring Boot (1.3.x) 应用程序,我可以在 Authorization 标头中从 Keycloak 传递一个 JWT 令牌,并可以访问某些端点。我遇到的问题是我无法获取授权对象中我的 JWT 令牌中的信息。
SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = sc.getAuthentication(); //OR OAuth2Authentication oa = (OAuth2Authentication)a;
Object p = a.getPrincipal();
如果我让 IDP 将其放入令牌中,则 p 将保存 client_id 的名称。
isClientOnly() 返回真。为什么?
我希望能够获得我的用户名和授权,但没有找到。如果我没有client_id,它实际上是空的。
我试图了解是否必须以某种方式配置有关在验证后如何处理 JWT 令牌以便正确信息进入 Authentication 对象的内容,但我完全感到困惑。我怎样才能做到这一点?
Spring Boot 很棒,您可以做这么少的事情来运行某些东西,但与此同时,我不知道从哪里开始,甚至一开始就设置了什么......
我的应用程序.yml:
server:
servlet-path: /*
security:
oauth2:
resource:
jwt:
keyValue:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmFbcU2Q6WZwUjEBvsZP8kIiE5mmctTGq1SOrPN5U4MkaTVs/zs2cWf+fhIE4WQ+dF9xTPxrJCGkwCMMXEhReFadOvzW8S3VdKdhng/j2GUbleU1QLSOGLhXu2+ODxeToZGpXIxtJiK2wE0JI9T6UwAe9j/stp4pMUzQubkG9acA+lpA5+zaCylLHysNFlSO1cTgzTdIZpXQGu5nkmyz7xT6vq8n2qAsD5GG5JRpBAac6L10Hnvl1YbwnPfi1T+IZSq7FdSpGJmYeOiPhJF0j7qYOMcaQgOfzoQGBhXslIHZeeaBIuUM6QFgZacJsVxdQoRvMronuuacnS+bngMEVDQIDAQAB
-----END PUBLIC KEY-----
logging:
level:
org:
springframework:
security: DEBUG
我的 SecurityConfig.java:
package com.something.me;
import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
@Configuration
@EnableOAuth2Sso
@EnableResourceServer
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
//TODO add scope and role restrictions...
http.authorizeRequests().anyRequest().authenticated();
}