1

Spring Security をセットアップしたところ、うまく機能しています。カスタムフォームを使用してログインおよびログアウトできます。ログインしてから何度も連続して問題なくログアウトしました。奇妙なことに、間違ったパスワードでログインしようとすると、再度ログインできなくなります。その後、ログインしようとするたびに「loginFailed」ページに移動します。これを修正する方法を知っている人はいますか?

ここに私のsecurity-config.xmlがあります:

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-3.0.3.xsd">


<http use-expressions="true">
    <intercept-url pattern="/secureA.htm" access="isAuthenticated()" /> 
    <intercept-url pattern="/secureB.htm" access="isAuthenticated()" /> 
    <form-login login-page="/login.htm" default-target-url="/secureA.htm" 
        authentication-failure-url="/loginFailed.htm"/>
    <logout logout-success-url="/login" />
</http>

<authentication-manager>
  <authentication-provider>
    <password-encoder hash="sha">
    </password-encoder>
    <user-service>
      <user name="user" password="pass" 
            authorities="ROLE_USER, ROLE_ADMIN" />
    </user-service>
  </authentication-provider>
</authentication-manager>

</beans:beans>

私のログインフォーム:

<form action="<c:url value='j_spring_security_check' />" method="post">
Username:&nbsp;<input type="text" name="j_username" /><br/>
    Password:&nbsp;<input type="password" name="j_password" /><br/>
    <input type="submit" value="Login" /><br/>
</form>

私のログインコントローラー:

@Controller
public class LoginController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String welcome(ModelMap m) {
        return "login";
    }

    @RequestMapping(value = "/loginFailed", method = RequestMethod.GET)
    public String failed(ModelMap m) {
        m.addAttribute("error", "Invalid username or password");
        return "login";
    }

    @RequestMapping("logout.htm")
    public String logout(ModelMap m) {
        return "redirect:login.htm";
    }
}
4

3 に答える 3

0

これは、 https ://jira.springsource.org/browse/SEC-1493 によるものです。

認証時に org.springframework.security.core.userdetails.eraseCredentials() が呼び出されています。

解決策は、authentication-manager のパラメーター erase-credentials="false" である必要がありますが、Spring 3.1.0 または 3.1.3 では機能しないようです。

回避策は、認証要求ごとにユーザーの詳細を再ロードすることです。

于 2013-01-17T13:40:11.903 に答える
0

さて、何が問題だったのかわかりませんが、解決できました。SO の古い投稿を見つけました: Spring security blocks user after failed login。Spring 3.0.7.RELEASE(3.0.6から)に切り替えるというティムの答えは私にとってはうまくいきました。二重投稿すみません。

なぜこれが 3.0.6 で起こったのか誰かが知っているなら、知りたいです。

于 2012-04-10T23:56:23.087 に答える
0

ログインしたのと同じページに戻る場合は、モデルが引き継がれています。そのモデルに属性を追加しているので、おそらくその属性がビューページに設定されているかどうかを確認しています。一度設定すると、セッション オブジェクトがクリアされるまで設定が解除されません。

確認するには、これを変更します。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String welcome(ModelMap m) {
  System.out.println(m.getAttribute("error");
  return "login";
}

次に、コンソールを確認します。

于 2012-04-10T23:12:14.533 に答える