0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

あけよろ(SpringBootのstaticフォルダに作る際の命名メモ

Posted at

404 Error! Motivation Not Foun!!

昨年は9月ぐらいからなんやかんやありまして、盛大に更新をサボってたえ~すけさんですよ。
今年はスカウトを来ることを期待して、そこそこに更新していければと考えてますよ。
※フルテレが出来てひたすら実装するだけの仕事をしたい。。。

SpringSecurityを使った際のリソースファイルの制限メモ

SpringBootでSpringSecurityを使う際に、認証関係にて以下のような設定ファイルを定義するかと思います。

SecurityConfig.java
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
  @Bean
  SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    // 省略
    http.authorizeHttpRequests(authz -> authz
        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
    // 省略
    );
  }
}

このPathRequest.toStaticResources().atCommonLocations()って、
具体的にどこのフォルダに当たるんじゃい?ってあまり理解しないまま適当な名前でフォルダ切って作ってる方もいるかと思うので、上記の定義でどのフォルダが認証対象外(permitAll())になるのかを備忘録として残す。

で、どこで定義してあるん?

org.springframework.boot.autoconfigure.security.servlet.StaticResourceRequest.classatCommonLocationsではこんな実装がされてる。

org.springframework.boot.autoconfigure.security.servlet.StaticResourceRequest.java
public final class StaticResourceRequest {
	public StaticResourceRequestMatcher atCommonLocations() {
		return at(EnumSet.allOf(StaticResourceLocation.class));
	}
}

なるほどStaticResourceLocation.classというEnumで定義されてるPathが対象なんだね。

ということで、StaticResourceLocationを見てみる

StaticResourceLocation.class
public enum StaticResourceLocation {
	/**
	 * Resources under {@code "/css"}.
	 */
	CSS("/css/**"),
	/**
	 * Resources under {@code "/js"}.
	 */
	JAVA_SCRIPT("/js/**"),
	/**
	 * Resources under {@code "/images"}.
	 */
	IMAGES("/images/**"),
	/**
	 * Resources under {@code "/webjars"}.
	 */
	WEB_JARS("/webjars/**"),
	/**
	 * The {@code "favicon.ico"} resource.
	 */
	FAVICON("/favicon.*", "/*/icon-*");

	private final String[] patterns;
	StaticResourceLocation(String... patterns) {
		this.patterns = patterns;
	}
	public Stream<String> getPatterns() {
		return Arrays.stream(this.patterns);
	}
}

要はこんな感じでresources/staticフォルダ内を作っていくよ

ディレクトリ構成
/プロジェクト名/src/main/resources/static/
 ├css/
 │ ├CSSファイルを置くよ
 ├js/
 │ ├JavaScriptを置くよ
 ├images/
 │ ├画像を置くよ
 ├webjars
 │ ├webjarを置くよ
 ├favicon.*(favicon.icoやfavicon.pngとかのファビコンを置くよ)

ファビコンに関しては、staticフォルダ内ならicon-*って名前で定義したファイルが有れば認識してくれるっぽいです。
例:/images/icon-fav.ico とかでもイケるのではないかなと

やべぇ、今更フォルダ名とか返らんねぇよ。。。というプロジェクトの方へ

単純にrequestMatchersを追加するだけで大丈夫だよ(知らんけど

SecurityConfig.java
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
  @Bean
  SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    // 省略
    http.authorizeHttpRequests(authz -> authz
        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
        // 画像フォルダをimagesじゃなくて、imgで作っちゃったよって場合
        .requestMatchers("/img/**").permitAll()
    // 省略
    );
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?