2 Commits

Author SHA1 Message Date
19d27c7722 All done 2026-10-28 09:33:17 +09:00
13241369ae Final Reseult 2026-10-27 15:32:31 +09:00
4 changed files with 52 additions and 31 deletions

View File

@@ -14,46 +14,59 @@ import com.example.demo.service.LoginAttemptService;
// ログイン失敗時の処理
@Component
public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
public class CustomAuthenticationFailureHandler
extends SimpleUrlAuthenticationFailureHandler {
private LoginAttemptService loginAttemptService;
private final LoginAttemptService loginAttemptService;
public CustomAuthenticationFailureHandler(LoginAttemptService loginAttemptService) {
this.loginAttemptService = loginAttemptService;
}
public CustomAuthenticationFailureHandler(
LoginAttemptService loginAttemptService) {
this.loginAttemptService = loginAttemptService;
}
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception)
throws IOException, ServletException {
// 画面から入力されたメールアドレスを取得
String mailAddress = request.getParameter("mailAddress");
// 画面から入力されたメールアドレスを取得
String mailAddress = request.getParameter("mailAddress");
if (mailAddress != null && !mailAddress.isBlank()) {
String mail = mailAddress.trim();
// メールアドレスが空欄の場合
if (mailAddress == null || mailAddress.isBlank()) {
getRedirectStrategy().sendRedirect(
request, response, "/login?error=empty");
return;
}
if (loginAttemptService.isBlocked(mail)) {
getRedirectStrategy().sendRedirect(
request, response, "/login?error=locked");
return;
}
String mail = mailAddress.trim();
// 失敗回数を1増やす
loginAttemptService.loginFailed(mail);
// すでにロックされている場合
if (loginAttemptService.isBlocked(mail)) {
getRedirectStrategy().sendRedirect(
request, response, "/login?error=locked");
return;
}
// すでにロック中なら失敗回数を増やさない
if (loginAttemptService.isBlocked(mail)) {
getRedirectStrategy().sendRedirect(
request, response, "/login?error=locked");
return;
}
// ログイン失敗回数を増やす
loginAttemptService.loginFailed(mail);
// あと何回失敗されるとロックされるか取得
int remaining = loginAttemptService.getRemainingAttempts(mail);
// 失敗回数の上限に達した場合
if (loginAttemptService.isBlocked(mail)) {
getRedirectStrategy().sendRedirect(
request, response, "/login?error=locked");
return;
}
getRedirectStrategy().sendRedirect(
request, response, "/login?error=failed&remaining=" + remaining);
}
// 残りのログイン試行回数を取得
int remaining =
loginAttemptService.getRemainingAttempts(mail);
}
getRedirectStrategy().sendRedirect(
request, response,
"/login?error=failed&remaining=" + remaining);
}
}

View File

@@ -110,6 +110,8 @@ public class EmployeeService {
e.add("社員名よみを入力してください。");
else if (f.getKnEmployee().length() > 100)
e.add("社員名よみは100文字以内で入力してください。");
else if (!f.getKnEmployee().matches("^[\\u3040-\\u309F]+$"))
e.add("社員名よみはひらがなで入力してください");
}
private void checkMail(EmployeeForm f, Integer selfId, List<String> e) {

View File

@@ -126,4 +126,9 @@ th { background: #eaf4f6; }
.page-number:hover {
background: #d5edf1;
}
.page-number.active {
background: #176a78;
color: #fff;
border-color: #176a78;
}

View File

@@ -65,6 +65,7 @@
th:href="@{/books(page=${bookPage.number-1}, nmBook=${nmBook}, publisher=${publisher}, note=${note})}">前へ</a>
<span th:each="pageNum : ${pageNumbers}">
<a class="page-number"
th:classappend="${pageNum == bookPage.number} ? ' active' : ''"
th:href="@{/books(page=${pageNum}, nmBook=${nmBook}, publisher=${publisher}, note=${note})}"
th:text="${pageNum + 1}"></a>
</span>