7

Spring Security 構成で定義されたカスタム認証プロバイダーがあります。このクラスは AuthenticationProvider を実装しており、ページで定義されたフォームを使用して正常にログインできます。問題は、ログイン ページだけでなく、登録ページからもこのクラスを呼び出したいことです。

登録ページは異なるコマンド クラスを使用し、ログイン フォームよりも多くの情報を収集します。現在、ユーザーが登録すると、適切なコントローラーを呼び出し、レコードをデータベースに追加すると、ユーザーはログインできますが、自動的にはログインしません。彼らは登録ページでユーザー名/パスワードを教えてくれたので、これをカスタム AuthenticationProvider クラスに渡して、彼らもログインできるようにすることはできますか?

登録コントローラーで org.springframework.security.Authentication クラスを作成し、顧客の AuthenticationProvider クラスで認証メソッドを呼び出してみましたが、エラーにはなりませんが、ユーザーはログインしていません。これを達成するために、Spring Security フィルター チェーンの上位にあるメソッドを呼び出しますか? コントローラーを j_spring_security_check URL にリダイレクトする必要がありますか? もしそうなら、どうすればユーザー名/パスワードを渡すことができますか?

4

2 に答える 2

3

あなたが抱えている問題は、ユーザーの認証に成功したにもかかわらず、この認証の結果をユーザーの に保存していないことですSecurityContext。Web アプリケーションでは、これは がThreadLocalユーザーSecurityContextPersistenceFilter資格情報HTTPSession

可能であれば、カスタム認証プロバイダーで直接認証することも避けてください。xml 構成にはAuthenticationManager、カスタム認証プロバイダーが接続されている が含まれている必要があります。例えば、

<bean id="customAuthenticationProvider" 
  class="com.foo.CustomAuthenticationProvider">
  <property name="accountService" ref="accountService"/>
</bean>
<security:authentication-manager alias="authenticationManager">
  <security:authentication-provider ref="customAuthenticationProvider"/>
</security:authentication-manager>

を登録サービスに接続authenticationManagerし、それを使用して認証すると、さらに、

当社の登録サービスは、次のようにこれを行います

final UsernamePasswordAuthenticationToken authRequest = new 
  UsernamePasswordAuthenticationToken(username, password);

final Authentication authentication = 
  authenticationManager.authenticate(authRequest);
SecurityContextHolder.getContext().setAuthentication(authentication);

また、必要に応じて、この時点での認証結果を のメソッドを使用して、 remember-me cookieに保存します。onLoginSuccess()TokenBasedRememberMeServices

于 2010-07-04T13:55:31.443 に答える
2

AuthenticationProvider.authenticate()の結果をSecurityContext(から取得した)に入れる必要がありますSecurityContextHolder

またAuthenticationSuccessEvent、アプリケーションがこのイベントに依存している場合 (一部の Spring Security 機能でも使用される場合があります)、それを公開する必要があります (AuthenticationEventPublisher自動配線を介してデフォルトを取得できます)。認証プロバイダーを でラップすると便利な場合がありますProviderManager。これにより、指定されたパブリッシャーを使用してイベントが自動的にパブリッシュされます。

于 2010-07-01T18:14:48.183 に答える