Spring Boot 2 + Sping Security OAuth2は引き続き@AuthorizationServer
アノテーションをサポートしていますか?リリースノートを読んでから、いくつかのものが移植されていません:
これが私の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
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
をIDpasswordEncoder
で公開できます。<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
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);
}
それでおしまい。
上記の@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");
}
この質問のループを閉じたかったのです。クライアントシークレットの暗号化に加えて。 RedisTokenStore
の問題は、Spring OAuth 2.3.2: Spring OAuth 2.3.2 の時点で解決されています。