概要
自作ログイン画面を利用した、簡易的なログイン認証機能の利用方法についてまとめた。
前提
以下の記事の続きとなる。
概要 Spring Securityが提供するデフォルトのログイン画面を利用して、簡易的なログイン認証機能を利用する方法についてまとめた。 前提 以下の記事の続きとなる。
自作ログイン機能
作成するログイン機能は以下のような挙動となる。
・ログインに成功すると、トップページ画面に遷移する
実装
自作ログイン機能を実装する。
※ログイン成功後のトップページ画面表示資材については割愛
ログイン画面表示
自作ログイン画面で認証機能を実現させるために必要な設定を、SecurityFilterChain内で定義する。

SecurityConfig.java
package com.example.prototype.biz.security.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// CSRF機能を無効
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> auth
// 認証不要のURL
.requestMatchers(
new AntPathRequestMatcher("/authentication")
)
.permitAll()
// その他のURLは認証が必要
.anyRequest().authenticated())
.formLogin(form -> form
// ログイン画面URL
.loginPage("/authentication")
// UsernamePasswordAuthenticationFilterが認証処理を行うURL
.loginProcessingUrl("/authentication/process")
// フォームの name="loginId" を認識
.usernameParameter("loginId")
// フォームの name="pass" を認識
.passwordParameter("pass")
.defaultSuccessUrl("/", true));
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withUsername("user").password("{noop}password").roles("USER").build();
return new InMemoryUserDetailsManager(user);
}
}
CSRF機能は一旦ここでは停止する。(CSRF機能については後の記事にて紹介)
new AntPathRequestMatcher(“/authentication”)
).permitAll()
認可ルールを設定する。
今回の自作ログイン画面は「/authentication」のパスでリダイレクトさせる。
permitAll()により、「/authentication」へのリクエストが認証不要となる。
※その他のパスへのリクエストについては、「.anyRequest().authenticated()」により認証を必要としている
未認証アクセス時にリダイレクトする、ログイン画面のURLを定義するメソッド。
「/authentication」へリダイレクトされた際のログイン画面は自作する。
※このメソッドを定義すると、Spring Securityが自動生成したログイン画面は使用されない
自作ログインフォームから送信する際の認証リクエストのURLを定義するメソッド。
この設定により、「/authentication/process」へPOSTリクエストが送信されると、
UsernamePasswordAuthenticationFilterがそのリクエストを処理する。
自作ログインフォームから送信されるユーザー名のパラメータ名を”loginId”に変更する設定。
UsernamePasswordAuthenticationFilterが上記のパラメータを取得する。
ログインフォームから送信されるパスワードのパラメータ名を”pass”に変更する設定。
UsernamePasswordAuthenticationFilterが上記のパラメータを取得する。
ログイン画面
自作ログイン画面を実装する。
「/authentication」へのGETリクエストを処理するコントローラーの説明は割愛し、エラーメッセージ制御も未実装とする。
login.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>ログイン画面</title>
</head>
<body>
<h2>ログイン</h2>
<form action="${pageContext.request.contextPath}/authentication/process" method="post">
<label for="loginId">ログインID:</label>
<input type="text" id="loginId" name="loginId" autofocus />
<br />
<label for="password">パスワード:</label>
<input type="password" id="pass" name="pass" />
<br />
<input type="submit" value="ログイン" />
</form>
<br>
</body>
</html>
動作確認
ログイン認証を行う。
「http:localhost:8080/コンテキストパス/」 + 適当なパス でリクエストを行う。



まとめ
☑ loginPage(…)を設定することで、未認証アクセス時に自作したログイン画面のURLへリダイレクトできる
☑ loginProcessingUrl(…)を設定することで、認証リクエストのURLを指定できる
☑ 自作ログイン画面のユーザー名・パスワードのパラメータ名は変更できる
