🫠

Spring Securityチュートリアルを動かす

に公開

spring security を学んでみようと思う。

モチベーション

Javaを使ってWebアプリを作ってみようとするときSpringが有名っぽいですよね。

私も例外ではなくSpringを使用してAPIサーバを作ってみていたんですが,
ある日「ログイン機能の実装はSpring Securityなるもので作ってね」と平然と言われ結局うまく作れませんでした;;

個人で遊びで作る分にはログイン機能はいらないやと作るのをサボって痛い目見ました…

ということでSpring Securityをつかって学んでみます。

さっさと動かしてみる。

https://docs.spring.io/spring-security/reference/index.html
https://spring.io/guides/gs/securing-web
以上Spring公式ドキュメントから提供されている情報。
https://github.com/spring-guides/gs-securing-web
Spring Securityを使ったWebアプリのサンプルが提供されているのでこれを動かしてみる。
簡単にJava17以降で動かしてくださいねということだったので,RepositoryをCloneしてJava環境はDockerで用意した。

docker-compose.yaml
services:
  spring-security-app:
    image: eclipse-temurin:17-jdk
    container_name: spring-security-app
    working_dir: /
    volumes:
      - ./:/app
    ports:
      - "8080:8080"
    command: >
      bash -c "
        apt-get update && apt-get install -y git
        cd app
        ./gradlew bootRun
      "
    environment:
      - SPRING_PROFILES_ACTIVE=dev

動作確認できた。
localhost:8080で開くとlocalhost:8080/helloに飛ぶリンクがあり,押下するとlocalhost:8080/loginに飛んだ。

home display
Usrnameはuserで,Passwordはpasswordでログインできる。
ログイン情報は以下に設定されていた。

WebSecurityConfig.java
    // 33行目あたりに設定されてた。
        @Bean
	public UserDetailsService userDetailsService() {
		UserDetails user =
			 User.withDefaultPasswordEncoder()
				.username("user")
				.password("password")
				.roles("USER")
				.build();

		return new InMemoryUserDetailsManager(user);
	}

login display

コードをちょっと読んでみる

コードは大きく以下の二つのメソッドしか書かれていなかった。
一つは以下のsecurityFilterChainメソッド。
他の記事やブログに平然と書いてあるもの。 ”おまじない” のように書かれているので大切だと思う。
(予想ですが,ざっくり内容はHttpSecurityインスタンスで色々設定を追加してSpring Securityのビルド時に渡している?ような気がします。)

https://github.com/spring-guides/gs-securing-web/blob/main/complete/src/main/java/com/example/securingweb/WebSecurityConfig.java#L17-L31

authorizeHttpRequestsは簡単にいうとSpring Securityでログインしているかどうか確かめるパスを設定できるっぽい。

  • requestMatchers("/", "/home").permitAll()はパスが一致しているリクエストのアクセス権をALLに設定(みんなアクセスできる)というようにしている。
  • またanyRequest().authenticated()は以前に設定がなかったリクエスト全てをログイン済みじゃないとアクセスできないようにしている。

formLoginはログインフォームを表示しているということ以外はよくわかりませんでした。次回以降の記事で勉強していこうと思います。
logout()もSpring Securityがよしなにログアウト処理を行なってくれているようです。これも次回以降の記事で勉強していこうと思います。
※ 以下のリンクで説明してくれている模様。
https://docs.spring.io/spring-security/reference/servlet/authentication/logout.html

またユーザ情報は上でも挙げた通りここで設定されている。
SpringのDIコンテナにUserDetailインスタンスをまとめておくことができるようです。
Userをつくって設定を変更しているようにみえます。
https://docs.spring.io/spring-security/reference/api/java/org/springframework/security/core/userdetails/UserDetails.html
https://github.com/spring-guides/gs-securing-web/blob/main/complete/src/main/java/com/example/securingweb/WebSecurityConfig.java#L32-L44

終わりに

次回はSpringも勉強しつつSpring Securityを使ってログイン機能を実装したい。
Spring SecurityとAngularを使用してSPAでの実装をやってみるチュートリアルも見つけたのでそちらもやりつつ勉強していきたい。

(そもそも筆者はSpring Bootを理解していないので果てしない道のりになりそうです。)

Discussion