0

認証にSpring Security 3.1を使用していますが、ログインは正常に機能します。ユーザーがサインアップするとき、ユーザーがログインせずに制限されたページに進むことを望みます。

stackoverflow にはいくつかの同様の質問があり、回答がわずかに異なります。これらを試してみましたが、何もうまくいかないようです。これが私のセキュリティ構成です:

<http pattern="/resources/**" security="none" />       
<http pattern="/login" security="none" /> 
<http pattern="/user/forgotPassword" security="none" />
<http pattern="/user/createAccount" security="none" />
<http>
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login login-page="/login" default-target-url="/defaultUrl"
        always-use-default-target="true"
        authentication-failure-url="/loginfailed" />
</http>

そして、これが私のコードです(ユーザーが作成され、データベースに追加された後):

UsernamePasswordAuthenticationToken upaToken = new UsernamePasswordAuthenticationToken(user.getName(), user.getPassword());
request.getSession();
upaToken.setDetails(new WebAuthenticationDetails(request));
Authentication auth = authenticationManager.authenticate(upaToken);
SecurityContextHolder.getContext().setAuthentication(upaToken);

return "redirect:<restricted-page>";

制限されたページにリダイレクトされる代わりに、ログイン ページが表示されます。私は何が欠けていますか?

また、ユーザーを認証するための呼び出しを避けたいと思います。ユーザーがサインアップしたばかりなので、不要のようです。しかし、それを削除しても何も変わらないようです。

4

2 に答える 2

1

この問題の根本的な原因は、次のルールにより、/user/createAccount URL がスプリング セキュリティ フィルターでカバーされていないことです。

<http pattern="/user/createAccount" security="none" />

Spring Security フィルターの 1 つは、リクエスト間で SecurityContext を自動的に保持できます。低レベルのセッション操作を行う代わりに、/user/createAccount のフィルター チェーンを有効にして、すべてのユーザーがこの URL にアクセスできるようにすることをお勧めします。次の構文を使用して実行できます。

<http>
    <intercept-url pattern="/user/createAccount" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    ...
</http>

一般に、URL ごとにスプリング セキュリティ フィルター チェーンを機能させたままにし、それらの機能を手動で書き換えない方がよいでしょう。

于 2013-06-12T09:21:48.837 に答える