From 4f0d70eccb6c0d51ff5f2e934cd59751aaab5a28 Mon Sep 17 00:00:00 2001 From: JianChoi-Kor Date: Mon, 11 Jul 2022 23:35:53 +0900 Subject: [PATCH] SetupDataLoader --- .../persistence/dao/PrivilegeRepository.java | 2 + .../basic/persistence/dao/RoleRepository.java | 2 + .../basic/persistence/dao/UserRepository.java | 2 + .../basic/persistence/model/Privilege.java | 5 + .../basic/persistence/model/Role.java | 8 ++ .../basic/persistence/model/User.java | 2 + .../basic/spring/SetupDataLoader.java | 96 +++++++++++++++++++ 7 files changed, 117 insertions(+) create mode 100644 src/main/java/com/security/basic/spring/SetupDataLoader.java diff --git a/src/main/java/com/security/basic/persistence/dao/PrivilegeRepository.java b/src/main/java/com/security/basic/persistence/dao/PrivilegeRepository.java index 2433783..633c247 100644 --- a/src/main/java/com/security/basic/persistence/dao/PrivilegeRepository.java +++ b/src/main/java/com/security/basic/persistence/dao/PrivilegeRepository.java @@ -4,4 +4,6 @@ import com.security.basic.persistence.model.Privilege; import org.springframework.data.jpa.repository.JpaRepository; public interface PrivilegeRepository extends JpaRepository { + + Privilege findByName(String name); } diff --git a/src/main/java/com/security/basic/persistence/dao/RoleRepository.java b/src/main/java/com/security/basic/persistence/dao/RoleRepository.java index 8530d76..3e8a548 100644 --- a/src/main/java/com/security/basic/persistence/dao/RoleRepository.java +++ b/src/main/java/com/security/basic/persistence/dao/RoleRepository.java @@ -4,4 +4,6 @@ import com.security.basic.persistence.model.Role; import org.springframework.data.jpa.repository.JpaRepository; public interface RoleRepository extends JpaRepository { + + Role findByName(String name); } diff --git a/src/main/java/com/security/basic/persistence/dao/UserRepository.java b/src/main/java/com/security/basic/persistence/dao/UserRepository.java index c1cac02..9b886bb 100644 --- a/src/main/java/com/security/basic/persistence/dao/UserRepository.java +++ b/src/main/java/com/security/basic/persistence/dao/UserRepository.java @@ -4,4 +4,6 @@ import com.security.basic.persistence.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { + + User findByEmail(String email); } diff --git a/src/main/java/com/security/basic/persistence/model/Privilege.java b/src/main/java/com/security/basic/persistence/model/Privilege.java index 3d1d4be..dbad2db 100644 --- a/src/main/java/com/security/basic/persistence/model/Privilege.java +++ b/src/main/java/com/security/basic/persistence/model/Privilege.java @@ -21,4 +21,9 @@ public class Privilege { @ManyToMany(mappedBy = "privileges") private Collection roles; + + public Privilege(final String name) { + super(); + this.name = name; + } } diff --git a/src/main/java/com/security/basic/persistence/model/Role.java b/src/main/java/com/security/basic/persistence/model/Role.java index d5912d1..d3c1901 100644 --- a/src/main/java/com/security/basic/persistence/model/Role.java +++ b/src/main/java/com/security/basic/persistence/model/Role.java @@ -29,4 +29,12 @@ public class Role { inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id") ) private Collection privileges; + + public Role() { + super(); + } + + public Role(final String name) { + this.name = name; + } } diff --git a/src/main/java/com/security/basic/persistence/model/User.java b/src/main/java/com/security/basic/persistence/model/User.java index 863b605..8ff21b9 100644 --- a/src/main/java/com/security/basic/persistence/model/User.java +++ b/src/main/java/com/security/basic/persistence/model/User.java @@ -1,5 +1,6 @@ package com.security.basic.persistence.model; +import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -8,6 +9,7 @@ import java.util.Collection; @Entity +@Builder @Getter @Setter @Table(name = "users") diff --git a/src/main/java/com/security/basic/spring/SetupDataLoader.java b/src/main/java/com/security/basic/spring/SetupDataLoader.java new file mode 100644 index 0000000..50c372a --- /dev/null +++ b/src/main/java/com/security/basic/spring/SetupDataLoader.java @@ -0,0 +1,96 @@ +package com.security.basic.spring; + +import com.security.basic.persistence.dao.PrivilegeRepository; +import com.security.basic.persistence.dao.RoleRepository; +import com.security.basic.persistence.dao.UserRepository; +import com.security.basic.persistence.model.Privilege; +import com.security.basic.persistence.model.Role; +import com.security.basic.persistence.model.User; +import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +import javax.transaction.Transactional; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class SetupDataLoader implements ApplicationListener { + + private final UserRepository userRepository; + private final RoleRepository roleRepository; + private final PrivilegeRepository privilegeRepository; + private final PasswordEncoder passwordEncoder; + + private boolean alreadySetup = false; + + @Override + @Transactional + public void onApplicationEvent(ContextRefreshedEvent event) { + + if (alreadySetup) { + return; + } + + //create initial privileges + Privilege readPrivilege = createPrivilegeIfNotFound("READ_PRIVILEGE"); + Privilege writePrivilege = createPrivilegeIfNotFound("WRITE_PRIVILEGE"); + + //create initial roles + List adminPrivileges = Arrays.asList(readPrivilege, writePrivilege); + createRoleIfNotFound("ROLE_ADMIN", adminPrivileges); + + List userPrivileges = Arrays.asList(readPrivilege); + createRoleIfNotFound("ROLE_USER", userPrivileges); + + Role adminRole = roleRepository.findByName("ROLE_ADMIN"); + Role userRole = roleRepository.findByName("ROLE_USER"); + + //create initial admin + createUserIfNotFound("admin@admin.test", "test1234!", Arrays.asList(adminRole)); + + //create initial user + createUserIfNotFound("user@user.test", "test1234!", Arrays.asList(userRole)); + + alreadySetup = true; + } + + @Transactional + Privilege createPrivilegeIfNotFound(String name) { + Privilege privilege = privilegeRepository.findByName(name); + if (privilege == null) { + privilege = new Privilege(name); + privilegeRepository.save(privilege); + } + return privilege; + } + + @Transactional + Role createRoleIfNotFound(String name, Collection privileges) { + Role role = roleRepository.findByName(name); + if (role == null) { + role = new Role(name); + role.setPrivileges(privileges); + roleRepository.save(role); + } + return role; + } + + @Transactional + User createUserIfNotFound(final String email, final String password, final Collection roles) { + User user = userRepository.findByEmail(email); + if (user == null) { + user = User.builder() + .email(email) + .password(passwordEncoder.encode(password)) + .roles(roles) + .build(); + userRepository.save(user); + } + return user; + } +}