Skip to content
This repository has been archived by the owner on Nov 3, 2022. It is now read-only.

Commit

Permalink
[#141] add loginEvent und listener
Browse files Browse the repository at this point in the history
  • Loading branch information
jenarp committed Jan 26, 2022
1 parent 7503827 commit 9fef348
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 90 deletions.
72 changes: 36 additions & 36 deletions src/main/java/de/bonndan/nivio/appuser/AppUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,42 +91,6 @@ public class AppUser implements UserDetails {
@Column
private Boolean enabled;

@Override
public Collection<? extends GrantedAuthority> 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;
}
Expand Down Expand Up @@ -202,4 +166,40 @@ public void setExternalId(String externalId) {
}

public void setIdp(String idp) { this.idp = idp; }

@Override
public Collection<? extends GrantedAuthority> 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;
}
}
1 change: 0 additions & 1 deletion src/main/java/de/bonndan/nivio/appuser/AppUserRole.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ public enum AppUserRole {
USER,
ADMIN;


// declare your defaults with constant values
private static final AppUserRole defaultValue = USER;

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/de/bonndan/nivio/appuser/AppUserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,29 +13,27 @@
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
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
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()));
Expand Down Expand Up @@ -82,24 +78,4 @@ public static CustomOAuth2User fromGitHubUser(@NonNull final OAuth2User user,
"github");
}


private void saveUser(CustomOAuth2User customOAuth2User) {
Optional<AppUser> 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);
}

}
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -16,6 +17,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;

@DataJpaTest
class CustomOAuth2UserServiceTest {

private OAuth2User oAuth2User;
Expand All @@ -27,6 +29,8 @@ class CustomOAuth2UserServiceTest {
private String idp = "github";
private Collection<OAuth2UserAuthority> authorities;
private CustomOAuth2User customOAuth2User;
private ApplicationEventPublisher applicationEventPublisher;


@Autowired
AppUserRepository appUserRepository;
Expand Down Expand Up @@ -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);

}

Expand Down

0 comments on commit 9fef348

Please sign in to comment.