diff --git a/src/main/java/de/bonndan/nivio/appuser/AppUser.java b/src/main/java/de/bonndan/nivio/appuser/AppUser.java index c0ae093f9..2e44faff1 100644 --- a/src/main/java/de/bonndan/nivio/appuser/AppUser.java +++ b/src/main/java/de/bonndan/nivio/appuser/AppUser.java @@ -91,42 +91,6 @@ public class AppUser implements UserDetails { @Column private Boolean enabled; - @Override - public Collection getAuthorities() { - SimpleGrantedAuthority authority = new SimpleGrantedAuthority(appUserRole.name()); - return Collections.singletonList(authority); - } - - @Override - public String getPassword() { - return null; - } - - @Override - public String getUsername() { - return null; - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return !locked; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return true; - } - public Long getId() { return id; } @@ -202,4 +166,40 @@ public void setExternalId(String externalId) { } public void setIdp(String idp) { this.idp = idp; } + + @Override + public Collection getAuthorities() { + SimpleGrantedAuthority authority = new SimpleGrantedAuthority(appUserRole.name()); + return Collections.singletonList(authority); + } + + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return null; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return !locked; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } } diff --git a/src/main/java/de/bonndan/nivio/appuser/AppUserRole.java b/src/main/java/de/bonndan/nivio/appuser/AppUserRole.java index 0031152e1..b0c90fad9 100644 --- a/src/main/java/de/bonndan/nivio/appuser/AppUserRole.java +++ b/src/main/java/de/bonndan/nivio/appuser/AppUserRole.java @@ -4,7 +4,6 @@ public enum AppUserRole { USER, ADMIN; - // declare your defaults with constant values private static final AppUserRole defaultValue = USER; diff --git a/src/main/java/de/bonndan/nivio/appuser/AppUserService.java b/src/main/java/de/bonndan/nivio/appuser/AppUserService.java index 5dd85c2e3..f2ce45276 100644 --- a/src/main/java/de/bonndan/nivio/appuser/AppUserService.java +++ b/src/main/java/de/bonndan/nivio/appuser/AppUserService.java @@ -8,7 +8,7 @@ @Service public class AppUserService implements UserDetailsService { - private static final String USER_NOT_FOUND = "User with id %s not found."; + private static final String USER_NOT_FOUND = "User with external id %s not found."; private final AppUserRepository appUserRepository; public AppUserService(AppUserRepository appUserRepository) { this.appUserRepository = appUserRepository; diff --git a/src/main/java/de/bonndan/nivio/security/CustomOAuth2User.java b/src/main/java/de/bonndan/nivio/security/CustomOAuth2User.java index f42de5eca..7cb2732cd 100644 --- a/src/main/java/de/bonndan/nivio/security/CustomOAuth2User.java +++ b/src/main/java/de/bonndan/nivio/security/CustomOAuth2User.java @@ -35,9 +35,10 @@ public CustomOAuth2User(@NonNull final String externalId, this.alias = Objects.requireNonNull(alias, "alias must not be null"); this.attributes = Objects.requireNonNull(attributes, "attributes must not be null"); this.authorities = Objects.requireNonNull(authorities, "authorities must not be null"); + this.idp = Objects.requireNonNull(idp, "idp must not be null"); this.name = name; this.avatarUrl = avatarUrl; - this.idp = idp; + } @Override diff --git a/src/main/java/de/bonndan/nivio/security/CustomOAuth2UserService.java b/src/main/java/de/bonndan/nivio/security/CustomOAuth2UserService.java index f02936fe9..d430d6dd4 100644 --- a/src/main/java/de/bonndan/nivio/security/CustomOAuth2UserService.java +++ b/src/main/java/de/bonndan/nivio/security/CustomOAuth2UserService.java @@ -1,8 +1,6 @@ package de.bonndan.nivio.security; -import de.bonndan.nivio.appuser.AppUser; -import de.bonndan.nivio.appuser.AppUserRepository; -import de.bonndan.nivio.appuser.AppUserRole; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; @@ -15,21 +13,19 @@ import java.util.Objects; import java.util.Optional; -import static io.swagger.v3.oas.integration.StringOpenApiConfigurationLoader.LOGGER; - /** * Service that ensures that {@link CustomOAuth2User} users are used in the application. */ @Service public class CustomOAuth2UserService extends DefaultOAuth2UserService { - private final AppUserRepository appUserRepository; - private final AuthConfigProperties authConfigProperties; - public CustomOAuth2UserService(AppUserRepository appUserRepository, AuthConfigProperties authConfigProperties) { - this.appUserRepository = appUserRepository; + private final ApplicationEventPublisher applicationEventPublisher; + + public CustomOAuth2UserService(AuthConfigProperties authConfigProperties, ApplicationEventPublisher applicationEventPublisher) { this.authConfigProperties = authConfigProperties; + this.applicationEventPublisher = applicationEventPublisher; } @Override @@ -37,7 +33,7 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic OAuth2User user = super.loadUser(userRequest); try { CustomOAuth2User customOAuth2User = fromGitHubUser(user, authConfigProperties.getGithubAliasAttribute(), authConfigProperties.getGithubNameAttribute()); - saveUser(customOAuth2User); + applicationEventPublisher.publishEvent(new OAuth2LoginEvent(customOAuth2User)); return customOAuth2User; } catch (NullPointerException e) { throw new OAuth2AuthenticationException(String.format("Failed to create custom user: %s", e.getMessage())); @@ -82,24 +78,4 @@ public static CustomOAuth2User fromGitHubUser(@NonNull final OAuth2User user, "github"); } - - private void saveUser(CustomOAuth2User customOAuth2User) { - Optional appUser = appUserRepository.findByExternalId(customOAuth2User.getExternalId()); - - if (appUser.isEmpty()) { - LOGGER.info("No user found, generating profile for {}", customOAuth2User.getExternalId()); - AppUser newAppUser = new AppUser(); - newAppUser.setName(customOAuth2User.getName()); - newAppUser.setAlias(customOAuth2User.getAlias()); - newAppUser.setAvatarUrl(customOAuth2User.getAvatarUrl()); - newAppUser.setAppUserRole(AppUserRole.USER); - newAppUser.setLocked(false); - newAppUser.setEnabled(true); - newAppUser.setExternalId(customOAuth2User.getExternalId()); - newAppUser.setIdp(customOAuth2User.getIdp()); - - appUserRepository.save(newAppUser); - } - - } } diff --git a/src/test/java/de/bonndan/nivio/security/CustomOAuth2UserServiceTest.java b/src/test/java/de/bonndan/nivio/security/CustomOAuth2UserServiceTest.java index 8d67157ab..db6aa24da 100644 --- a/src/test/java/de/bonndan/nivio/security/CustomOAuth2UserServiceTest.java +++ b/src/test/java/de/bonndan/nivio/security/CustomOAuth2UserServiceTest.java @@ -1,11 +1,12 @@ package de.bonndan.nivio.security; -import de.bonndan.nivio.appuser.AppUser; import de.bonndan.nivio.appuser.AppUserRepository; -import de.bonndan.nivio.appuser.AppUserRole; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.oauth2.core.user.OAuth2UserAuthority; @@ -16,6 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.*; +@DataJpaTest class CustomOAuth2UserServiceTest { private OAuth2User oAuth2User; @@ -27,6 +29,8 @@ class CustomOAuth2UserServiceTest { private String idp = "github"; private Collection authorities; private CustomOAuth2User customOAuth2User; + private ApplicationEventPublisher applicationEventPublisher; + @Autowired AppUserRepository appUserRepository; @@ -74,31 +78,44 @@ void fromGitHubUserWithMissingNameFallsBackToLogin() { } @Test - void saveUser() { + void loadUser() { // given - customOAuth2User = CustomOAuth2UserService.fromGitHubUser(oAuth2User, "login", "name"); - AppUser appUser = new AppUser(); + AuthConfigProperties authConfigProperties = new AuthConfigProperties(); + OAuth2UserRequest userRequest; + userRequest = mock(OAuth2UserRequest.class); + applicationEventPublisher = mock(ApplicationEventPublisher.class); + CustomOAuth2UserService customOAuth2UserService = new CustomOAuth2UserService(authConfigProperties, applicationEventPublisher); // when - appUser.setName(customOAuth2User.getName()); - appUser.setAlias(customOAuth2User.getAlias()); - appUser.setAvatarUrl(customOAuth2User.getAvatarUrl()); - appUser.setAppUserRole(AppUserRole.USER); - appUser.setLocked(false); - appUser.setEnabled(true); - appUser.setExternalId(customOAuth2User.getExternalId()); - appUser.setIdp(customOAuth2User.getIdp()); + customOAuth2UserService.loadUser(userRequest); + + + // then + + +// customOAuth2User = CustomOAuth2UserService.fromGitHubUser(oAuth2User, "login", "name"); + +// AppUser appUser = new AppUser(); + +// appUser.setName(customOAuth2User.getName()); +// appUser.setAlias(customOAuth2User.getAlias()); +// appUser.setAvatarUrl(customOAuth2User.getAvatarUrl()); +// appUser.setAppUserRole(AppUserRole.USER); +// appUser.setLocked(false); +// appUser.setEnabled(true); +// appUser.setExternalId(customOAuth2User.getExternalId()); +// appUser.setIdp(customOAuth2User.getIdp()); // then - assertThat(appUser.getName()).isEqualTo(name); - assertThat(appUser.getAlias()).isEqualTo(login); - assertThat(appUser.getAvatarUrl()).isEqualTo(avatarUrl); - assertThat(appUser.getAppUserRole()).isEqualTo(AppUserRole.USER); - assertThat(appUser.getLocked()).isFalse(); - assertThat(appUser.getEnabled()).isTrue(); - assertThat(appUser.getExternalId()).isEqualTo(externalId); - assertThat(appUser.getIdp()).isEqualTo(idp); +// assertThat(appUser.getName()).isEqualTo(name); +// assertThat(appUser.getAlias()).isEqualTo(login); +// assertThat(appUser.getAvatarUrl()).isEqualTo(avatarUrl); +// assertThat(appUser.getAppUserRole()).isEqualTo(AppUserRole.USER); +// assertThat(appUser.getLocked()).isFalse(); +// assertThat(appUser.getEnabled()).isTrue(); +// assertThat(appUser.getExternalId()).isEqualTo(externalId); +// assertThat(appUser.getIdp()).isEqualTo(idp); }