Springのoauth2スコープに基づいてリソースフィールドレベルのフィルタリングを実装するためのアノテーションまたはDIベースのアプローチはありますか?Springブート - OAuth2 - フィールドレベルのスコープ制限リソース
私たちは、oauth2スコープで保護されたエンドポイントを持つスプリングブートベースのリソースサーバーを持っています。スコープをエンドポイントから保護するには問題ありませんが、スコープに基づいて公開するリソースから機密情報をフィルタリングできるようにしたいと考えています。例えば。私は、クライアントスコープが許可するときに、人のSSNの最後の4つを公開したいだけです。
スコープがリソースを提示されていない「xyz.read」は次のようになりますので、Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
OAuth2SecurityExpressionMethods expressionMethods = new OAuth2SecurityExpressionMethods(authentication);
boolean hasScope = expressionMethods.hasScope("xyz.read");
if(hasScope) {
resource.setSsn(entity.getSsn());
}
:
は、これまでのところ私は、リソースサーバ上でこれを行うために見つけた唯一の方法は、このようなものです
{
"name": "blah"
}
しかし、スコープ "xyz.read" が存在する場合、リソースは次のようになります。
{
"name": "blah",
"ssn": "123-45-2347"
}
持ちますセキュリティコンテキストの所有者から認証オブジェクトを取得して取得し、新しいOAuth2SecurityExpressionMethodsを作成するには、スコープを確認するたびに、何かが欠落しているように見えます。しかし、これは「純粋な」OAuth2リソースサーバなので、これを実現するためのより良い方法は見つけられていません。
は、これが私たちのリソースサーバの設定がどのように見える(とそれが正常に動作しない)ものです:あなたはビュー名は、認証やアクセスレベルを反映@JsonView注釈、を利用することができ
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/health").permitAll()
.antMatchers("/info").permitAll()
.antMatchers("/").permitAll()
.antMatchers("/**").access("#oauth2.hasScope('xyz.read')");
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("resource-id");
}
}