Spring Securityのサンプルです。SpringBootを使用します。
(確認環境:Spring Boot 2.5,JDK 11,thymeleaf3)
目次
サンプル | Spring Securityの認証を確認する |
pom.xmlの設定 | |
ログインする画面(login.html) | |
設定ファイル(SecurityTestConfig.java) | |
コントローラのクラス(MainController.java) | |
ログイン後の画面(testform.html) |
Spring Securityの認証を確認する
画面の動き
1.ログイン画面表示時
ユーザー名とパスワードを入力し正しければ次の画面に遷移します。
2.ログイン成功時の画面
ログインしたユーザー名が表示されます。ログアウトボタンを押すとログイン画面に戻ります。
3.ログアウト時
ログアウトボタンを押してログイン画面に戻るとログアウトのメッセージが表示されます。
4.入力エラー時
ログイン画面で入力したユーザー名またはパスワードが異なる時はメッセージを表示します。
githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-security
pom.xmlの設定
必要なライブラリです。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
ログインする画面(login.html)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8" />
<title>test</title>
</head>
<body>
<div th:if="${param.error}">
ユーザ名またはパスワードが異なります。
</div>
<div th:if="${param.logout}">
ログアウトしました。
</div>
<form th:action="@{/test1/testform}" method="post">
ユーザ名:<input type="text" name="username" />
パスワード:<input type="password" name="password" />
<input type="submit" value="ログイン" />
</form>
</body>
</html>
9行目は、8行目のerrorのパラメータを受け取った時に表示されます。
12行目は、11行目のlogoutのパラメータを受け取った時に表示されます。
14行目は、postで送信します。
設定ファイル(SecurityTestConfig.java)
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityTestConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated();
http.formLogin()
.loginProcessingUrl("/test1/testform")
.loginPage("/test1/login")
.usernameParameter("username")
.passwordParameter("password")
.successForwardUrl("/test1/testform")
.failureUrl("/?error");
http.logout()
.logoutSuccessUrl("/?logout").permitAll();
}
@Autowired
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
PasswordEncoder enc = PasswordEncoderFactories.createDelegatingPasswordEncoder();
auth.inMemoryAuthentication()
// .withUser("1").password("2").roles("USER");
.withUser("test1").password(enc.encode("1")).roles("USER");
}
}
21行目のloginProcessingUrlの引数はログインする画面(login.html)の14行目のactionと同じにします。
22行目のloginPageはログインの画面を指定します。
25行目のsuccessForwardUrlは、ログイン成功時に遷移します。
26行目のfailureUrlは、ログイン失敗時に遷移します。パラメータとして?の後にerrorがあります。
28行目のlogoutSuccessUrlは、ログアウト時に遷移します。パラメータとして?の後にlogoutがあります。
35行目のencodeは、パスワードをハッシュ化するためのメソッドです。行わない場合エラーになります。
コントローラのクラス(MainController.java)
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class MainController {
@GetMapping("/")
public String disp1() {
return "test1/login";
}
@PostMapping("/test1/testform")
public String testPage() {
return "test1/testform";
}
}
初期表示時は、11行目が実行されます。
ログイン成功後は15行目が実行されます。
ログイン後の画面(testform.html)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>テストページ</title>
</head>
<body>
<p>ログインに成功しました</p>
<p>ユーザ名:
<span th:text="${#authentication.principal.username}">
</span></p>
<form th:action="@{/logout}" method="post">
<button type="submit">ログアウト</button>
</form>
</body>
</html>
10行目は、ログインしたユーザー名が表示されます。
関連の記事