Spring Webアプリケーションのログイン – エラー処理とローカライゼーション
1概要
この記事では、バックエンドでSpring Securityによる認証を処理するアプリケーションのためにSpring MVCを使って
簡単なログインページ
を実装する方法を説明します。
Spring Securityでログインを処理する方法の詳細については、/spring-security-login[ここに記事]をリンクして、その設定と実装について深く調べてください。
2ログインページ
非常に単純なログインページを定義することから始めましょう。
<html>
<head></head>
<body>
<h1>Login</h1>
<form name='f' action="login" method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='username' value=''></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password'/></td>
</tr>
<tr>
<td><input name="submit" type="submit" value="submit"/></td>
</tr>
</table>
</form>
</body>
</html>
それでは、フォームを送信する前に、
username
と
password
が入力されていることを確認するためのクライアント側チェックを含めましょう。この例ではプレーンなJavascriptを使用しますが、JQueryも優れた選択肢です。
<script type="text/javascript">
function validate() {
if (document.f.username.value == "" && document.f.password.value == "") {
alert("Username and password are required");
document.f.username.focus();
return false;
}
if (document.f.username.value == "") {
alert("Username is required");
document.f.username.focus();
return false;
}
if (document.f.password.value == "") {
alert("Password is required");
document.f.password.focus();
return false;
}
}
</script>
ご覧のとおり、
username
フィールドまたは
password
フィールドが空かどうかを確認してください。もしそうであれば – JavaScriptメッセージボックスに対応するメッセージが表示されます。
3メッセージローカライゼーション
次に、フロントエンドで使用しているメッセージをローカライズしましょう。このようなメッセージには種類があり、それぞれ異なる方法でローカライズされています。
-
フォームの前に生成されたメッセージは、Springのフォームによって処理されます.
コントローラまたはハンドラこれらのメッセージはJSPで参照できます。
ページがあり、
Jsp/Jsltローカライズ
でローカライズされています(セクション4.3を参照)。
。ページの送信後にローカライズされたメッセージ
Springによる処理(
login
フォームの送信後)。これらのメッセージは
Spring MVCのローカライゼーション
を使ってローカライズされます(セクション4.2を参照)
3.1.
message.properties
ファイル
どちらの場合も、サポートしたい言語ごとに
message.properties
ファイルを作成する必要があります。ファイル名は、
messages
[localeCode].properties__の規則に従ってください。
たとえば、英語とスペイン語のエラーメッセージをサポートしたい場合、ファイルは
messages
en.properties
と
messages
es
ES.properties
になります。英語の場合 – messages.properties__も有効です。
これら2つのファイルをプロジェクトのクラスパス(
src/main/resources
)に配置します。ファイルには、さまざまな言語で表示する必要があるエラーコードとメッセージが含まれています。
message.username=Username required
message.password=Password required
message.unauth=Unauthorized access!!
message.badCredentials=Invalid username or password
message.sessionExpired=Session timed out
message.logoutError=Sorry, error login out
message.logoutSucc=You logged out successfully
3.2. Spring MVCローカライゼーションの設定
Spring MVCは
LocaleChangeInterceptor
APIと連携して動作する
LocaleResolver
を提供し、ロケール設定に応じて異なる言語でメッセージを表示することを可能にします。ローカライズを設定するには – MVC設定____に次のbeanを定義する必要があります。
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
registry.addInterceptor(localeChangeInterceptor);
}
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
return cookieLocaleResolver;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(0);
return messageSource;
}
ここでの1つの重要でより高度な注意点は、**
messageSource
Beanが正しいSpringコンテキストで定義されていることを確認する必要があるということです。それから、それは1つ(または複数)のサーブレットコンテキストを持ちます。
デフォルトでは、ロケールリゾルバはHTTPヘッダからロケールコードを取得します。デフォルトのロケールを強制するには、それを
localeResolver()
に設定する必要があります。
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
return cookieLocaleResolver;
}
このロケールリゾルバは
CookieLocaleResolver
です。つまり、ロケール情報をクライアントサイドのcookieに格納します。そのように – それは彼らがログインする度にそして訪問全体を通してユーザーのロケールを覚えているでしょう。
あるいは、セッションを通してロケールを覚えている
SessionLocaleResolver
があります。代わりにこの
LocaleResolver
を使用するには、上記のメソッドを次のメソッドに置き換える必要があります。
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
return sessionLocaleResolver;
}
最後に、
LocaleChangeInterceptor
は、単純なリンクによってログインページとともに送信された
lang
パラメータの値に基づいてロケールを変更します。
<a href="?lang=en">English</a> |
<a href="?lang=es__ES">Spanish</a>
3.3. JSP/JSLTローカライゼーション
JSP/JSTL APIを使用して、jspページ自体に含まれるローカライズされたメッセージを表示します。 jspローカライゼーションライブラリを使用するには、__ pom.xmlに次の依存関係を追加する必要があります。
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.2-b01</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
4エラーメッセージの表示
4.1. ログイン検証エラー
JSP/JSTLサポートを使用して
login.jsp
にローカライズされたメッセージを表示するには、ページに次の変更を実装します。
{空} 1次のtag lib要素を
login.jsp
に追加します。
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
{空} 2。 __messages.propertiesファイルを指すjsp/jstl要素を追加します。
<fmt:setBundle basename="messages"/>
{空} 3。次の
<fmt:…>
要素を追加して、メッセージをjsp変数に格納します。
<fmt:message key="message.password" var="noPass"/>
<fmt:message key="message.username" var="noUser"/>
<script type="text/javascript">
function validate() {
if (document.f.username.value == "" && document.f.password.value == "") {
alert("${noUser} and ${noPass}");
document.f.username.focus();
return false;
}
if (document.f.username.value == "") {
alert("${noUser}");
document.f.username.focus();
return false;
}
if (document.f.password.value == "") {
alert("${noPass}");
document.f.password.focus();
return false;
}
}
</script>
4.2. ログイン前のエラー
前の操作が失敗した場合、ログインページにエラーパラメータが渡されることがあります。例えば、登録フォーム送信ボタンはログインページをロードします。登録が成功した場合は、ログインフォームに成功メッセージを表示し、反対の場合はエラーメッセージを表示することをお勧めします。
下記の
login
フォームの例では、
regSucc
および
regError
パラメーターをインターセプトし、それらの値に基づいてローカライズされたメッセージを表示することによってこれを実装しています。
<c:if test="${param.regSucc == true}">
<div id="status">
<spring:message code="message.regSucc">
</spring:message>
</div>
</c:if>
<c:if test="${param.regError == true}">
<div id="error">
<spring:message code="message.regError">
</spring:message>
</div>
</c:if>
4.3. ログインセキュリティエラー
何らかの理由でログインプロセスが失敗した場合、Spring Securityは
/login.html?error = true
と定義したログインエラーURLにリダイレクトします。
そのため、ページに登録のステータスを表示したのと同じように、ログインの問題が発生した場合も同様に実行する必要があります。
<c:if test="${param.error != null}">
<div id="error">
<spring:message code="message.badCredentials">
</spring:message>
</div>
</c:if>
<spring:message …>
要素を使用していることに注意してください。つまり、エラーメッセージはSpring MVCの処理中に生成されます。
完全なログインページ – js検証とこれらの追加ステータスメッセージを含むはhttps://github.com/Baeldung/spring-security-registration[githubプロジェクト]にあります。
4.4. ログアウトエラー
次の例では、
logout.html
ページのjspコード
<c:if test =” $ \ {not empty SPRING
SECURITY
LAST
EXCEPTION}”> __によって、ログアウトプロセスにエラーがあったかどうかが確認されます。
たとえば、カスタムログアウトハンドラがログアウトページにリダイレクトする前にユーザーデータを格納しようとしたときに永続性例外が発生した場合
これらのエラーはまれですが、できるだけきちんと対処する必要があります。
完全な
logout.jsp
を見てみましょう。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec"
uri="http://www.springframework.org/security/tags"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<c:if test="${not empty SPRING__SECURITY__LAST__EXCEPTION}">
<div id="error">
<spring:message code="message.logoutError">
</spring:message>
</div>
</c:if>
<c:if test="${param.logSucc == true}">
<div id="success">
<spring:message code="message.logoutSucc">
</spring:message>
</div>
</c:if>
<html>
<head>
<title>Logged Out</title>
</head>
<body>
<a href="login.html">Login</a>
</body>
</html>
ログアウトページもクエリ文字列param
logSucc
を読み取り、その値が
true
に等しい場合、ローカライズされた成功メッセージが表示されます。
5 Springのセキュリティ設定
この記事の焦点は、バックエンドではなく、ログインプロセスのフロントエンドです。そのため、セキュリティ設定の要点についてのみ簡単に説明します。完全な設定については、リンクを読むべきです:/spring-security-login[前の記事]。
** 5.1. ログインエラーURLへのリダイレクト+
**
<form-login …/>
要素の次のディレクティブは、ログインエラーが処理されるURLへのアプリケーションのフローを指示します。
authentication-failure-url="/login.html?error=true"
5.2. ログアウト成功のリダイレクト
<logout
invalidate-session="false"
logout-success-url="/logout.html?logSucc=true"
delete-cookies="JSESSIONID"/>
logout-success-url
属性は、ログアウトが成功したことを確認するパラメータを使用してログアウトページにリダイレクトするだけです。
6. 結論
この記事では、Spring Securityでサポートされているアプリケーションのログインページを実装する方法を説明しました。ログイン検証の処理、認証エラーおよびメッセージのローカライゼーションの表示です。
次回の記事では、ログインと登録のプロセスを完全に実装して運用できるようにすることを目的として、完全な登録の実装について説明します。