Зарегистрируйтесь в веб-приложении Spring Boot с социальными сетями, использующими OAuth2 - PullRequest
0 голосов
/ 22 мая 2019

Я бы хотел зарегистрироваться на Facebook.Я понял, что лучший способ сделать это через OAuth2.Я пытаюсь интегрировать его, следуя этому руководству https://www.baeldung.com/spring-security-5-oauth2-login, и все, кажется, работает нормально!

Класс SecurityConfiguration:

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        super.configure(auth);
        auth
                .userDetailsService(userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .formLogin()
                    .loginPage("/login")
                    .failureUrl("/login?error=true")
                    .and()
                .oauth2Login()
                    .loginPage("/login")
                    .failureUrl("/login?error=true")
                    .and()
                .logout()
                    .logoutSuccessUrl("/")
                    .deleteCookies("JSESSIONID")
                    .invalidateHttpSession(true);
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}

Метод контроллера входа:

@GetMapping("/login")
public String getLoginPage(Model model, Principal principal) {
    if(principal != null && principal.getName() != null)
        return "redirect:/users/" + principal.getName();
    Iterable<ClientRegistration> clientRegistrations = null;
    ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository)
            .as(Iterable.class);
    if (type != ResolvableType.NONE &&
            ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) {
        clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository;
    }

    clientRegistrations.forEach(registration ->
            oauth2AuthenticationUrls.put(registration.getClientName(),
                    authorizationRequestBaseUri + "/" + registration.getRegistrationId()));
    model.addAttribute("urls", oauth2AuthenticationUrls);
    return "login";
}

Как я уже сказал, он работает нормально, когда я нажимаю на кнопку входа с помощью кнопки Facebook, он перенаправляетменя на Facebook и после успешного входа перенаправляет меня обратно в мое веб-приложение.Единственная проблема заключается в том, что я не знаю, как сделать так, чтобы регистрация выполнялась таким образом ...

Я не знаю, нужно ли мне просто создать страницу регистрации, которая перенаправит вас на Facebook икогда логин на Facebook успешно проходит, запрос на перенаправление перехватывается контроллером, который создает нового пользователя, или если есть другой (лучший) способ сделать это.

...