2016-06-06 3 views
1

Ich habe ein bestehendes Projekt, das mit Feder Sicherheit (Authentifizierung von db) gesichert ist. Ich möchte eine Option hinzufügen, die es dem Benutzer ermöglicht, sich über Facebook anzumelden. Ich habe es gegoogelt und selbstständig versucht, bin aber steckengeblieben. Im Allgemeinen ist die Idee, dass, sobald der Benutzer die Identität über Facebook bestätigt hat, der Rest von meinem "UserDetailsService" bearbeitet wird, der zusätzliche Daten von db (id, etc ...) lädt. Wenn Sie mich auf etwas hinweisen könnten, würde ich es sehr schätzen. HierHinzufügen von Facebook Login zu bestehenden Spring Security Projekt

ist ein Code:

Security Config:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    UserDetailsService userDetailsService; 

    @Autowired 
    CustomSuccessHandler customSuccessHandler; 

    @Autowired 
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("superuser").password("override").roles("ADMIN"); 
     auth.userDetailsService(userDetailsService); 

    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     // added to handle local characters 
     CharacterEncodingFilter filter = new CharacterEncodingFilter(); 
     filter.setEncoding("UTF-8"); 
     filter.setForceEncoding(true); 

     http.authorizeRequests().antMatchers("/", "/index").permitAll().antMatchers("/Admin/**") 
       .access("hasRole('ADMIN')") 
       .antMatchers("/Customer/**") 
       .access("hasRole('ADMIN') or hasRole('USER')") 
       .antMatchers("/User/**") 
       .access("hasRole('ADMIN') or hasRole('USER')") 
       .and().formLogin() 
       .loginPage("/login").usernameParameter("email").passwordParameter("password").loginPage("/login") 
       .successHandler(customSuccessHandler).and().csrf().and().formLogin().and().exceptionHandling() 
       .accessDeniedPage("/403"); 

    } 
} 

Meine Implementierung von UserDetailsService:

@Component 
public class MyUserDetailsService implements UserDetailsService { 

    @Autowired 
    EmployeeService service; 

    @Override 
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 

     Employee employee = service.loadByMail(email); 
     if (employee == null) { 
      throw new UsernameNotFoundException("Username not found"); 
     } 

     List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     authorities.add(new SimpleGrantedAuthority("ROLE_" + employee.getRole())); 
     MyUser myUser = new MyUser(employee.getFullName(), employee.getPassword(), employee.getEmail(), 
       employee.getId(), employee.getStatus().equals("AKTYWNY"), true, true, true, authorities); 

     return myUser; 
    } 


} 

Schließlich wird die Extended User Klasse:

public class MyUser extends User { 
    private static final long serialVersionUID = 1L; 
    private Long id; 
    private String mail; 
    public MyUser(String username, String password, String mail, Long id, boolean enabled, boolean accountNonExpired, 
      boolean credentialsNonExpired, boolean accountNonLocked, 
      Collection<? extends GrantedAuthority> authorities) { 
     super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); 
     this.id = id; 
     this.mail = mail; 
    } 
    @Override 
    public String toString() { 
     return "MyUser [id=" + id + ", mail=" + mail + "]"; 
    } 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 
    public String getMail() { 
     return mail; 
    } 
    public void setMail(String mail) { 
     this.mail = mail; 
    } 
} 

Antwort