스프링 시큐리티/실전프로젝트 - 인가 프로세스 DB 연동 웹 계층 구현

ch02. 관리자 시스템 - 권한 도메인, 서비스, 리포지토리 구성

webmaster 2022. 1. 23. 23:24
728x90
    • SetupDataLoader
      • 초기 데이터를 넣어두었다. 
      • @Component
        public class SetupDataLoader implements ApplicationListener<ContextRefreshedEvent> {
        
            private boolean alreadySetup = false;
        
            @Autowired
            private UserRepository userRepository;
        
            @Autowired
            private RoleRepository roleRepository;
        
            @Autowired
            private ResourcesRepository resourcesRepository;
        
            @Autowired
            private PasswordEncoder passwordEncoder;
        
            private static AtomicInteger count = new AtomicInteger(0);
        
            @Override
            @Transactional
            public void onApplicationEvent(final ContextRefreshedEvent event) {
        
                if (alreadySetup) {
                    return;
                }
        
                setupSecurityResources();
        
                alreadySetup = true;
            }
        
        
        
            private void setupSecurityResources() {
                Set<Role> roles = new HashSet<>();
                Role adminRole = createRoleIfNotFound("ROLE_ADMIN", "관리자");
                roles.add(adminRole);
                createResourceIfNotFound("/admin/**", "", roles, "url");
                Account account = createUserIfNotFound("admin", "pass", "admin@gmail.com", 10,  roles);
            }
        
            @Transactional
            public Role createRoleIfNotFound(String roleName, String roleDesc) {
        
                Role role = roleRepository.findByRoleName(roleName);
        
                if (role == null) {
                    role = Role.builder()
                            .roleName(roleName)
                            .roleDesc(roleDesc)
                            .build();
                }
                return roleRepository.save(role);
            }
        
            @Transactional
            public Account createUserIfNotFound(String userName, String password, String email, int age, Set<Role> roleSet) {
        
                Account account = userRepository.findByUsername(userName);
        
                if (account == null) {
                    account = Account.builder()
                            .username(userName)
                            .email(email)
                            .age(age)
                            .password(passwordEncoder.encode(password))
                            .userRoles(roleSet)
                            .build();
                }
                return userRepository.save(account);
            }
        
            @Transactional
            public Resources createResourceIfNotFound(String resourceName, String httpMethod, Set<Role> roleSet, String resourceType) {
                Resources resources = resourcesRepository.findByResourceNameAndHttpMethod(resourceName, httpMethod);
        
                if (resources == null) {
                    resources = Resources.builder()
                            .resourceName(resourceName)
                            .roleSet(roleSet)
                            .httpMethod(httpMethod)
                            .resourceType(resourceType)
                            .orderNum(count.incrementAndGet())
                            .build();
                }
                return resourcesRepository.save(resources);
            }
        }
  • 도메인 관계도
    • 도메인 관계도
728x90