Spring Boot Webアプリケーションを開発し、SpringセキュリティJava構成を使用してセキュリティを保護しようとしています。
アドバイスされているように、静的なWebリソースを 'src/main/resources/public'に配置した後 ここでSpringブログで 、私は静的リソースを取得できます。つまり、ブラウザでhttps://localhost/test.html
を押すと、htmlコンテンツが提供されます。
Spring Securityを有効にした後、静的リソースURLにアクセスするには認証が必要です。
私の関連するSpring Security Java configは次のようになります。
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.
authorizeRequests()
.antMatchers("/","/public/**", "/resources/**","/resources/public/**")
.permitAll()
.antMatchers("/google_oauth2_login").anonymous()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/home")
.and()
.csrf().disable()
.logout()
.logoutSuccessUrl("/")
.logoutUrl("/logout") // POST only
.and()
.requiresChannel()
.anyRequest().requiresSecure()
.and()
.addFilterAfter(oAuth2ClientContextFilter(),ExceptionTranslationFilter.class)
.addFilterAfter(googleOAuth2Filter(),OAuth2ClientContextFilter.class)
.userDetailsService(userService);
// @formatter:on
}
Src/main/resources/public内に配置された静的リソースを許可するためにantMatchersを構成するにはどうすればよいですか?
知っておくべきことがいくつかあります。
src/main/resources/public
に配置されたリソースは、アプリケーションのルートから提供されます。たとえば、src/main/resources/public/hello.jpg
はhttp://localhost:8080/hello.jpg
から提供されますこれが、現在のマッチャー構成が静的リソースへのアクセスを許可していない理由です。 /resources/**
が機能するには、リソースをsrc/main/resources/public/resources
に配置し、http://localhost:8080/resources/your-resource
でアクセスする必要があります。
Spring Bootを使用している場合、追加の構成を追加するのではなく、デフォルトを使用することを検討できます。デフォルトでは、Spring Bootは/css/**
、/js/**
、/images/**
、および/**/favicon.ico
へのアクセスを許可します。たとえば、src/main/resources/public/images/hello.jpg
という名前のファイルを作成し、追加の構成を追加しなくても、http://localhost:8080/images/hello.jpg
からログインしなくてもアクセスできます。これは、 Webメソッドセキュリティサンプル ここで、特別な設定なしでBootstrap CSSファイルへのアクセスが許可されます。
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/resources/**"); // #3
}
「/ resources /」で始まるリクエストは無視します。これは、XML名前空間構成を使用する場合のhttp @ security = noneの構成に似ています。
ステップ1。プロジェクトに「MvcConfig.Java」を追加します。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
}
ステップ2。 SecurityConfigクラスにconfigure(WebSecurity web)
オーバーライドを追加します
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/resources/**");
}
ステップ3。すべての静的リソースをwebapp/resources /..に配置します
これは、回答(スプリングブート2の場合)と質問の両方の場合があります。春のセキュリティと組み合わせた春のブート2では、すべての(すべてのルート/アンマッチャーを意味する)がデフォルトで保護されているようです
WebSecurityConfigurerAdapter
個別のセキュリティメカニズムを使用しない場合、すべては以前と同じですか?
Andy Wilkinsonが上記の回答で述べているように、古いスプリングブートバージョン(1.5以下)では、public/** or static/**
のような場所はデフォルトで許可されています。
したがって、この質問/回答をまとめると、スプリングセキュリティ付きスプリングブート2を使用しており、個別のセキュリティメカニズムがある場合、任意のルートに配置された静的コンテンツへのアクセスを排他的に許可する必要があります。そのようです:
@Configuration
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {
private final ThdAuthenticationProvider thdAuthenticationProvider;
private final ThdAuthenticationDetails thdAuthenticationDetails;
/**
* Overloaded constructor.
* Builds up the needed dependencies.
*
* @param thdAuthenticationProvider a given authentication provider
* @param thdAuthenticationDetails given authentication details
*/
@Autowired
public SpringSecurityConfiguration(@NonNull ThdAuthenticationProvider thdAuthenticationProvider,
@NonNull ThdAuthenticationDetails thdAuthenticationDetails) {
this.thdAuthenticationProvider = thdAuthenticationProvider;
this.thdAuthenticationDetails = thdAuthenticationDetails;
}
/**
* Creates the AuthenticationManager with the given values.
*
* @param auth the AuthenticationManagerBuilder
*/
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(thdAuthenticationProvider);
}
/**
* Configures the http Security.
*
* @param http HttpSecurity
* @throws Exception a given exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
.antMatchers("/management/**").hasAnyAuthority(Role.Role_Engineer.getValue(),
Role.Role_Admin.getValue())
.antMatchers("/settings/**").hasAnyAuthority(Role.Role_Engineer.getValue(),
Role.Role_Admin.getValue())
.anyRequest()
.fullyAuthenticated()
.and()
.formLogin()
.authenticationDetailsSource(thdAuthenticationDetails)
.loginPage("/login").permitAll()
.defaultSuccessUrl("/bundle/index", true)
.failureUrl("/denied")
.and()
.logout()
.invalidateHttpSession(true)
.logoutSuccessUrl("/login")
.logoutUrl("/logout")
.and()
.exceptionHandling()
.accessDeniedHandler(new CustomAccessDeniedHandler());
}
}
次の新しいコード行に注意してください。
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
Spring Boot 1.5以前を使用する場合、これらの場所(static/public/webjarsなど)を明示的に許可する必要はありません。
以下は公式のメモです。新しいセキュリティフレームワークでは、それ自体の古いバージョンに関して何が変更されましたか。
これが誰かの助けになることを願っています。ありがとうございました!ごきげんよう!
Webjarを使用している場合。これをconfigure
メソッドに追加する必要があります:http.authorizeRequests().antMatchers("/webjars/**").permitAll();
これが最初のステートメントであることを確認してください。例えば:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/webjars/**").permitAll();
http.authorizeRequests().anyRequest().authenticated();
http.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.usernameParameter("email")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.deleteCookies("remember-me")
.logoutSuccessUrl("/")
.permitAll()
.and()
.rememberMe();
}
Webjarを有効にするには、これも必要です。
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
...
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
...
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
String[] resources = new String[]{
"/", "/home","/pictureCheckCode","/include/**",
"/css/**","/icons/**","/images/**","/js/**","/layer/**"
};
http.authorizeRequests()
.antMatchers(resources).permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout().logoutUrl("/404")
.permitAll();
super.configure(http);
}
}
私は私の春のブートアプリケーションで同じ問題を抱えていたので、私はあなたたちと私のソリューションを共有するといいと思いました。 antMatchersを特定の種類の塗りつぶしに合わせて設定するだけです。私の場合、それはjs filles and js.mapのみでした。コードは次のとおりです。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/index.html", "/", "/home",
"/login","/favicon.ico","/*.js","/*.js.map").permitAll()
.anyRequest().authenticated().and().csrf().disable();
}
}
面白いのは何ですか。 resources path like "resources/myStyle.css" antMatcherが機能しなかったことがわかりました私にとっては。 resorucesフォルダー内にフォルダーがある場合は、antMatcherに"/ myFolder/myFille.js" *のように追加するだけで問題なく動作するはずです。