7

ユーザーの認証に Spring セキュリティを使用しています。カスタム認証プロバイダーを作成しましたが、プロバイダーからフォームにエラー メッセージを取得する方法を知りたいと思っています。これは、私のカスタム認証プロバイダーの authenticate() メソッドです。

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    UserProfile profile = userProfileService.findByEmail(authentication.getPrincipal().toString());

    if(profile == null){
        throw new UsernameNotFoundException(String.format("Invalid credentials", authentication.getPrincipal()));
    }

    String suppliedPasswordHash = DigestUtils.shaHex(authentication.getCredentials().toString());

    if(!profile.getPasswordHash().equals(suppliedPasswordHash)){
        throw new BadCredentialsException("Invalid credentials");
    }

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(profile, null, profile.getAuthorities());

    return token;
}

これは私のフォームです:

<form name='f' action="<c:url value='j_spring_security_check' />" method='POST'>
<div id="data-entry-form">

    <div class="form-entry">
        <label><spring:message code="login.form.label.email"/></label>
        <input type='text' name='j_username' value=''>
    </div>
    <div class="form-entry">
        <label><spring:message code="login.form.label.password"/></label>
        <input type='password' name='j_password'/>
    </div>
    <div class="form-entry">
        <input type="submit" value="Verzenden"/>
    </div>
</div>

フォームにエラー メッセージを表示するにはどうすればよいですか? ログインボタンを押した瞬間からSpringが引き継ぐので、エラーメッセージを生成できる唯一のメソッドはauthenticate()メソッドです...

4

3 に答える 3

5

私は次のようにそれを解決することができました:

<c:if test="${param.auth eq 'failure'}">
  <div class="error">
    <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />
  </div>
</c:if>

次のように spring-security 構成で設定できる特別なパラメーターを介してエラーが発生したかどうかを検出する必要があることに注意してください。

<security:form-login [...] authentication-failure-url="/login?auth=failure" />

編集: 実際には、そのパラメーターを渡す必要はありません。SPRING_SECURITY_LAST_EXCEPTION.message代わりに、次のように が定義されているかどうかを簡単に確認できます。

<c:if test="${not empty SPRING_SECURITY_LAST_EXCEPTION.message}">
  <div class="error">
    <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />
  </div>
</c:if>
于 2016-07-11T07:19:02.000 に答える
4

「標準の」オーセンティケーターを使用するのと同じ方法でメッセージを取得できるはずだと思います。認証プロセスで 1 つまたは複数の例外がスローされた場合、最後の例外がセッション属性 SPRING_SECURITY_LAST_EXCEPTION に格納されます。

したがって、JSP から最後の例外メッセージを取得するには、次のようなものを使用できます。

<%=((Exception) request.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION")).getMessage()%>;

もちろん、コントローラがある場合は、おそらくコントローラからメッセージを取得し、文字列のみを jsp に渡す必要があります。これはほんの一例です;)

于 2012-11-27T11:40:55.470 に答える