web-dev-qa-db-ja.com

Spring Boot 2.0.0 + OAuth2

Spring Boot 2 + Sping Security OAuth2は引き続き@AuthorizationServerアノテーションをサポートしていますか?リリースノートを読んでから、いくつかのものが移植されていません:

Oauth2サポート

これが私のbuild.gradeの関連セクションです。

認証サーバー

// security
compile "org.springframework.boot:spring-boot-starter-security:${springBootVersion}"
// oauth
// https://mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2
compile "org.springframework.security.oauth:spring-security-oauth2:2.2.1.RELEASE"

クライアントサーバー

// support for Oauth2 user token services not yet migrated into Spring Boot 2.0
compile "org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.0.1.BUILD-SNAPSHOT"

そして現在、Authorization Server Oauth2エンドポイントは、client-idとclient-secretをBasic Authenticationから/oauth/tokenに渡そうとすると、401を返します。ユーザー名とパスワードを渡すと、異なるコードパスが提供されます。したがって、OAuth=フィルターが整列していないようです。

私もこれを見つけました: Spring Boot 2 OAuth2スターターの変更

構成の更新はありましたか、または承認サーバーを以前の状態に復元するには、別の一連のGradle依存関係が必要ですか?

ありがとう!


[〜#〜]更新[〜#〜]

この質問のループを閉じたかったのです。クライアントシークレットの暗号化に加えて。 RedisTokenStoreの問題は、Spring OAuth 2.3.2: Spring OAuth 2.3.2

7
false_memories

Spring Security 5は最新のパスワードストレージを使用します。 OAuth2 Autoconfig を参照してください:

独自の承認サーバー構成を使用して、以下に示すようにClientDetailsServiceConfigurerのインスタンスを介して有効なクライアントのリストを構成する場合、ここで構成するパスワードは、Spring Security 5に付属する最新のパスワードストレージの対象となることに注意してください。

問題を解決するには、 Spring Security Reference を参照してください。

トラブルシューティング

次のエラーは、「パスワードの保存形式」で説明されているように、保存されているパスワードのいずれかにIDがない場合に発生します。

Java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
     at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.Java:233)
     at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.Java:196)

エラーを解決する最も簡単な方法は、パスワードのエンコードに使用するPasswordEncoderを明示的に提供するように切り替えることです。これを解決する最も簡単な方法は、パスワードが現在どのように保存されているかを把握し、正しいPasswordEncoderを明示的に提供することです。 Spring Security 4.2.xから移行する場合は、NoOpPasswordEncoder Beanを公開することにより、以前の動作に戻すことができます。たとえば、Java構成を使用している場合、次のような構成を作成できます。

NoOpPasswordEncoderに戻すことは安全とは見なされません。安全なパスワードエンコーディングをサポートするには、代わりにDelegatingPasswordEncoderを使用するように移行する必要があります。

@Bean
public static NoOpPasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}

xML構成を使用している場合は、PasswordEncoderをID passwordEncoderで公開できます。

<b:bean id="passwordEncoder"
    class="org.springframework.security.crypto.NoOpPasswordEncoder" factory-method="getInstance"/>

または、すべてのパスワードの前に正しいIDを付けて、DelegatingPasswordEncoderを引き続き使用することもできます。たとえば、BCryptを使用している場合は、次のようなものからパスワードを移行します。

$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG

{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
8
dur

OAuth2 AuthorizationServerは基本認証を使用します。

したがって、AuthorizationServerConfigでdelegatedPasswordEncoderを使用してクライアントシークレットをエンコードし、「ID "null"の例外にマッピングされたPasswordEncoderがない」という例外を完全に解決する必要もあります。

八尾劉の答えは私の問題を解決しました。

1)PasswordEncoderを自動ワイヤリングするBeanを作成しました。

@Bean
public PasswordEncoder passwordEncoder() {
    String idForEncode = "bcrypt";
    Map<String, PasswordEncoder> encoderMap = new HashMap<>();
    encoderMap.put(idForEncode, new BCryptPasswordEncoder());
    return new DelegatingPasswordEncoder(idForEncode, encoderMap);
}

2)AuthorizationServerConfigクラスの自動有線passwordEncoder;

@Autowired
private PasswordEncoder passwordEncoder;

3)passwordEncoderでエンコードされたCLIENT_SECRET。

@Override
public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
    configurer
         .inMemory()
         .withClient(CLIENT_ID)
         .secret(passwordEncoder.encode(CLIENT_SECRET))
         .authorizedGrantTypes(GRANT_TYPE_FOR_LOGIN, GRANT_TYPE_FOR_REFRESH)
         .scopes(SCOPE_READ, SCOPE_WRITE)
         .accessTokenValiditySeconds(TOKEN_VALIDITY_SECONDS)
         .refreshTokenValiditySeconds(TOKEN_VALIDITY_SECONDS)
         .resourceIds(RESOURCES_IDS);
}

それでおしまい。

6
gultekinfatih

上記の@false_memoriesで述べたように、Spring Boot 2では、秘密をエンコードする必要があります。私のプロジェクトでは、次のようになります。

public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    String secretEncoded = passwordEncoder().encode("secret");
    clients.inMemory().withClient("some-web-app").secret(secretEncoded).accessTokenValiditySeconds(expiration)
            .scopes("read", "write").authorizedGrantTypes("password", "refresh_token").resourceIds("resource");
}
1
Yao Liu

この質問のループを閉じたかったのです。クライアントシークレットの暗号化に加えて。 RedisTokenStoreの問題は、Spring OAuth 2.3.2: Spring OAuth 2.3.2 の時点で解決されています。

0
false_memories