2016-10-17 7 views
0

СЦЕНАРИЙ 1 При входе в систему с Facebook на мой веб-приложениеSpring facebook Войти: Регистрация перенаправлять

Если браузер уже вошли в Facebook, и

если детали социальной аутентификации на пользователя уже зарегистрированы в моем WebApp,

тогда, когда пользователь нажимает «Войти на Facebook» на моем веб-приложение,

он/она уполномочен Facebook и авторизационной возвращаемый объект б y

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

является именованным пользователем.

Все это хорошо.


СЦЕНАРИЙ 2 Если браузер не вошел в Facebook, но

детали социальной аутентификации данные пользователя уже зарегистрированы в моем веб-приложение,

тогда, когда пользователь нажимает «Войти через Facebook "на моем webapp,

пользователь подписывается с помощью Facebook, введя имя пользователя и пароль. НО

объект авторизации, возвращаемый

Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

уполномочен в анонимной и имеет имя AnonymousUser.

Кроме того, вызов от Facebook после авторизации является/регистрация

Однако я ожидал тот же зарегистрированный пользователь, как и в сценарии 1

Моя конфигурация безопасности ниже. Может ли кто-нибудь дать мне подсказку о том, что может быть проблемой?

<beans xmlns="http://www.springframework.org/schema/beans" 
 
     xmlns:security="http://www.springframework.org/schema/security" 
 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
 
        http://www.springframework.org/schema/security 
 
        http://www.springframework.org/schema/security/spring-security.xsd"> 
 

 
\t <security:http use-expressions="true" entry-point-ref="appAuthenticationEntryPoint"> 
 

 
\t \t <security:intercept-url pattern="/login" access="permitAll()" /> 
 
\t \t <security:intercept-url pattern="/flow-entry.html" access="permitAll()"/> 
 
\t \t <security:intercept-url pattern="/flow-jobpostdata.html" access="permitAll()"/> 
 
\t \t <security:intercept-url pattern="/flow-jobpostdata_anydegree.html" access="permitAll()"/> 
 
\t \t <security:intercept-url pattern="/j_spring_security_check" access="permitAll()"/> \t 
 
    <!-- Adds social authentication filter to the Spring Security filter chain. --> 
 
     <security:custom-filter before="PRE_AUTH_FILTER" ref="socialAuthenticationFilter"/> 
 
     <security:custom-filter position="FORM_LOGIN_FILTER" ref="SecurityAuthFilter"/> 
 
\t </security:http> 
 

 
<!-- authentication manager and its provider(social provider deals with social login & local user provider deals with form login) --> 
 
    <security:authentication-manager alias="authenticationManager"> 
 
    
 
     <security:authentication-provider ref="socialAuthenticationProvider"/> 
 
     <security:authentication-provider user-service-ref="localUserDetailService"/> 
 
    </security:authentication-manager> 
 
    
 

 
    
 

 
\t <bean id="customAuthenticationProvider" class="com.ikoda.service.loginservices.CustomAuthenticationProvider"> 
 
\t \t \t <property name="auService" ref="auService" /> 
 
\t </bean> 
 

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

 
    <!-- form login beans --> 
 
    
 
    
 

 
     
 
     
 
    <bean id="successHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"> 
 
    </bean> 
 
     
 
    <bean id="appAuthenticationEntryPoint" 
 
      class="com.ikoda.service.loginservices.AppAuthenticationEntryPoint"> 
 
     <constructor-arg name="loginFormUrl" value="/login"/> 
 
    </bean> 
 
    
 
    <bean id="rememberMeServices" 
 
      class="org.springframework.security.web.authentication.NullRememberMeServices"/> 
 

 
    <bean id="failureHandler" 
 
      class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> 
 
     <constructor-arg name="defaultFailureUrl" value="/login?error=true"/> 
 
    </bean> 
 
    
 
    
 

 

 
    
 
    <bean class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" 
 
      id="SecurityAuthFilter"> 
 
     <property name="authenticationManager" ref="authenticationManager"/> 
 
     <property name="authenticationSuccessHandler" ref="successHandler"/> 
 
     <property name="authenticationFailureHandler" ref="failureHandler"/> 
 
     <property name="filterProcessesUrl" value="/j_spring_security_check"/> 
 
     <property name="rememberMeServices" ref="rememberMeServices"/> 
 
    </bean> 
 

 
    <!-- social login filter which is a pre authentication filter and works for /auth service url --> 
 
    <bean id="socialAuthenticationFilter" class="org.springframework.social.security.SocialAuthenticationFilter"> 
 
     <constructor-arg name="authManager" ref="authenticationManager"/> 
 
     <constructor-arg name="userIdSource" ref="userIdSource"/> 
 
     <constructor-arg name="usersConnectionRepository" ref="inMemoryUsersConnectionRepository"/> 
 
     <constructor-arg name="authServiceLocator" ref="appSocialAuthenticationServiceRegistry"/> 
 
     <property name="authenticationSuccessHandler" ref="successHandler"/> 
 
    </bean> 
 

 

 
    <!-- inmemory connection repository which holds connection repository per local user --> 
 
    <bean id="inMemoryUsersConnectionRepository" 
 
      class="org.springframework.social.connect.mem.InMemoryUsersConnectionRepository"> 
 
     <constructor-arg name="connectionFactoryLocator" ref="appSocialAuthenticationServiceRegistry"/> 
 
     <property name="connectionSignUp" ref="connectionSignUp"/> 
 
    </bean> 
 

 
    <!-- service registry will holds connection factory of each social provider--> 
 
    <bean id="appSocialAuthenticationServiceRegistry" 
 
      class="com.ikoda.service.loginservices.AppSocialAuthenticationServiceRegistry"> 
 
     <constructor-arg> 
 
      <list> 
 
       <ref bean="facebookAuthenticationService"/> 
 
       <ref bean="googleAuthenticationService"/> 
 
      </list> 
 
     </constructor-arg> 
 
    </bean> 
 

 
    <bean id="facebookAuthenticationService" 
 
      class="org.springframework.social.facebook.security.FacebookAuthenticationService"> 
 
     <constructor-arg name="apiKey" value="11111"/> 
 
     <constructor-arg name="appSecret" value="11111"/> 
 
    </bean> 
 

 
    <bean id="googleAuthenticationService" 
 
      class="org.springframework.social.google.security.GoogleAuthenticationService"> 
 
     <constructor-arg name="apiKey" value="111-lpmhcmuj1577bd6god0696g4u2g16c1i.apps.googleusercontent.com"/> 
 
     <constructor-arg name="appSecret" value="111-111-"/> 
 
    </bean> 
 
    
 

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

 
    <!-- If no local user is associated to a social connection then connection sign up will create a new local user and map it to social user --> 
 
    <bean id="connectionSignUp" class="com.ikoda.service.loginservices.AppConnectionSignUp"/> 
 

 
</beans>

ответ

0

Перенаправление к SIGNUP является намеченная поведение Spring Social. Ключ заключается в том, как управлять поведением.

Одним из способов решения проблемы является аутентификация социального входа в метод регистрации контроллера. Для этого требуется доступ к социальной связи. Вы можете сделать это, выполнив аутсорсинг ProviderSignInUtils в вашем контроллере.

Примечание. AppConnectionSignUP представляет собой некоторую реализацию org.springframework.social.connect.ConnectionSignUp

Connection<?> connection = providerSignInUtils.getConnectionFromSession(webRequest); 
     if (null != connection) 
     { 

      String userIdString = appConnectionSignUp.execute(connection); 
     } 

Другой способ решения проблемы заключается в реализации вашей собственной ConnectionSignUp

<bean id="connectionSignUp" class="com.ikoda.service.loginservices.AppConnectionSignUp"/>

и ссылки, что в вашем UsersConnectionRepository

 <bean id="jdbcUsersConnectionRepository" 
 
       class="org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository"> 
 
      <constructor-arg ref="dataSource" /> 
 
      <constructor-arg ref="appSocialAuthenticationServiceRegistry" /> 
 
      <constructor-arg ref="textEncryptor" /> 
 
      <property name="connectionSignUp" ref="connectionSignUp"/> 
 
     </bean>

Если вы примете такой подход, то социальный логин будет обходить контроллер/signUp и непосредственно вызывать метод execute для компонента connectionSignUP.

Между тем, в вопросе выше inMemoryUsersConnectionRepository не рекомендуется. Я переключился на jdbcUsersConnectionRepository.

 Смежные вопросы

  • Нет связанных вопросов^_^