SetupDataLoader

This commit is contained in:
JianChoi-Kor
2022-07-11 23:35:53 +09:00
parent 3354a7347a
commit 4f0d70eccb
7 changed files with 117 additions and 0 deletions

View File

@@ -4,4 +4,6 @@ import com.security.basic.persistence.model.Privilege;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PrivilegeRepository extends JpaRepository<Privilege, Long> {
Privilege findByName(String name);
}

View File

@@ -4,4 +4,6 @@ import com.security.basic.persistence.model.Role;
import org.springframework.data.jpa.repository.JpaRepository;
public interface RoleRepository extends JpaRepository<Role, Long> {
Role findByName(String name);
}

View File

@@ -4,4 +4,6 @@ import com.security.basic.persistence.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}

View File

@@ -21,4 +21,9 @@ public class Privilege {
@ManyToMany(mappedBy = "privileges")
private Collection<Role> roles;
public Privilege(final String name) {
super();
this.name = name;
}
}

View File

@@ -29,4 +29,12 @@ public class Role {
inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id")
)
private Collection<Privilege> privileges;
public Role() {
super();
}
public Role(final String name) {
this.name = name;
}
}

View File

@@ -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")

View File

@@ -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<ContextRefreshedEvent> {
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<Privilege> adminPrivileges = Arrays.asList(readPrivilege, writePrivilege);
createRoleIfNotFound("ROLE_ADMIN", adminPrivileges);
List<Privilege> 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<Privilege> 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<Role> 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;
}
}