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メッセージローカライゼーション

次に、フロントエンドで使用しているメッセージをローカライズしましょう。このようなメッセージには種類があり、それぞれ異なる方法でローカライズされています。

  1. フォームの前に生成されたメッセージは、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でサポートされているアプリケーションのログインページを実装する方法を説明しました。ログイン検証の処理、認証エラーおよびメッセージのローカライゼーションの表示です。

次回の記事では、ログインと登録のプロセスを完全に実装して運用できるようにすることを目的として、完全な登録の実装について説明します。