2016-01-14 7 views
5

Ich benutze Feder 3 und Feder Sicherheit. Ich integriere soziale Accounts zum Beispiel: Facebook, Twitter und Google. Ich benutze dort Javascript sdk Version, aber mein Problem ist, dass ich einen Benutzer registrieren kann, aber ich bin nicht sicher, wie man sie authentifiziert.Implementierung von Social-Media-Login in Frühling Sicherheit

Zum Beispiel:

Wenn der Benutzer auf einen der Links (Facebook, Twitter, Google) geklickt neues Dialogfeld nach erfolgreicher Authentifizierung geöffnet wird, kann ich ihre grundlegenden Profildetails erhalten: E-Mail, id, name, Bilder und Ich habe all diese Informationen an meinen Controller mit Ajax übergeben, die den Service aufrufen und den Benutzer speichern, wenn der Benutzer noch nicht registriert ist.

Bis hier alles funktioniert gut für mich. Ich benutze Benutzer-ID und verschlüssle sie mit Salz und speichern Sie es in der Datenbank als ein Passwort (ich bin mir nicht sicher, ob dies eine korrekte Möglichkeit, damit umzugehen oder nicht), aber jetzt ist meine Verwirrung, wie kann ich einen Benutzer authentifizieren und erlauben um sich in das System einzuloggen.

Meine security.xml Datei

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
         http://www.springframework.org/schema/security 
         http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 

    <!-- Configuration for master level user login --> 
    <http auto-config="true" use-expressions="true" 
     disable-url-rewriting="true"> 
     <!-- <csrf /> --> 
     <headers> 
      <cache-control /> 
      <content-type-options /> 
      <hsts /> 
      <frame-options /> 
      <xss-protection /> 
     </headers> 
     <!-- requires-channel="https" --> 
     <intercept-url pattern="/favicon.ico" access="permitAll" /> 
     <intercept-url pattern="/login*" access="permitAll" /> 
     <intercept-url pattern="/login/facebook-login*" access="permitAll" /> 
     <intercept-url pattern="/validateUserCredentials*" 
      access="permitAll" /> 
     <intercept-url pattern="/register*" access="permitAll" /> 
     <intercept-url pattern="/activation*" access="permitAll" /> 
     <intercept-url pattern="/restore*" access="permitAll" /> 
     <intercept-url pattern="/resend*" access="permitAll" /> 
     <intercept-url pattern="/resources/**" access="permitAll" /> 
     <intercept-url pattern="/license*" 
      access="hasAnyRole('${role.admin}', '${role.master}')" /> 
     <intercept-url pattern="/**" 
      access="hasAnyRole('${role.admin}', '${role.master}', '${role.owner}', '${role.simple}')" /> 
     <access-denied-handler error-page="/denied" /> 
     <form-login login-page="/login" default-target-url="/logged" 
      authentication-failure-url="/loginfailed" login-processing-url="/j_spring_security_check" /> 
     <logout logout-success-url="/login" invalidate-session="true" 
      delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE" /> 
     <session-management session-fixation-protection="migrateSession"> 
      <concurrency-control error-if-maximum-exceeded="true" 
       max-sessions="1" expired-url="/login" /> 
     </session-management> 
     <remember-me token-validity-seconds="86400" /> 
    </http> 

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider ref="daoAuthenticationProvider" /> 
    </authentication-manager> 

    <beans:bean id="daoAuthenticationProvider" 
     class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
     <beans:property name="userDetailsService" ref="userDetailsService" /> 
     <beans:property name="saltSource" ref="saltSource" /> 
     <beans:property name="passwordEncoder" ref="passwordEncoder" /> 
    </beans:bean> 

    <beans:bean id="passwordEncoder" 
     class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" /> 

    <beans:bean id="saltSource" 
     class="org.springframework.security.authentication.dao.ReflectionSaltSource"> 
     <beans:property name="userPropertyToUse" value="salt" /> 
    </beans:bean> 

    <beans:bean id="userDetailsService" name="userAuthenticationProvider" 
     class="com.luffy.security.AuthenticationUserDetailService"> 
    </beans:bean> 
</beans:beans> 

Jede Hilfe geschätzt wird. Ich habe alles getan, was ich kann, um dieses Problem zu lösen, aber ich bin nicht in der Lage, eine zuverlässige Lösung zu finden.

Antwort

1

Nehmen wir an, Sie implementieren Facebook-Authentifizierung.

Solution (1):

Auf erfolgreiche Antwort von Facebook Sie Server-API aufrufen können Authentifizierungs Tabelle mit Facebook Benutzerdaten wie Benutzername/E-Mail und OAuth access_token zu aktualisieren.

$.post('api/fblogin', {access_token: accessToken}, function(response) {}); 

Lösung (2): Benutzerdefinierte Sicherheits Handler. Hier können Sie Ihre benutzerdefinierte HTTP-Anfrage an Facebook initiieren und nach erfolgreichem Abschluss dem Benutzer den Zugriff auf die Site ermöglichen.

import java.util.*; 
import javax.servlet.http.HttpServletRequest; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.authentication.*; 
import org.springframework.security.core.*; 
import org.springframework.stereotype.Component; 
import com.restfb.*;; 

@Component 
public class CustomAuthenticationProvider implements AuthenticationProvider { 
    private @Autowired HttpServletRequest request; 

    @Override 
    public Authentication authenticate(Authentication authentication) { 
     String fb_access_token = String.valueOf(request.getParameter("fb_access_token")); 

     //fb user 
     Authentication auth = null; 
     try { 
      FacebookClient fbClient = new DefaultFacebookClient(fb_access_token); 
      User user = fbClient.fetchObject("me",com.restfb.types.User.class); 
      String email = user.getEmail(); 
      String gender = user.getGender(); 
      String pic = "http://graph.facebook.com/" + user.getId() + "/picture?type=normal"; 
      //Your DB implementation 

     } catch (Exception e) { 
      throw new FacebookOAuthException("FB","OAuth",5002, null, null, "", ""); 
     }  
    } 
} 

feder security.xml

<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security"> 
     <authentication-provider ref="customAuthenticationProvider" > 
     </authentication-provider> 
</authentication-manager> 

<bean id="customAuthenticationProvider" class="com.mi.common.CustomAuthenticationProvider"/> 
+0

Vielen Dank für die Antwort, die ich für so etwas wie dies von langer Zeit auf der Suche war, aber ich habe immer noch ein Problem mit der Lösung, die ist, wenn ich den Benutzer von FB authentifiziere Wie kann ich den gleichen Benutzer im Frühling authentifizieren und autorisieren, damit der Frühling den Benutzer bestätigen kann? Entschuldigung, wenn du es doof fandest, dass ich seit einiger Zeit daran festhalte – Luffy

+0

Ive benutzerdefinierte Implementierung hinzugefügt? Ich hoffe es hilft. Ein wenig Konfiguration ist auf der Federseite erforderlich, um CustomAuthentication zu verarbeiten. –

Verwandte Themen