[JAVA] SNS-Login mit Spring Boot

Überblick

Dies ist ein Memo, wenn die SNS-Anmeldefunktion in der von Spring Boot erstellten Webanwendung implementiert ist.

Umgebung

Java 8 (sorry) Spring Boot 2.1.0.RELEASE

Spring Social ist EOL

https://projects.spring.io/spring-social/ https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement

Bibliothek verwendet

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-oauth2-client

SNS implementiert werden

Implementierung

①POM

pom.xml


<!-- OAuth2 authentication-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>

②configuration

SecurityConfig



//Es wird nur der Teil extrahiert, der sich auf die Anmeldung bezieht.
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @NonNull
    SaveAndGenerateUserDetails saveAndGenerateUserDetails

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                //SNS-Login
                .oauth2Login()
                    .loginPage("/login")
                    .userInfoEndpoint()
                    //Serviceklasse, die während der OAuth-Authentifizierung ausgeführt werden soll
                    .userService(new OAuth2UserService(saveAndGenerateUserDetails))
                    //Serviceklasse, die während der OpenId-Authentifizierung ausgeführt werden soll
                    .oidcUserService(new OidcUserDetailsService(saveAndGenerateUserDetails))
                .and()
                    //Implementieren Sie SuccessHandler bei Bedarf
                    .successHandler(new MyAuthenticationSuccessHandler())
                    //Implementieren Sie SuccessHandler bei Bedarf. Diese Zeit ist die Standardeinstellung.
                    .failureHandler(new SimpleUrlAuthenticationFailureHandler("/login?error"))
            .and()
                //ID PASS Login kann koexistieren
                .formLogin()
                    .loginPage("/login")
                        .usernameParameter("username")
                        .passwordParameter("password")
                        .permitAll()
                    .successHandler(new FormLoginSuccessHandler())
                    .failureHandler(new SimpleUrlAuthenticationFailureHandler("/login?error"))
            .and()
                .logout()
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                    .logoutSuccessUrl("/")
                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID")
                    .permitAll()
            .and()
                .exceptionHandling();


}

③application.yml

application.yml


spring:
  security:
    oauth2:
      client:
        registration:
          facebook:
            client-id: 【client-id】
            client-secret: 【client-secret】
            scope:
              - email
              - public_profile
            redirect-uri:[Anwendungs-URL]/login/oauth2/code/{registrationId}
          google:
            client-id: 【client-id】
            client-secret: 【client-secret】
            scope:
              - email
              - profile
              - openid
            redirect-uri:[Anwendungs-URL]/login/oauth2/code/{registrationId}
        provider:
          facebook:
            authorizationUri: https://www.facebook.com/v3.3/dialog/oauth
            tokenUri: https://graph.facebook.com/v3.3/oauth/access_token
            userInfoUri: https://graph.facebook.com/v3.3/me

④view

login.html


<!--Erstellen Sie einen Link, der den Endpunkt jeder SNS-Anmeldung festlegt.
Die Endpunkte sind feste Werte und lauten wie folgt.-->
<!--~ Verschiedene Auslassungen ~-->
<a href="/oauth2/authorization/facebook">Facebook Login</a>
<a href="/oauth2/authorization/google">Google Login</a>
<!--~ Verschiedene Auslassungen ~-->

⑤Service ⑤-1 OAuth-Klasse (festgelegt in .userService () von SecurityConfig)

OAuth2UserService.java


@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OAuth2UserService
        extends DefaultOAuth2UserService {

    @NonNull
    SaveAndGenerateUserDetails saveAndGenerateUserDetails

    @Override
    @Transactional(readOnly = false)
    public OAuth2User loadUser(OAuth2UserRequest userRequest)
            throws OAuth2AuthenticationException {
        
        //Die Einführung der Implementierungsklasse entfällt.
        //Gliederung:
        //Erstellen Sie eine Klasse für jeden SNS, um mit der Registrierungs-ID zu verzweigen, und rufen Sie die Informationen ab, die Sie erfassen möchten.
        //Speichern Sie Benutzerinformationen in der Datenbank basierend auf den erfassten Informationen
        //Authentifizierungsinformationen basierend auf den erfassten Informationen(UserDetails)Wird zurückgegeben.
        //Der Rückgabetyp dieser Klasse hängt von der Authentifizierungsmethode ab, der Rückgabetyp der Prozessmethode lautet jedoch MyUserDetails.
        //Hier werden wir also den Unterschied in der Authentifizierungsmethode aufgreifen.
        return saveAndGenerateUserDetails.process(userRequest,
                super.loadUser(userRequest));
    }
}

⑤-2 Verarbeitung nach OpenId-Authentifizierung (festgelegt in .oidcUserService () von SecurityConfig)

OidcUserDetailsService.java


@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OidcUserDetailsService
        extends OidcUserService {

    @NonNull
    SaveAndGenerateUserDetails saveAndGenerateUserDetails;

    @Override
    @Transactional(readOnly = false)
    public OidcUser loadUser(OidcUserRequest userRequest)
            throws OAuth2AuthenticationException {
        
        // ⑤-Gleich wie 1
        return saveAndGenerateUserDetails.process(userRequest,
                super.loadUser(userRequest));
    }
}

⑥ MyUserDetails-Klasse

MyUserDetails.java


@SuppressWarnings("serial")
@Data
public class MyUserDetails implements UserDetails, OAuth2User, OidcUser {

    // @Welche Methode sollte überschrieben werden?
    //Es wird nur der Teil extrahiert, der für die SNS-Anmeldung erforderlich ist.

    private Map<String, Object> attributes;

    //Konstrukteur
    public MyUserDetails(MyUser user, Map<String, Object> attr) {
        //Es werden nur OAuth- und OpenId-Informationen aufgelistet.
        this.attributes = attr;
    }
}

Impressionen

・ Es gab weniger Unterrichtsstunden, als ich erwartet hatte. ・ Es ist hilfreich, dass die Bibliothek etwas Gutes tut, aber es war eine Black Box. ・ Wenn Sie eine Art von Oauth und eine Art von OpenID implementieren, können Sie problemlos horizontal erweitern.

Referenz-URL

Recommended Posts

SNS-Login mit Spring Boot
Mit Spring Boot herunterladen
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Anmeldefunktion mit Spring Security
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Verwenden Sie die Standardauthentifizierung mit Spring Boot
gRPC auf Spring Boot mit grpc-spring-boot-Starter
Erstellen Sie eine App mit Spring Boot 2
Hot Deploy mit Spring Boot-Entwicklung
Datenbankverknüpfung mit doma2 (Spring Boot)
Spring Boot Programmierung mit VS Code
Bis "Hallo Welt" mit Spring Boot
Erstellen Sie eine Anfrage-App mit Spring Boot
Erhalten Sie Validierungsergebnisse mit Spring Boot
(Intellij) Hallo Welt mit Spring Boot
Erstellen Sie eine App mit Spring Boot
Google Cloud Platform mit Spring Boot 2.0.0
Ich habe GraphQL mit Spring Boot ausprobiert
[Java] LINE-Integration mit Spring Boot
Beginnend mit Spring Boot 0. Verwenden Sie Spring CLI
Ich habe Flyway mit Spring Boot ausprobiert
Die Nachrichtenkooperation begann mit Spring Boot
Ich habe versucht, einen OAuth-Client mit Spring Boot / Security (LINE-Anmeldung) zu implementieren.
Hallo Welt mit Eclipse + Spring Boot + Maven
Senden Sie regelmäßige Benachrichtigungen mit LineNotify + Spring Boot
Teil 1: Versuchen Sie, die von Spring Security 5 unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden
HTTPS mit Spring Boot und Let's Encrypt
Fordern Sie Spring Boot heraus
Versuchen Sie es mit Spring Boot mit VS-Code
Starten Sie die Entwicklung von Webanwendungen mit Spring Boot
Starten Sie die Nginx + Spring Boot-Anwendung mit Docker-Compose
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Spring Boot Form
Implementieren Sie CRUD mit Spring Boot + Thymeleaf + MySQL
Asynchrone Verarbeitung mit Spring Boot unter Verwendung von @Async
Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf
Spring Boot Denken Sie daran
gae + frühlingsstiefel
(IntelliJ + gradle) Hallo Welt mit Spring Boot
Verwenden Sie den Cache mit EhCashe 2.x mit Spring Boot
Formularklassenvalidierungstest mit Spring Boot
Führen Sie die WEB-Anwendung mit Spring Boot + Thymeleaf aus
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security