【Spring MVC + Spring Security】自作ログイン画面を利用して認証する方法

概要

自作ログイン画面を利用した、簡易的なログイン認証機能の利用方法についてまとめた。

 

前提

以下の記事の続きとなる。

あわせて読みたい

概要 Spring Securityが提供するデフォルトのログイン画面を利用して、簡易的なログイン認証機能を利用する方法についてまとめた。   前提 以下の記事の続きとなる。

 

自作ログイン機能

作成するログイン機能は以下のような挙動となる。

 

・未ログイン時は、どのURLにアクセスしても自作したログイン画面にリダイレクトされる
・ログインに成功すると、トップページ画面に遷移する

 

 

実装

自作ログイン機能を実装する。
※ログイン成功後のトップページ画面表示資材については割愛

 

ログイン画面表示

自作ログイン画面で認証機能を実現させるために必要な設定を、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 -> csrf.disable())

CSRF機能は一旦ここでは停止する。(CSRF機能については後の記事にて紹介)

 

.requestMatchers(
new AntPathRequestMatcher(“/authentication”)
).permitAll()

認可ルールを設定する。
今回の自作ログイン画面は「/authentication」のパスでリダイレクトさせる。

permitAll()により、「/authentication」へのリクエストが認証不要となる。
※その他のパスへのリクエストについては、「.anyRequest().authenticated()」により認証を必要としている

 

.loginPage(“/authentication“)

未認証アクセス時にリダイレクトする、ログイン画面のURLを定義するメソッド。

「/authentication」へリダイレクトされた際のログイン画面は自作する。
※このメソッドを定義すると、Spring Securityが自動生成したログイン画面は使用されない

 

.loginProcessingUrl(“/authentication/process”)

自作ログインフォームから送信する際の認証リクエストのURLを定義するメソッド。

この設定により、「/authentication/process」へPOSTリクエストが送信されると、
UsernamePasswordAuthenticationFilterがそのリクエストを処理する。

 

.usernameParameter(“loginId”)

自作ログインフォームから送信されるユーザー名のパラメータ名を”loginId”に変更する設定。
UsernamePasswordAuthenticationFilterが上記のパラメータを取得する。

 

.passwordParameter(“pass”)

ログインフォームから送信されるパスワードのパラメータ名を”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/コンテキストパス/」 + 適当なパス でリクエストを行う。

 

▲認可機能が働き、自作ログイン画面にリダイレクト(/authentication)される

 

▲「user」「password」を入力してログインする

 

▲ログインに成功した場合、「/」にリダイレクトされる

 

まとめ

 

☑ loginPage(…)を設定することで、未認証アクセス時に自作したログイン画面のURLへリダイレクトできる

☑ loginProcessingUrl(…)を設定することで、認証リクエストのURLを指定できる

☑ 自作ログイン画面のユーザー名・パスワードのパラメータ名は変更できる

 

スポンサーリンク