Spring Webアプリのログイン-エラー処理とローカリゼーション
1. 概要
この記事では、バックエンドでSpring Securityを使用した認証を処理するアプリケーションに対して、Spring MVCを使用してa simple Login Pageを実装する方法を説明します。
Spring Securityでログインを処理する方法の詳細については、here’s the articleがその構成と実装について詳しく説明しています。
2. ログインページ
a very simple login pageを定義することから始めましょう:
Login
次に、フォームを送信する前に、usernameとpasswordが入力されていることを確認するクライアント側のチェックを含めましょう。 この例では、プレーンなJavascriptを使用しますが、JQueryも優れたオプションです。
ご覧のとおり、usernameまたはpasswordフィールドが空かどうかを確認するだけです。もしそうなら–javascriptメッセージボックスが対応するメッセージとともにポップアップします。
3. メッセージのローカリゼーション
次へ–フロントエンドで使用しているメッセージをローカライズしましょう。 そのようなメッセージには種類があり、それぞれが異なる方法でローカライズされています。
-
フォームで生成されたメッセージは、Springのコントローラーまたはハンドラーによって処理されます。 これらのメッセージはJSPページで参照でき、Jsp/Jslt localizationでローカライズされます(セクション4.3を参照)。
-
Springによる処理のためにページが送信されると(loginフォームを送信した後)ローカライズされるメッセージ。これらのメッセージは、Spring MVC localizationを使用してローカライズされます(セクション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. SpringMVCローカリゼーションの構成
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つは、the messageSource bean is defined in the right Spring context(使用されるコンテキスト)を確認する必要があるということです。 Webアプリにはルートコンテキストがあり、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パラメータの値に基づいてロケールを変更することに注意してください。
3.3. JSP/JSLT Localization
JSP/JSLT API will be used to display localized messages that are caught in the jsp page itself. jspローカリゼーションライブラリを使用するには、pom.xmlに次の依存関係を追加する必要があります。
javax.servlet.jsp
javax.servlet.jsp-api
2.3.2-b01
javax.servlet
jstl
1.2
4. エラーメッセージの表示
4.1. ログイン検証エラー
JSP / JSPLサポートを使用し、ローカライズされたメッセージをlogin.jspに表示するために、ページに次の変更を実装します。
1. 次のタグlib要素をlogin.jspに追加します。
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
2. messages.propertiesファイルを指すjsp / jslt要素を追加します。
3. 次の<fmt:…>要素を追加して、メッセージをjsp変数に格納します。
4. エラーメッセージをローカライズするために、セクション3で見たログイン検証スクリプトを変更します。
4.2. ログイン前のエラー
前の操作が失敗した場合、ログインページにエラーパラメータが渡されることがあります。 たとえば、登録フォームの送信ボタンはログインページを読み込みます。 登録が成功した場合、ログインフォームに成功メッセージを表示し、反対の場合はエラーメッセージを表示することをお勧めします。
以下のサンプルloginフォームでは、regSuccおよびregErrorパラメーターをインターセプトし、それらの値に基づいてローカライズされたメッセージを表示することにより、これを実装しています。
4.3. ログインセキュリティエラー
何らかの理由でログインプロセスが失敗した場合、Spring SecurityはログインエラーURLにリダイレクトします。これは/login.html?error=trueと定義されています。
そのため、ページで登録のステータスを表示する方法と同様に、ログインの問題が発生した場合も同じようにする必要があります。
<spring:message …>要素を使用していることに注意してください。 これは、Spring MVC処理中にエラーメッセージが生成されることを意味します。
js検証とこれらの追加のステータスメッセージを含む完全なログインページは、github projectにあります。
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"%>
Logged Out
Login
ログアウトページもクエリ文字列paramlogSuccを読み取り、その値がtrueに等しい場合、ローカライズされた成功メッセージが表示されることに注意してください。
5. Springセキュリティ構成
この記事の焦点は、バックエンドではなく、ログインプロセスのフロントエンドです。そのため、セキュリティ構成の要点について簡単に説明します。完全な構成については、previous articleを読む必要があります。
5.1. ログインエラーURLへのリダイレクト
<form-login…/>要素の次のディレクティブは、ログインエラーが処理されるURLにアプリケーションのフローを指示します。
authentication-failure-url="/login.html?error=true"
5.2. ログアウト成功リダイレクト
logout-success-url属性は、ログアウトが成功したことを確認するパラメーターを使用して、ログアウトページにリダイレクトするだけです。
6. 結論
この記事では、Spring Securityがサポートするアプリケーションにログインページを実装する方法を示しました。ログイン検証の処理、認証エラーの表示、メッセージのローカライズ。
次の記事では、完全な登録の実装について説明します。これは、ログインと登録のプロセスの完全な実装を本番環境で使用できるようにすることを目的としています。