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