0

Ich benutze Facebook-Login in meiner Anwendung zu authentifizieren. Ich benutze den Authentifizierungsfilter.spring-social Facebook-Login setzt nicht Authentifizierungsobjekt

Die Authentifizierung ist OK, aber wenn sie zurück zur Startseite umgeleitet wird, scheint der Filter das Authentifizierungsobjekt nicht zu setzen, so dass der Aufruf von SecurityContextHolder.getContext(). GetAuthentication() null zurückgibt. Dies geschieht nur zum ersten Mal, wenn der Nutzer unsere App autorisiert. Es passiert danach nicht.

Um das Authentifizierungsobjekt zu setzen, muss sich der Benutzer derzeit zweimal bei Facebook anmelden. Das zweite Mal, wenn es keine Logins macht, sieht der Filter so aus, als ob er den Cookie aufnimmt und die Authentifizierung durchführt und nicht einmal mehr zu Facebook gehen muss.

Also meine Frage ist, warum muss ich zweimal durch den Filter gehen? Oder wie kann ich das vermeiden?

Konfiguration sieht wie folgt aus:

<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> 

Antwort

0

Es sieht aus wie Feder Griff nicht, dass auf seine eigene, die irgendwie Sinn macht, wenn ich das Gefühl, dass es für die Konfiguration möglich sein sollte, anstatt schreiben zu müssen Code dafür. Wie auch immer, hier ist, wie wir es gemacht haben:

@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"; 
} 
Verwandte Themen