0

リソース サーバーとして機能する Spring Boot (1.3.x) アプリケーションがあり、Authorization ヘッダーで Keycloak から JWT トークンを渡すことができ、いくつかのエンドポイントへのアクセスを許可されています。私が直面している問題は、Authorization オブジェクトの JWT トークンにある情報を取得できないことです。

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

IDPにトークンを入れてもらうと、pにはclient_idの名前が保持されます。

isClientOnly() は true を返します。なんで?

ユーザーの名前と許可を取得できるようにしたいのですが、何も見つかりません。client_id がない場合、実際には null です。

検証後にJWTトークンがどのように処理されるかについて何かを構成する必要があるかどうかを理解しようとしましたが、正しい情報がAuthenticationオブジェクトに取り込まれますが、完全に混乱しています。どうすればそれを実現できますか?

Spring Boot は、何かを実行するためにほとんど何もできないという点で優れていますが、同時に、どこから始めればよいのか、そもそも何を設定すればよいのか途方に暮れています...

私の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();
}
4

2 に答える 2

1

あなたはおそらく原則と混同しています....私が知る限り、他のBeanのように注入できます...または、このようなコントローラーアクションでアクセスできます

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

それに加えて、コードに JwtConfiguration とトークンストア Bean が表示されません....

次のように構成する必要があります (キーがリソース ディレクトリの 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;
    }
}

私が助けてくれることを願っています。多分私の記事はより詳細な説明を与えることができます:)

于 2016-02-07T15:23:58.167 に答える
0

トークンストアの部分は私を途中まで連れて行ってくれました...私の問題は、私がKeycloakを使用していて、フィールド名がほとんど異なるopenid接続トークンを返しているという事実にあるようです。Keycloak トークンの「user_name」などのフィールドをハードコーディングしたところ、突然プリンシパル オブジェクトを取得できましたが、そこには多くの情報が含まれていませんでした。

そのため、Spring の OAuth2 JWT が任意の JWT で自動的に機能すると考えていたのは間違いでした。keycloak アダプターの使用を開始します。

于 2016-02-09T14:21:38.293 に答える