要件:
コード:実装
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
.hasAuthority("SWAGGER")
.anyRequest().permitAll()
.and()
.httpBasic()
.and()
.csrf().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("SWAGGER");
}
}
ただし、このコードは機能しません。認証なしで/swagger-ui.html#/を自由に参照できます。
質問は-なぜBASIC認証とユーザーがSwaggerUIエンドポイントに適用されないのですか?
.authenticated()
の代わりに.permitAll()
を使用する必要があります。
_.authorizeRequests()
.antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
.hasRole("SWAGGER")
.anyRequest()
.authenticated()
_
この意志:
_/swagger-resources/*
_、_*.html
_、および_/api/v1/swagger.json
_に一致するすべてのリソースへのアクセスを制限します
他のすべてのリソースへの認証されていないアクセスを許可する
構成が機能しない理由を明確にするために、それはあなたがそれを読むべきであるようにあなたが春のセキュリティを読んでいないからです。
古い構成は次のようになります。
_.authorizeRequests() // allow requests
.antMatchers(...) // that matches this
.hasAuthority("SWAGGER") // with SWAGGER authority
.anyRequest() // All requests above
.permitAll() // grant full access
_
つまり、SWAGGER
権限を持つユーザーにフルアクセスを許可していますが、無視しているのは、デフォルトでは、ユーザーはすでにアクセスできるということです。より正確には、すべての人は、特に指定しない限り、それにアクセスできます。
.authenticated()
を使用する。一致するすべてのリクエストを適切なrole
またはauthority
を持つユーザーに制限するようにSpringに指示しています。
新しい構成:
_.authorizeRequests() // allow requests
.antMatchers(...) // that matches this
.hasRole("SWAGGER") // with role SWAGGER
.anyRequest() // all requests above
.authenticated() // needs authentication
_
_/swagger-resources
_、_/swagger-resources/configuration/security
_、および_swagger-resources/configuration/ui
_が401を返す問題について:
_/swagger-resources/*
_を_/swagger-resources/**
_に置き換える必要があります。
構成のendに以下を追加して、一致しないすべての要求を許可します。
_.authorizeRequests()
.anyRequest()
.permitAll();
_
あなたの設定は奇妙です。あなたはそのようなことを試すことができます:
public static void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.antMatcher("/swagger-ui.html")
.authorizeRequests()
.anyRequest().hasAnyRole("SWAGGER")
.and()
.httpBasic();
}
これにより、swagger-ui.html
パス(SWAGGER
ロールを使用)への承認が保証されます。