diff --git a/.travis.yml b/.travis.yml index cd0979ffa..80c3f543c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,8 @@ language: java sudo: true dist: trusty -# use Java 9 -jdk: oraclejdk9 +# use Java 11 +jdk: oraclejdk11 before_install: - chmod +x mvnw diff --git a/src/main/java/org/springframework/samples/petclinic/common/CommonAttribute.java b/src/main/java/org/springframework/samples/petclinic/common/CommonAttribute.java index 44097280c..9571befb1 100644 --- a/src/main/java/org/springframework/samples/petclinic/common/CommonAttribute.java +++ b/src/main/java/org/springframework/samples/petclinic/common/CommonAttribute.java @@ -13,6 +13,22 @@ public final class CommonAttribute { public static final String EMAIL = "email"; + public static final String GITHUB = "github"; + + public static final String GITHUB_FIRSTNAME = "login"; + + public static final String GITHUB_LASTNAME = "name"; + + public static final String GITHUB_PROVIDER_ID = "id"; + + public static final String GOOGLE = "google"; + + public static final String GOOGLE_FIRSTNAME = "given_name"; + + public static final String GOOGLE_LASTNAME = "family_name"; + + public static final String GOOGLE_PROVIDER_ID = "sub"; + public static final String NAME = "name"; public static final String NEW = "new"; diff --git a/src/main/java/org/springframework/samples/petclinic/configuration/CacheConfiguration.java b/src/main/java/org/springframework/samples/petclinic/configuration/CacheConfiguration.java index 898613b0b..6994145f3 100644 --- a/src/main/java/org/springframework/samples/petclinic/configuration/CacheConfiguration.java +++ b/src/main/java/org/springframework/samples/petclinic/configuration/CacheConfiguration.java @@ -35,7 +35,7 @@ class CacheConfiguration { @Bean public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() { - return (cm) -> { + return cm -> { if (cm.getCache("vets") == null) { cm.createCache("vets", cacheConfiguration()); } diff --git a/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java b/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java index 99d3f17e4..1dc49f560 100644 --- a/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/configuration/WebSecurityConfig.java @@ -1,6 +1,5 @@ package org.springframework.samples.petclinic.configuration; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @@ -13,7 +12,6 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; @@ -33,9 +31,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private static final String CLIENT_PROPERTY_KEY = "spring.security.oauth2.client.registration."; - // @Autowired - // private UserDetailsService userDetailsService; - @Resource private Environment env; diff --git a/src/main/java/org/springframework/samples/petclinic/controller/common/CrashController.java b/src/main/java/org/springframework/samples/petclinic/controller/common/CrashController.java index 3648b2721..03b0d62c5 100644 --- a/src/main/java/org/springframework/samples/petclinic/controller/common/CrashController.java +++ b/src/main/java/org/springframework/samples/petclinic/controller/common/CrashController.java @@ -15,6 +15,7 @@ */ package org.springframework.samples.petclinic.controller.common; +import org.springframework.samples.petclinic.exception.FunctionalException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -29,8 +30,8 @@ import org.springframework.web.bind.annotation.GetMapping; class CrashController { @GetMapping("/oups") - public String triggerException() { - throw new RuntimeException( + public String triggerException() throws FunctionalException { + throw new FunctionalException( "Expected: controller used to showcase what " + "happens when an exception is thrown"); } diff --git a/src/main/java/org/springframework/samples/petclinic/controller/common/UserController.java b/src/main/java/org/springframework/samples/petclinic/controller/common/UserController.java index 4f33b5ae9..0cf557569 100644 --- a/src/main/java/org/springframework/samples/petclinic/controller/common/UserController.java +++ b/src/main/java/org/springframework/samples/petclinic/controller/common/UserController.java @@ -156,18 +156,33 @@ public class UserController extends WebSocketSender { @GetMapping(CommonEndPoint.OAUTH2_SUCCESS) public String postLoginOAUTH2(Model model, OAuth2AuthenticationToken authentication) { - String firstName = authentication.getPrincipal().getAttribute("given_name"); - String lastName = authentication.getPrincipal().getAttribute("family_name"); + String firstName; + String lastName; + String email; + String providerId; + String provider = authentication.getAuthorizedClientRegistrationId(); + + if (provider.equals(CommonAttribute.GOOGLE)) { + firstName = authentication.getPrincipal().getAttribute(CommonAttribute.GOOGLE_FIRSTNAME); + lastName = authentication.getPrincipal().getAttribute(CommonAttribute.GOOGLE_LASTNAME); + providerId = authentication.getPrincipal().getAttribute(CommonAttribute.GOOGLE_PROVIDER_ID); + } + else { + firstName = authentication.getPrincipal().getAttribute(CommonAttribute.GITHUB_FIRSTNAME); + lastName = authentication.getPrincipal().getAttribute(CommonAttribute.GITHUB_LASTNAME); + providerId = String.valueOf(authentication.getPrincipal().getAttribute(CommonAttribute.GITHUB_PROVIDER_ID)); + } + + email = authentication.getPrincipal().getAttribute("email"); CredentialDTO credential = credentialService.findByAuthentication(authentication); + UserDTO user = userService.findByEmail(email); + if (credential.isNew()) { // first time authentification with this provider - credential = credentialService.saveNew(authentication); - String email = credential.getEmail(); - - UserDTO user = userService.findByEmail(email); + credential = credentialService.saveNew(provider, email, providerId); if (user == null) { user = new UserDTO(); @@ -200,14 +215,14 @@ public class UserController extends WebSocketSender { credential.setToken(""); credential.setVerified(true); credentialService.save(credential); - securityService.autoLogin(credential.getEmail(), credential.getPassword()); + securityService.autoLogin(user.getEmail(), user.getPassword()); String message = String.format(CommonWebSocket.USER_LOGGED_IN, firstName, lastName); sendSuccessMessage(message); } } else if (Boolean.TRUE.equals(credential.isVerified())) { - securityService.autoLogin(credential.getEmail(), credential.getPassword()); + securityService.autoLogin(user.getEmail(), user.getPassword()); String message = String.format(CommonWebSocket.USER_LOGGED_IN, firstName, lastName); sendSuccessMessage(message); } @@ -215,7 +230,7 @@ public class UserController extends WebSocketSender { return CommonView.HOME; } - @RequestMapping(value = CommonEndPoint.CONFIRM_ACCOUNT, method = { RequestMethod.GET, RequestMethod.POST }) + @GetMapping(CommonEndPoint.CONFIRM_ACCOUNT) public String confirmUserAccount(@RequestParam(CommonAttribute.TOKEN) String token, Model model) { CredentialDTO credential = credentialService.findByToken(token); diff --git a/src/main/java/org/springframework/samples/petclinic/exception/FunctionalException.java b/src/main/java/org/springframework/samples/petclinic/exception/FunctionalException.java new file mode 100644 index 000000000..8ce9d1712 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/exception/FunctionalException.java @@ -0,0 +1,40 @@ +package org.springframework.samples.petclinic.exception; + +/** + * Classe des Exceptions Fonctionnelles + */ +public class FunctionalException extends Exception { + + /** serialVersionUID */ + private static final long serialVersionUID = 1L; + + + // ==================== Constructeurs ==================== + /** + * Constructeur. + * + * @param pMessage - + */ + public FunctionalException(String pMessage) { + super(pMessage); + } + + /** + * Constructeur. + * + * @param pCause - + */ + public FunctionalException(Throwable pCause) { + super(pCause); + } + + /** + * Constructeur. + * + * @param pMessage - + * @param pCause - + */ + public FunctionalException(String pMessage, Throwable pCause) { + super(pMessage, pCause); + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/service/common/CredentialService.java b/src/main/java/org/springframework/samples/petclinic/service/common/CredentialService.java index 49825fa32..c52e95901 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/common/CredentialService.java +++ b/src/main/java/org/springframework/samples/petclinic/service/common/CredentialService.java @@ -104,15 +104,14 @@ public class CredentialService { return entityToDTO(credential); } - public CredentialDTO saveNew(OAuth2AuthenticationToken authentication) { + public CredentialDTO saveNew(String provider, String email, String providerId) { Credential credential = new Credential(); - AuthProvider authProvider = authProviderRepository - .findByName(authentication.getAuthorizedClientRegistrationId()); + AuthProvider authProvider = authProviderRepository.findByName(provider); - credential.setEmail(authentication.getPrincipal().getAttribute("email")); + credential.setEmail(email); credential.setProviderId(authProvider.getId()); - credential.setPassword(authentication.getPrincipal().getAttribute("sub")); + credential.setPassword(providerId); credential.setVerified(false); credential.setToken(); credential.setExpiration(); diff --git a/src/main/java/org/springframework/samples/petclinic/service/common/SecurityServiceImpl.java b/src/main/java/org/springframework/samples/petclinic/service/common/SecurityServiceImpl.java index 84d8e834e..0eedba8aa 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/common/SecurityServiceImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/service/common/SecurityServiceImpl.java @@ -1,8 +1,10 @@ package org.springframework.samples.petclinic.service.common; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; @@ -12,7 +14,7 @@ import org.springframework.stereotype.Service; * * @author Paul-Emmanuel DOS SANTOS FACAO */ - +@Slf4j @Service("SecurityService") public class SecurityServiceImpl implements SecurityService { @@ -44,8 +46,6 @@ public class SecurityServiceImpl implements SecurityService { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken( userDetails, motDePasse, userDetails.getAuthorities()); - authenticationManager.authenticate(usernamePasswordAuthenticationToken); - if (usernamePasswordAuthenticationToken.isAuthenticated()) { SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); }