【Springセキュリティ】ログインしないと見られないページを作ってみよう
新人
「先輩、Spring Securityって何に使うんですか?入れたら何が変わるんですか?」
先輩
「Spring Securityは、ログイン認証やアクセス制限など、セキュリティの機能を簡単に追加できるSpringの拡張ライブラリだよ。」
新人
「ログイン認証って、自分のページにログインしないと入れないようにするやつですか?」
先輩
「その通り!今回は『ログインしないと見られないページ』を作って、Spring Securityの基本的な使い方を学ぼう。」
1. Spring Securityとは?
Spring Security(スプリングセキュリティ)は、JavaのWebアプリケーションに認証(ログイン)や認可(アクセス制限)の機能を追加できるセキュリティフレームワークです。Spring Frameworkと連携して動作するので、少ない設定で安全なWebアプリケーションを作成することができます。
たとえば、「このページはログインしたユーザーだけが見られるようにしたい」「管理者しかアクセスできない画面を作りたい」といったケースで役立ちます。
Spring Securityを使うと、ログインフォームの表示、ログイン後の遷移、ログアウト処理などが簡単に実装できます。
今回の記事では、Java初心者の方でも理解しやすいように、実際にログインしないと見られないページを作りながら、Spring Securityの仕組みを解説していきます。
2. 「ログインしないと見られないページ」の目的と活用シーン
「ログインしないと見られないページ」とは、その名の通りユーザーがログインしていないとアクセスできないページのことです。この機能は、ユーザーの個人情報や管理者専用の情報を守るために必須の仕組みです。
たとえば、次のような場面でよく使われます:
- 会員専用ページやマイページ
- 管理画面(管理者だけが見られるページ)
- 社内ポータルサイトなどの限定公開ページ
ログイン認証がないと、誰でもURLを直接入力して中身を見られてしまいます。しかし、Spring Securityを導入することで、ログインしていない場合は自動的にログインページへリダイレクトされるように設定できます。
以下は、Spring Securityでログインしないとアクセスできないようにするための基本的な流れです。
- Spring Securityのstarterを依存関係に追加(今回はpleiadesのチェックで追加)
- ログインページの用意(HTML)
- セキュリティ設定ファイルでアクセス制限の指定
このように設定することで、ログインしていない状態ではアクセスをブロックし、ログイン後にのみページを表示できるようになります。
次回は、Spring Securityの導入と設定方法について、pleiadesとGradleを使った具体的な手順を紹介します。
3. Spring Securityの依存関係を追加する方法(pleiades+Gradle)
Spring Securityを使うためには、まず依存関係にSpring Security関連のライブラリを追加する必要があります。今回の環境では、pleiadesを使ってGradleの設定を自動的に行うため、コードを手書きする必要はありません。
以下の手順で進めていきましょう。
- pleiadesを起動し、対象のSpring Bootプロジェクトを開きます。
- 左側のプロジェクトエクスプローラーからプロジェクト名を右クリックし、「Springツール」→「Spring Bootスターターの追加」を選択します。
- 検索欄に「security」と入力し、「Spring Security」をチェックします。
- 右下の「完了」ボタンを押すと、自動的に
build.gradleファイルに必要な設定が追加されます。
追加後のbuild.gradleファイルには、以下のような記述が追加されているはずです。
implementation 'org.springframework.boot:spring-boot-starter-security'
この設定により、Spring Securityのライブラリがプロジェクトに組み込まれ、ログイン機能やアクセス制限を設定できるようになります。
4. ログインページの作成と基本セキュリティ設定
Spring Securityを導入すると、デフォルトでログインページが自動的に表示されるようになります。しかし、今回は自分でログインページのHTMLを作成し、それを使ってログインできるようにします。
まずは、以下のようにHTMLファイルを作成します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ログインページ</title>
</head>
<body>
<h1>ログイン</h1>
<form method="post" action="/login">
<label>ユーザー名: <input type="text" name="username"></label><br>
<label>パスワード: <input type="password" name="password"></label><br>
<button type="submit">ログイン</button>
</form>
</body>
</html>
このファイルはsrc/main/resources/templates/login.htmlの位置に保存してください。
次に、セキュリティ設定クラスを作成して、上記のHTMLページをログイン画面として使用するように設定します。
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.context.annotation.Bean;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.formLogin(form -> form
.loginPage("/login") // 独自のログインページを指定
.permitAll()
)
.logout(logout -> logout
.logoutSuccessUrl("/login?logout")
)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/css/**").permitAll()
.anyRequest().authenticated()
);
return http.build();
}
}
この設定により、ログインページとして/loginが表示され、ログイン成功後は保護されたページにアクセスできるようになります。
5. ログインしないとアクセスできないURLの制限方法
Spring Securityでは、アクセス制限をauthorizeHttpRequestsで細かく設定できます。たとえば、ログインしていないユーザーは「/private」にアクセスできないようにする場合、以下のように設定します。
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login", "/css/**").permitAll()
.requestMatchers("/private/**").authenticated() // ログイン必須のパス
.anyRequest().permitAll()
)
これにより、/private配下のページはログインしていないとアクセスできず、ログインページにリダイレクトされます。
また、HTMLでページを作成する際には、ユーザーがログインした後に表示されるページも用意しましょう。以下は簡単な例です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>マイページ</title>
</head>
<body>
<h1>マイページ</h1>
<p>このページはログインしないと見られません。</p>
<a href="/logout">ログアウト</a>
</body>
</html>
このファイルはsrc/main/resources/templates/private/mypage.htmlなどの場所に配置します。
コントローラ側では、以下のように@Controlerを使って画面に遷移させます。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PageController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/private/mypage")
public String myPage() {
return "private/mypage";
}
}
このように設定することで、Spring Securityによってログインしないとアクセスできないページが簡単に作成できます。
6. ログイン後の遷移先を設定する方法(成功時・失敗時)
Spring Securityでは、ログイン処理の成功後や失敗時に遷移するページを自由に指定できます。ログインに成功したときにユーザー専用のマイページへ遷移させることで、より自然なユーザー体験を実現できます。
まずは、セキュリティ設定クラスに以下のような記述を追加します。
.formLogin(form -> form
.loginPage("/login") // 独自のログインページを指定
.defaultSuccessUrl("/private/mypage", true) // 成功時の遷移先
.failureUrl("/login?error") // 失敗時の遷移先
.permitAll()
)
defaultSuccessUrlはログイン成功後に表示するURLを設定するものです。trueを指定すると、常にこのURLにリダイレクトされます。ログイン前に別ページへアクセスしていた場合でも、強制的にこのページに遷移します。
failureUrlではログイン失敗時に表示するページを設定します。たとえば、ログインページに「エラー」のパラメータを付けてリダイレクトするように設定できます。
ログインページ側でエラーメッセージを表示したい場合は、以下のようにth:ifを使って条件表示できます(Thymeleafを使う場合)。
<p th:if="${param.error}">ユーザー名またはパスワードが間違っています。</p>
このようにしておくと、ログイン失敗時に適切なメッセージを表示できるようになります。
7. ログアウト処理の仕組みとログアウトリンクの設定
Spring Securityには、ログアウト機能が最初から用意されています。特別な設定をしなくても、デフォルトで/logoutにアクセスすることでログアウト処理が行われます。
ログアウト処理には、以下のような流れがあります。
- 認証情報(セッション)が破棄される
- ログアウト後に指定されたページにリダイレクトされる
セキュリティ設定クラスでは、次のように記述します。
.logout(logout -> logout
.logoutUrl("/logout") // デフォルトのログアウトURL
.logoutSuccessUrl("/login?logout") // ログアウト後の遷移先
.invalidateHttpSession(true) // セッションを無効化
.deleteCookies("JSESSIONID") // Cookie削除
)
ログアウトのリンクは、通常のHTMLに以下のように記述します。
<a href="/logout">ログアウト</a>
注意点として、POSTリクエストが必要な設定をしている場合は、formタグを使う必要がありますが、デフォルトではGETでも動作するため、初心者はまずこの形で試してみるのがよいでしょう。
8. セキュリティ設定の確認方法(未ログインとログイン後の違い)
Spring Securityの設定が正しく機能しているかを確認するためには、以下のような動作確認を行うことが大切です。
① 未ログイン状態で保護されたページにアクセス
ブラウザで/private/mypageなど、ログインが必要なURLにアクセスしてみましょう。未ログインであれば、自動的に/loginにリダイレクトされるはずです。
もしそのままページが表示されてしまう場合は、セキュリティ設定クラスのauthorizeHttpRequestsの指定に漏れがないか確認してください。
② 正しいユーザー名とパスワードでログイン
ログインフォームに正しい情報を入力し、ログインボタンをクリックすると、/private/mypageへリダイレクトされ、保護されたページが表示されるはずです。
③ 間違った情報でログインしてみる
間違ったパスワードを入力すると、/login?errorにリダイレクトされ、エラーメッセージが表示されるように設定していれば、適切なフィードバックを確認できます。
④ ログアウト後の動作
ログアウトリンクをクリックすると、セッションが無効化されて、/login?logoutに遷移します。再度/private/mypageにアクセスすると、またログインページにリダイレクトされることを確認してください。
⑤ Cookieの削除確認
ブラウザのデベロッパーツールなどで「JSESSIONID」などのCookieが削除されているかも確認しておくとよいでしょう。
このように、Spring Securityのログイン認証やアクセス制限、ログアウト処理が正しく動作しているかを一通り確認することで、実践的な開発に活かせるようになります。