この記事はこれの続きです
概要
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にアクセスすると下記になります。
『未ログインなのに認証が必要なページにいきなり行こうとしたので、ログイン画面に飛ばされた』 形です。
最終的にはこう
ログアウト機能実装の注意点
この記事の続き
参考サイトさん
バージョン
Microsoft Windows [Version 10.0.22631.3447]
JAVA 17.0.10
Spring Boot v3.1.11