0

私は自分のアプリケーションでFacebookログインを使用して認証しています。私は認証フィルターを使用します。spring-social Facebookのログインが設定されていません認証オブジェクト

認証は成功しますが、ホームページにリダイレクトされると、フィルタは認証オブジェクトを設定していないように見えるため、SecurityContextHolder.getContext()。getAuthentication()を呼び出すとnullが返されます。これは、ユーザーが初めてアプリを承認したときにのみ発生します。それ以降は起こりません。

現在、認証オブジェクトセットを取得するには、ユーザーは「facebookでログイン」する必要があります。 2回目のログインで実際にログインしない場合は、クッキーを取得して認証を行い、Facebookにもう行く必要がないように見えます。

私の質問はなぜフィルタを2回通過する必要があるのですか?または、どうすればそれを避けることができますか?

の構成は次のようになります。

<bean id="authenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
     <constructor-arg value="/login"/> 
     <property name="useForward" value="true"/> 
    </bean> 

    <bean class="com.gigi.web.SpringDataUserDetailsService" id="userService"/> 

    <security:authentication-manager alias="authenticationManager"> 
     <security:authentication-provider user-service-ref="userService"/> 
     <security:authentication-provider ref="socialAuthenticationProvider" /> 
    </security:authentication-manager> 

    <bean class="org.springframework.social.security.SocialAuthenticationFilter" id="socialAuthenticationFilter"> 
     <constructor-arg ref="authenticationManager" /> 
     <constructor-arg ref="userIdSource" /> 
     <constructor-arg ref="usersConnectionRepository" /> 
     <constructor-arg ref="connectionRegistry" /> 

     <property name="postLoginUrl" value="/home" /> 
     <property name="defaultFailureUrl" value="/login?error&amp;social" /> 
     <property name="signupUrl" value="/user/signup" /> 
    </bean> 

    <bean class="org.springframework.social.connect.web.ProviderSignInUtils"> 
     <constructor-arg ref="connectionRegistry"/> 
     <constructor-arg ref="usersConnectionRepository"/> 
    </bean> 

    <bean id="userIdSource" class="org.springframework.social.security.AuthenticationNameUserIdSource" /> 

    <bean id="socialAuthenticationProvider" 
     class="org.springframework.social.security.SocialAuthenticationProvider"> 
     <constructor-arg ref="usersConnectionRepository" /> 
     <constructor-arg ref="userService" /> 
    </bean> 

    <bean id="userSocialConnectionService" class="com.gigi.web.UserSocialConnectionController"></bean> 

    <bean id="usersConnectionRepository" class="com.gigi.social.SpringDataUsersConnectionRepository"> 
     <constructor-arg ref="connectionRegistry" /> 
    </bean> 

    <bean id="connectionRegistry" 
      class="org.springframework.social.security.SocialAuthenticationServiceRegistry"> 
     <property name="authenticationServices"> 
      <list> 
       <bean class="org.springframework.social.facebook.security.FacebookAuthenticationService"> 
        <constructor-arg value="${facebook.app.id}" /> 
        <constructor-arg value="${facebook.app.secret}" /> 
        <constructor-arg value="${facebook.app.namespace}" /> 
       </bean> 
      </list> 
     </property> 
    </bean> 

答えて

0

それは春が、それはむしろ書くことよりも、設定可能でなければなりませんように私は感じるもののちょっと理にかなって、それ自身にそれを処理しないように見えますそのためのコード。とにかく、これまでのやり方は次のとおりです:

@RequestMapping("/signup") 
public String signUp(WebRequest request) { 
    Connection<?> connection = providerSignInUtils.getConnectionFromSession(request); 
    User user = usersConnectionRepository.createUser(connection); 
    getRepository().save(user); 
    providerSignInUtils.doPostSignUp(user.getId().toString(), request); 
    // the following will automatically log in the user after sign up 
    SecurityContextHolder.getContext().setAuthentication(new SocialAuthenticationToken(connection, user, null, user.getAuthorities())); 
    return "redirect:/home"; 
} 
関連する問題