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

Commit

Permalink
[#141] github user in database
Browse files Browse the repository at this point in the history
  • Loading branch information
jenarp committed Jan 19, 2022
1 parent a141f45 commit 734376e
Show file tree
Hide file tree
Showing 10 changed files with 132 additions and 2,301 deletions.
2 changes: 1 addition & 1 deletion src/main/java/de/bonndan/nivio/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static void main(String[] args) {
// @Bean
// CommandLineRunner commandLineRunner(AppUserRepository userRepository) {
// return args -> {
// AppUser mary = new AppUser("Mary", "mary88", "m@online.com", "avatarURL", AppUserRole.USER, false, true );
// AppUser mary = new AppUser("123","Mary", "Mary88", "mary@email.com", "avatarUrl", AppUserRole.USER);
// userRepository.save(mary);
// };
// }
Expand Down
104 changes: 75 additions & 29 deletions src/main/java/de/bonndan/nivio/appuser/AppUser.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package de.bonndan.nivio.appuser;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
Expand All @@ -12,15 +8,12 @@
import java.util.Collection;
import java.util.Collections;

@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor

@Entity(name = "AppUser")
@Table(
name = "user",
uniqueConstraints = {
@UniqueConstraint(name = "user_email_unique",
@UniqueConstraint(name = "appuser_email_unique",
columnNames = "email")
}
)
Expand All @@ -31,14 +24,14 @@ public class AppUser implements UserDetails {
sequenceName = "user_sequence",
allocationSize = 1
)
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "user_sequence"
)
@Id
@Column(
name = "id",
updatable = false
nullable = false
)
private Long id;

Expand All @@ -64,13 +57,6 @@ public class AppUser implements UserDetails {
)
private String email;

@Column(
name = "principal_id",
nullable = false,
columnDefinition = "TEXT"
)
private String principalId;

@Column(
name = "avatar_url",
nullable = false,
Expand All @@ -90,20 +76,16 @@ public class AppUser implements UserDetails {
private Boolean locked;
private Boolean enabled;

public AppUser(String name,
String userName,
String email,
String avatarUrl,
AppUserRole appUserRole,
Boolean locked,
Boolean enabled) {
public AppUser(String name, String alias, String email, String avatarUrl, AppUserRole appUserRole) {
this.name = name;
this.alias = userName;
this.alias = alias;
this.email = email;
this.avatarUrl = avatarUrl;
this.appUserRole = appUserRole;
this.locked = locked;
this.enabled = enabled;
}

public AppUser() {

}


Expand Down Expand Up @@ -142,4 +124,68 @@ public boolean isCredentialsNonExpired() {
public boolean isEnabled() {
return true;
}
}

public Long getId() {
return id;
}

public String getName() {
return name;
}

public String getAlias() {
return alias;
}

public String getEmail() {
return email;
}

public String getAvatarUrl() {
return avatarUrl;
}

public AppUserRole getAppUserRole() {
return appUserRole;
}

public Boolean getLocked() {
return locked;
}

public Boolean getEnabled() {
return enabled;
}

public void setId(Long id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

public void setAlias(String alias) {
this.alias = alias;
}

public void setEmail(String email) {
this.email = email;
}

public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}

public void setAppUserRole(AppUserRole appUserRole) {
this.appUserRole = appUserRole;
}

public void setLocked(Boolean locked) {
this.locked = locked;
}

public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
}
5 changes: 2 additions & 3 deletions src/main/java/de/bonndan/nivio/appuser/AppUserRepository.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.bonndan.nivio.appuser;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -9,9 +10,7 @@

@Repository
@Transactional(readOnly = true)
public interface AppUserRepository extends JpaRepository<AppUser, Long> {

AppUser findByPrincipalId(String principalID);
public interface AppUserRepository extends CrudRepository<AppUser, Long> {

Optional<AppUser> findByEmail(String email);

Expand Down
6 changes: 4 additions & 2 deletions src/main/java/de/bonndan/nivio/appuser/AppUserService.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package de.bonndan.nivio.appuser;

import lombok.AllArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
@AllArgsConstructor
public class AppUserService implements UserDetailsService {

private static final String USER_NOT_FOUND = "User with email %s not found.";
private final AppUserRepository appUserRepository;

public AppUserService(AppUserRepository appUserRepository) {
this.appUserRepository = appUserRepository;
}

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
return appUserRepository.findByEmail(email)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
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.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
Expand All @@ -12,23 +15,30 @@
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(AuthConfigProperties authConfigProperties) {
public CustomOAuth2UserService(AppUserRepository appUserRepository, AuthConfigProperties authConfigProperties) {
this.appUserRepository = appUserRepository;
this.authConfigProperties = authConfigProperties;
}

@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User user = super.loadUser(userRequest);
try {
return fromGitHubUser(user, authConfigProperties.getGithubAliasAttribute(), authConfigProperties.getGithubNameAttribute());
CustomOAuth2User customOAuth2User = fromGitHubUser(user, authConfigProperties.getGithubAliasAttribute(), authConfigProperties.getGithubNameAttribute());
saveUser(customOAuth2User);
return customOAuth2User;
} catch (NullPointerException e) {
throw new OAuth2AuthenticationException(String.format("Failed to create custom user: %s", e.getMessage()));
}
Expand Down Expand Up @@ -68,8 +78,27 @@ public static CustomOAuth2User fromGitHubUser(@NonNull final OAuth2User user,
name,
user.getAttributes(),
user.getAuthorities(),
user.getAttribute("avatar_url")
);
user.getAttribute("avatar_url"));
}


private void saveUser(CustomOAuth2User customOAuth2User) {
Optional<AppUser> appUser = appUserRepository.findByEmail(customOAuth2User.getId());


if (appUser.isEmpty()) {
LOGGER.info("No user found, generating profile for {}", customOAuth2User.getId());
AppUser newAppUser = new AppUser();
newAppUser.setEmail(customOAuth2User.getId());
newAppUser.setName(customOAuth2User.getName());
newAppUser.setAlias(customOAuth2User.getAlias());
newAppUser.setAvatarUrl(customOAuth2User.getAvatarUrl());
newAppUser.setAppUserRole(AppUserRole.USER);
newAppUser.setLocked(false);
newAppUser.setEnabled(true);

appUserRepository.save(newAppUser);
}

}
}
21 changes: 1 addition & 20 deletions src/main/java/de/bonndan/nivio/security/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import de.bonndan.nivio.appuser.AppUser;
import de.bonndan.nivio.appuser.AppUserRepository;
import de.bonndan.nivio.appuser.AppUserRole;
import de.bonndan.nivio.appuser.AppUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -22,6 +21,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static org.springframework.http.HttpHeaders.SET_COOKIE;

Expand Down Expand Up @@ -161,24 +161,5 @@ public void writeHeaders(HttpServletRequest request, HttpServletResponse respons

}

@Bean
public PrincipalExtractor principalExtractor(AppUserRepository appUserRepository) {
return map -> {
String principalId = (String) map.get("id");
AppUser appUser = appUserRepository.findByPrincipalId(principalId);
if (appUser == null) {
LOGGER.info("No user found, generating profile for {}", principalId);
appUser = new AppUser();
appUser.setPrincipalId(principalId);
appUser.setEmail((String) map.get("email"));
appUser.setName((String) map.get("name"));
appUser.setAlias((String) map.get("alias"));
appUser.setAppUserRole(AppUserRole.USER);
appUser.setAvatarUrl((String) map.get("avatar_url"));
}

appUserRepository.save(appUser);
return appUser;
};
}
}
16 changes: 14 additions & 2 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,24 @@ spring:
driver-class-name: org.h2.Driver
username:
password:
url: jdbc:h2:./src/main/resources/data/user;AUTO_SERVER=TRUE
url: jdbc:h2:./src/main/resources/data/appuser;AUTO_SERVER=TRUE
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.H2Dialect
dialect: org.hibernate.dialect.H2Dialect


#security:
# oauth2:
# client:
# access-token-uri: https://github.com/login/oauth/access_token
# user-authorization-uri: https://github.com/login/oauth/authorize
# scope: read:user,user:email
# client-id: 89a7c4facbb3434d599d
# client-secret: 9b3b08e4a340bd20e866787e4645b54f73d74b6a
# resource:
# user-info-uri: https://api.github.com/user
Binary file removed src/main/resources/data/user.mv.db
Binary file not shown.
Loading

0 comments on commit 734376e

Please sign in to comment.