Как получить токен Keycloak весной

#java #spring #spring-boot #keycloak

#java #весна #spring-boot #keycloak

Вопрос:

У меня есть Spring приложение с Angular интерфейсом, я защитил обе стороны Keycloak 11.0.2 , как я могу получить информацию о токене при отправке запроса из интерфейса, например, я хочу получить доступ к аутентифицированной информации пользователя и атрибутам в Spring side, потому что возвращаемый запрос зависит от атрибутов пользователя.

Ниже приведена моя конфигурация в spring :

 keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=myapp
keycloak.resource=myapp-api
keycloak.ssl-required=external
keycloak.bearer-only=true
keycloak.principal-attribute=preferred_username


@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests().anyRequest().permitAll();
        http.csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new NullAuthenticatedSessionStrategy();
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }
}
 

Ответ №1:

Основываясь на вашем вопросе, я думаю, вы имеете в виду токен ID, который вы можете получить (например) из запроса. Проверьте следующий пример:

 @GetMapping(path = "/student")
public String teen(HttpServletRequest request) throws ServletException {
       KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) request.getUserPrincipal();
       System.out.println("---- ROLES ----");
       token.getAccount().getRoles().forEach(System.out::println);
       Map<String, Object> otherClaims = token.getAccount().getKeycloakSecurityContext().getIdToken().getOtherClaims();

       Enumeration<String> attributeNames = request.getAttributeNames();
       while (attributeNames.hasMoreElements())
            System.out.println(attributeNames.nextElement());

       for(String s : otherClaims.keySet()){
            System.out.println(s);
            System.out.println(otherClaims.get(s).toString());
       }

       System.out.println("------------");
       return "student";
    }
 

Приведенный выше код является лишь примером, но демонстрирует некоторые функциональные возможности API.