2

サーバー認証を適切に処理しているかどうかを理解しようとしています

Facebookを使用して自動ログインするサーバーを作成しています。さらに、休止状態を使用しています

デフォルトと同じプロセスを作成することでそれを行いますJdbcUsersConnectionRepository が、常にユーザーを返します。見つからない場合。

@Override
public List<String> findUserIdsWithConnection(Connection<?> connection) {
    List<String> ret = new LinkedList<String>();
    ConnectionKey key = connection.getKey();
    MyUser myUser = userService.getUserBySocialConnection(key.getProviderId(), key.getProviderUserId());
    if (myUser == null)
    {
        MyUser user = userService.createUserFromConnection(connection);
        String myUserId = String.valueOf(user.getId());
        ret.add(myUserId);
    }else
    {
        ret.add(String.valueOf(myUser.getId()));
    }
    return ret;
}

だから私signInはこのコードを持っています。ユーザーをサインインするには:

   public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
    MyUser user = userService.getUserById(Long.parseLong(userId));
    Authentication authentication = SecurityToolbox.signInUser(user);
    // set remember-me cookie
    MyUser myu = (MyUser)authentication.getPrincipal();
    userCookieGenerator.addCookie(String.valueOf(myu.getId()), request.getNativeResponse(HttpServletResponse.class));
    return null;
}

および からのサインイン コードSecurityToolBox:

  public static Authentication signInUser(MyUser user) {
    List<GrantedAuthority> authorities = getAuthorities(user);
    Authentication authentication = new UsernamePasswordAuthenticationToken(user, "", authorities);
    SecurityContextHolder.getContext().setAuthentication(authentication);
    return authentication;
  }

現在、これはすべて、userInterceptor利用可能な場合は Cookie の読み取りを処理し、存在する場合はユーザーを記憶する、私が書いた によって処理されます。Cookie を使用してユーザーに送信できる最も保護された情報は何ですか?

Spring Security にセッション/remmeberme/認証プロセスを処理させたいのですが、何をすべきかよくわかりません。

最初の質問 は、次の要求で、サーバーでユーザーを適切に認証するのに十分なコードですか? です。ユーザーがログインしていると安全に想定できるかどうかを尋ねたらuserInterceptorSecurityContextHolder.getContext().getAuthentication() != null

今度は、インターセプターを使用して自分で認証を処理するのではなく、春のセキュリティで認証を処理したいと考えています。そこで、認証マネージャーを作成することを考えました。しかし、何を認証する必要があるのか​​ わかりません

        public class CustomAuthenticationManager implements AuthenticationManager {
public Authentication authenticate(Authentication auth)
        throws AuthenticationException {}}

ユーザー名とパスワードがありません。Facebookで認証してログインしただけなので、何を認証すればよいですか。一般的に、ここにはいくつかの知識のギャップがあり、すべてをまとめるために何をすべきかを本当に理解していません

2番目の質問authenticate私の状況では、関数で 正確に何が起こる必要がありますか

3番目の質問 私は春のセキュリティが私を覚えているセッションとクッキーを処理したいと思います. u/pトークンと同じremember meトークンがあることは理解していますが、自分の状況でそれをどのように使用するべきかまだわかりません。

4番目の質問 現在、サインイン プロセス全体は、サーバーに送信されるすべての要求 (リソースではない) に対して行われます。それが起こるはずの方法ですか?

ありがとう。

4

1 に答える 1

2

そこにはたくさんの質問があります。まず、最初のボックスで記述したコードは、実際には、注入可能な ConnectionSignUp を介して JdbcUsersConnectionRepository で既にサポートされています。ConnectionSignUp は、JdbcUsersConnectionRepository でユーザーが見つからない場合にユーザーを作成するために実装できる戦略インターフェースです。spring-social-quickstart アプリケーションをチェックして、実際の例を確認してください。

あまり深く読まなくてもサインイン コードは問題ないように見えますが、Spring Security が既にインターセプター内で行っているすべてのことを本質的に再作成するのは大変な作業であることに同意します。そのため、Spring Social の最新のスナップショット ビルドには、Spring Security とのより緊密な統合が含まれています。

新しいものには、他の認証フィルターと同様に Spring Security 認証フィルターである SocialAuthenticationFilter があり、Spring Security のフィルターチェーンに直接プラグインします。この認証フィルターは、ユーザーのプロバイダー情報を、ローカル アプリで以前に確立された接続と比較することで機能し、一致が見つかった場合はサインインします。それ以外の場合は、サインアップ ページにリダイレクトされます。

機能の観点からは、Spring Social の ProviderSignInController と同じ役割を果たします。ただし、Spring Security と非常に緊密に統合されているため、期待するすべてのセキュリティ機能 (remember-me、権限など) が期待どおりに機能するという点で異なります。部。

繰り返しますが、これは最新の 1.1.0.BUILD-SNAPSHOT ビルドでのみ発生しますが、来週初めに 1.1.0.M2 リリースをプッシュする予定です (驚くべきことはありません)。この動作の例をいくつか見たい場合は、spring-social-showcase-sec または spring-social-showcase-sec-xml の例をご覧ください。

于 2013-02-09T02:31:27.517 に答える