0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SpringBootで独自ログイン画面や認証除外ページ設定

Last updated at Posted at 2024-04-24

この記事はこれの続きです

概要

image.png

WebScurityConfigクラス新規作成

NekoWebScurityConfig.java
package com.example.demo;


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.web.SecurityFilterChain;


@Configuration
@EnableWebSecurity
public class NekoWebScurityConfig {
	
	
	@Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		
    	http
    	
    	.authorizeHttpRequests((requests) -> requests
    			
                //アクセス制限除外URL。
                .requestMatchers("/",
                		"/login-input",
                		"/okok/*")
                .permitAll()
                .anyRequest()
                .authenticated()
    			
    			)
    	
    	.formLogin((login) -> login
    			
    			//ユーザーIDとパスワードを受け取るパラメーター名。
                .usernameParameter("username")
                .passwordParameter("password")
                
                //ログイン実行ページ。
                //仮にLoginTryControllerクラスを作ってもその内容は無視されます。
                .loginProcessingUrl("/login-try")
                
                //ユーザーIDとパスワード入力画面。
                .loginPage("/login-input")
                
                //ログイン失敗時遷移先。
                //ログイン失敗用のページを用意しません。
                //それを用意すると
                //『ユーザーIDとパスワード入力画面へのリンクをクリック』
                //という無駄な操作が発生するため。
                .failureUrl("/login-input?error")
                                
                //ログイン成功時遷移先。
                .defaultSuccessUrl("/login-success", true)
                
                .permitAll()

    			)
    	
    	.logout((logout) -> logout
    			
    			//ログアウトを実行するURL。
    			.logoutUrl("/logout")
    			
    			//ログアウト時の遷移先。
    	        .logoutSuccessUrl("/login-input")
    	        
    	      	//HTTPセッションを無効に。
    	        .invalidateHttpSession(true)
    	        
    	        //ログアウト時にクッキーを削除。
    	        .deleteCookies("JSESSIONID")
    	        
    	        .permitAll()
    	        
    			);
    	
    	
    	return http.build();
    	
    	
	}
	
	
}

ユーザーIDとパスワード入力画面用意

LoginInputController
package com.example.demo;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public final class LoginInputController {

	
	@GetMapping("/login-input")
	public final String main() throws Exception {
		return "/login-input";
	}
	
	
}
login-input.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
	
	<h1>login-input</h1>
	
	<form th:action="@{/login-try}" method="POST">
		<div>
			<div>ID</div>
			<input type="text" id="username" name="username" required autofocus />
		</div>
    	<div>
			<div>パスワード</div>
    		<input type="password" id="password" name="password" required />
    	</div>
		<button type="submit" value="go">ログイン</button>
    </form>
    
    <div th:if="${param.error != null}">
	    ログインに失敗しました。
	</div>
    
</body>
</html>

ログイン成功画面用意

LoginSuccessController
package com.example.demo;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public final class LoginSuccessController {

	
	@GetMapping("/login-success")
	public final String main() throws Exception {
		return "/login-success";
	}
	
	
}
login-success.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
	<h1>login-success</h1>
	
	<form th:action="@{/logout}" method="POST">
		<!-- aタグのリンクだとクロスサイトリクエストフォージェリー対策のhiddenパラメータが送られず、セッション破棄されないので注意 -->
		<button type="submit" value="go">ログアウト</button>
	</form>
	
</body>
</html>

ログアウト処理用意

LogoutController
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public final class LogoutController {

	
	@GetMapping("/logout")
	public final String main() throws Exception {
		return "/login-input";
	}
	
	
}

認証無しで行けるページ

割愛します。

動作結果

SpringBoot起動直後にhttp://localhost:8080/login-successにアクセスすると下記になります。

『未ログインなのに認証が必要なページにいきなり行こうとしたので、ログイン画面に飛ばされた』 形です。
image.png

誤ったIDやパスワードだと…
image.png

こうなります。
image.png

ログイン成功すれば下記です。
image.png

ログアウトボタン押すとこうなります。
image.png

最終的にはこう

赤枠が追加になったものです。
image.png

ログアウト機能実装の注意点

この記事の続き

参考サイトさん

バージョン

Microsoft Windows [Version 10.0.22631.3447]
JAVA 17.0.10
Spring Boot v3.1.11

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?