Dies ist ein Memo, wenn die SNS-Anmeldefunktion in der von Spring Boot erstellten Webanwendung implementiert ist.
Java 8 (sorry) Spring Boot 2.1.0.RELEASE
https://projects.spring.io/spring-social/ https://spring.io/blog/2018/07/03/spring-social-end-of-life-announcement
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-oauth2-client
①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;
}
}
・ 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.