2016-02-02 185 views
0

我有一個充當資源服務器的Spring Boot(1.3.x)應用程序,我可以在Authorization標頭中傳遞來自Keycloak的JWT令牌,並且被清除以訪問某些端點。我遇到的問題是,我無法獲取Authorization對象中我的JWT令牌中的信息。Spring OAuth2和JWT身份驗證信息

SecurityContext sc = SecurityContextHolder.getContext(); 
Authentication a = sc.getAuthentication(); //OR OAuth2Authentication oa = (OAuth2Authentication)a; 
Object p = a.getPrincipal(); 

和P將舉行CLIENT_ID的名字,如果我有IDP把它的令牌。

isClientOnly()返回true。爲什麼?

我希望能夠得到我的用戶名和贈款,但沒有發現。 如果我沒有client_id,它實際上是空的。

我試着瞭解,如果我不知怎麼配置了一些關於如何處理JWT令牌後進行驗證,所以正確的信息進入認證對象,但我完全困惑。我怎樣才能做到這一點?

春天啓動的巨大的你如何能做到這麼少拿東西運行,但在同一時間,我不知所措我哪裏開始,或什麼是真正甚至在第一位置設置...

我application.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(); 
} 

回答

0

令牌存儲部分讓我的一部分...看來我的問題在於,我使用Keycloak,它是返回openid連接令牌的字段名稱大多不同。我對Keycloak標記中的某些字段進行了硬編碼,例如'user_name',並且突然之間可以獲得一個主體對象,儘管其中沒有太多信息。

所以我錯誤地認爲Spring的OAuth2 JWT的東西只會自動與任何JWT一起工作。開始使用keycloak適配器。

1

你可能得到的原則混淆....據我所知你可以注入像其他豆類或...訪問我噸這樣

@Controller 
class MyController { 
    @RequestMapping("/greeting") 
    public Principal greeting(Principal user) { 
    return user; 
    } 
} 

旁邊的一個位指示行動,我沒有看到任何JwtConfiguration以及令牌存儲裝置豆在你的代碼....

您必須配置這樣的事情(假設您的密鑰保存在您的資源目錄中的public.cert)

@Configuration 
public class JwtConfiguration { 
    @Autowired 
    JwtAccessTokenConverter jwtAccessTokenConverter; 


    @Bean 
    @Qualifier("tokenStore") 
    public TokenStore tokenStore() { 

     System.out.println("Created JwtTokenStore"); 
     return new JwtTokenStore(jwtAccessTokenConverter); 
    } 

    @Bean 
    protected JwtAccessTokenConverter jwtTokenEnhancer() { 
     JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
     Resource resource = new ClassPathResource("public.cert"); 
     String publicKey = null; 
     try { 
      publicKey = new String(FileCopyUtils.copyToByteArray(resource.getInputStream())); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
     converter.setVerifierKey(publicKey); 
     return converter; 
    } 
} 

希望我能幫上忙。也許my article可以給一個更接近的解釋:)