2016-02-02 3 views
0

У меня есть приложение Spring Boot (1.3.x), действующее как сервер ресурсов, что я могу передать токен JWT из Keycloak в заголовке авторизации и очищается для доступа к некоторым конечным точкам. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить информацию, которая находится в моем токене 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, это фактически null.

Я попытался понять, нужно ли мне каким-то образом настроить что-то о том, как маркеры JWT обрабатываются после проверки, поэтому правильная информация попадает в объект аутентификации, но я совершенно смущен. Как я могу это сделать?

Spring Загрузочный здорово, как вы можете сделать так мало, чтобы получить что-то работает, но в то же время, я в недоумении, где начать или что на самом деле даже установить в первую очередь ...

мой 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, и внезапно мог получить основной объект, хотя и не имел большого количества информации в нем.

Так что я ошибся, думая, что материал Spring OAuth2 JWT Spring просто будет работать с любым JWT. Запуск работы с адаптером keyclayak.

1

вы, возможно, запутался с принципом .... насколько я знаю, вы можете вводить его, как и другие бобы ... или доступ i т в действие регулятора, как этот

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

Beside этого, я не вижу никаких 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 может дать более подробное объяснение :)

Смежные вопросы