Spring Securityチュートリアルを動かす
spring security を学んでみようと思う。
モチベーション
Javaを使ってWebアプリを作ってみようとするときSpringが有名っぽいですよね。
私も例外ではなくSpringを使用してAPIサーバを作ってみていたんですが,
ある日「ログイン機能の実装はSpring Securityなるもので作ってね」と平然と言われ結局うまく作れませんでした;;
個人で遊びで作る分にはログイン機能はいらないやと作るのをサボって痛い目見ました…
ということでSpring Securityをつかって学んでみます。
さっさと動かしてみる。
簡単にJava17以降で動かしてくださいねということだったので,RepositoryをCloneしてJava環境はDockerで用意した。
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
に飛んだ。
Usrnameはuserで,Passwordはpasswordでログインできる。
ログイン情報は以下に設定されていた。
// 33行目あたりに設定されてた。
@Bean
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
コードをちょっと読んでみる
コードは大きく以下の二つのメソッドしか書かれていなかった。
一つは以下のsecurityFilterChain
メソッド。
他の記事やブログに平然と書いてあるもの。 ”おまじない” のように書かれているので大切だと思う。
(予想ですが,ざっくり内容はHttpSecurity
インスタンスで色々設定を追加してSpring Securityのビルド時に渡している?ような気がします。)
authorizeHttpRequests
は簡単にいうとSpring Securityでログインしているかどうか確かめるパスを設定できるっぽい。
-
requestMatchers("/", "/home").permitAll()
はパスが一致しているリクエストのアクセス権をALLに設定(みんなアクセスできる)というようにしている。 - また
anyRequest().authenticated()
は以前に設定がなかったリクエスト全てをログイン済みじゃないとアクセスできないようにしている。
formLogin
はログインフォームを表示しているということ以外はよくわかりませんでした。次回以降の記事で勉強していこうと思います。
logout()
もSpring Securityがよしなにログアウト処理を行なってくれているようです。これも次回以降の記事で勉強していこうと思います。
※ 以下のリンクで説明してくれている模様。
またユーザ情報は上でも挙げた通りここで設定されている。
SpringのDIコンテナにUserDetailインスタンスをまとめておくことができるようです。
Userをつくって設定を変更しているようにみえます。
終わりに
次回はSpringも勉強しつつSpring Securityを使ってログイン機能を実装したい。
Spring SecurityとAngularを使用してSPAでの実装をやってみるチュートリアルも見つけたのでそちらもやりつつ勉強していきたい。
(そもそも筆者はSpring Bootを理解していないので果てしない道のりになりそうです。)
Discussion