Skip to content

Commit 9fdfe3d

Browse files
committed
[security-db-auth] 웹 기반 인가처리 실시간 반영 (URI 권한 변경 및 접근 요청 테스트)
1 parent 9d04e90 commit 9fdfe3d

File tree

10 files changed

+9614
-125801
lines changed

10 files changed

+9614
-125801
lines changed

logs/local/securityErrLog.log

Lines changed: 298 additions & 967 deletions
Large diffs are not rendered by default.

logs/local/securityLog.log

Lines changed: 9068 additions & 124758 deletions
Large diffs are not rendered by default.
Lines changed: 88 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,115 @@
11
package kr.seok.controller.admin;
22

33

4+
import kr.seok.domain.dto.ResourcesDto;
5+
import kr.seok.domain.entity.Resources;
6+
import kr.seok.domain.entity.Role;
7+
import kr.seok.domain.repository.RoleRepository;
8+
import kr.seok.security.metadatasource.UrlFilterInvocationSecurityMetadataSource;
9+
import kr.seok.service.ResourcesService;
10+
import kr.seok.service.RoleService;
11+
import org.modelmapper.ModelMapper;
12+
import org.springframework.beans.factory.annotation.Autowired;
413
import org.springframework.stereotype.Controller;
514
import org.springframework.ui.Model;
615
import org.springframework.web.bind.annotation.GetMapping;
16+
import org.springframework.web.bind.annotation.PathVariable;
17+
import org.springframework.web.bind.annotation.PostMapping;
18+
19+
import java.util.HashSet;
20+
import java.util.List;
21+
import java.util.Set;
722

823
@Controller
924
public class ResourcesController {
1025

11-
// @Autowired
12-
// private ResourcesService resourcesService;
26+
@Autowired
27+
private ResourcesService resourcesService;
1328

14-
// @Autowired
15-
// private RoleRepository roleRepository;
29+
@Autowired
30+
private RoleRepository roleRepository;
1631

17-
// @Autowired
18-
// private RoleService roleService;
32+
@Autowired
33+
private RoleService roleService;
1934

2035
// @Autowired
2136
// private MethodSecurityService methodSecurityService;
2237

23-
// @Autowired
24-
// private UrlFilterInvocationSecurityMetadataSource filterInvocationSecurityMetadataSource;
38+
@Autowired
39+
private UrlFilterInvocationSecurityMetadataSource filterInvocationSecurityMetadataSource;
2540

2641
@GetMapping(value="/admin/resources")
2742
public String getResources(Model model) throws Exception {
2843

29-
// List<Resources> resources = resourcesService.getResources();
30-
// model.addAttribute("resources", resources);
44+
List<Resources> resources = resourcesService.getResources();
45+
model.addAttribute("resources", resources);
3146

3247
return "admin/resource/list";
3348
}
3449

35-
// @PostMapping(value="/admin/resources")
36-
// public String createResources(ResourcesDto resourcesDto) throws Exception {
37-
//
38-
// ModelMapper modelMapper = new ModelMapper();
39-
// Role role = roleRepository.findByRoleName(resourcesDto.getRoleName());
40-
// Set<Role> roles = new HashSet<>();
41-
// roles.add(role);
42-
// Resources resources = modelMapper.map(resourcesDto, Resources.class);
43-
// resources.setRoleSet(roles);
44-
//
45-
// resourcesService.createResources(resources);
46-
//
47-
// if("url".equals(resourcesDto.getResourceType())){
48-
// filterInvocationSecurityMetadataSource.reload();
49-
// }else{
50+
@PostMapping(value="/admin/resources")
51+
public String createResources(ResourcesDto resourcesDto) throws Exception {
52+
53+
ModelMapper modelMapper = new ModelMapper();
54+
Role role = roleRepository.findByRoleName(resourcesDto.getRoleName());
55+
Set<Role> roles = new HashSet<>();
56+
roles.add(role);
57+
Resources resources = modelMapper.map(resourcesDto, Resources.class);
58+
resources.setRoleSet(roles);
59+
60+
resourcesService.createResources(resources);
61+
62+
if("url".equals(resourcesDto.getResourceType())){
63+
/* URL 권한 정보 입력시 reload */
64+
filterInvocationSecurityMetadataSource.reload();
65+
}else{
5066
// methodSecurityService.addMethodSecured(resourcesDto.getResourceName(),resourcesDto.getRoleName());
51-
// }
52-
//
53-
// return "redirect:/admin/resources";
54-
// }
55-
56-
// @GetMapping(value="/admin/resources/register")
57-
// public String viewRoles(Model model) throws Exception {
58-
//
59-
// List<Role> roleList = roleService.getRoles();
60-
// model.addAttribute("roleList", roleList);
61-
//
62-
// ResourcesDto resources = new ResourcesDto();
63-
// Set<Role> roleSet = new HashSet<>();
64-
// roleSet.add(new Role());
65-
// resources.setRoleSet(roleSet);
66-
// model.addAttribute("resources", resources);
67-
//
68-
// return "admin/resource/detail";
69-
// }
70-
71-
// @GetMapping(value="/admin/resources/{id}")
72-
// public String getResources(@PathVariable String id, Model model) throws Exception {
73-
//
74-
// List<Role> roleList = roleService.getRoles();
75-
// model.addAttribute("roleList", roleList);
76-
// Resources resources = resourcesService.getResources(Long.valueOf(id));
77-
//
78-
// ModelMapper modelMapper = new ModelMapper();
79-
// ResourcesDto resourcesDto = modelMapper.map(resources, ResourcesDto.class);
80-
// model.addAttribute("resources", resourcesDto);
81-
//
82-
// return "admin/resource/detail";
83-
// }
84-
85-
// @GetMapping(value="/admin/resources/delete/{id}")
86-
// public String removeResources(@PathVariable String id, Model model) throws Exception {
87-
//
88-
// Resources resources = resourcesService.getResources(Long.valueOf(id));
89-
// resourcesService.deleteResources(Long.valueOf(id));
90-
//
91-
// if("url".equals(resources.getResourceType())) {
92-
// filterInvocationSecurityMetadataSource.reload();
93-
// }else{
67+
}
68+
69+
return "redirect:/admin/resources";
70+
}
71+
72+
@GetMapping(value="/admin/resources/register")
73+
public String viewRoles(Model model) throws Exception {
74+
75+
List<Role> roleList = roleService.getRoles();
76+
model.addAttribute("roleList", roleList);
77+
78+
ResourcesDto resources = new ResourcesDto();
79+
Set<Role> roleSet = new HashSet<>();
80+
roleSet.add(new Role());
81+
resources.setRoleSet(roleSet);
82+
model.addAttribute("resources", resources);
83+
84+
return "admin/resource/detail";
85+
}
86+
87+
@GetMapping(value="/admin/resources/{id}")
88+
public String getResources(@PathVariable String id, Model model) throws Exception {
89+
90+
List<Role> roleList = roleService.getRoles();
91+
model.addAttribute("roleList", roleList);
92+
Resources resources = resourcesService.getResources(Long.valueOf(id));
93+
94+
ModelMapper modelMapper = new ModelMapper();
95+
ResourcesDto resourcesDto = modelMapper.map(resources, ResourcesDto.class);
96+
model.addAttribute("resources", resourcesDto);
97+
98+
return "admin/resource/detail";
99+
}
100+
101+
@GetMapping(value="/admin/resources/delete/{id}")
102+
public String removeResources(@PathVariable String id, Model model) throws Exception {
103+
104+
Resources resources = resourcesService.getResources(Long.valueOf(id));
105+
resourcesService.deleteResources(Long.valueOf(id));
106+
107+
if("url".equals(resources.getResourceType())) {
108+
filterInvocationSecurityMetadataSource.reload();
109+
}else{
94110
// methodSecurityService.removeMethodSecured(resources.getResourceName());
95-
// }
96-
//
97-
// return "redirect:/admin/resources";
98-
// }
111+
}
112+
113+
return "redirect:/admin/resources";
114+
}
99115
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package kr.seok.domain.dto;
2+
3+
import kr.seok.domain.entity.Role;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.util.Set;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class ResourcesDto {
16+
17+
private String id;
18+
private String resourceName;
19+
private String httpMethod;
20+
private int orderNum;
21+
private String resourceType;
22+
private String roleName;
23+
private Set<Role> roleSet;
24+
25+
}

security-db-auth/src/main/java/kr/seok/security/config/SecurityConfig.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
2626
import org.springframework.security.crypto.password.PasswordEncoder;
2727
import org.springframework.security.web.access.AccessDeniedHandler;
28-
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
2928
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
3029
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
3130
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
@@ -120,8 +119,8 @@ public AuthenticationManager authenticationManagerBean() throws Exception {
120119

121120
/* DB 기반으로 URL Resource, 권한을 관리하기 위한 FilterInvocationSecurityMetadataSource 구현체 */
122121
@Bean
123-
public FilterInvocationSecurityMetadataSource urlFilterInvocationSecurityMetadataSource() throws Exception {
124-
return new UrlFilterInvocationSecurityMetadataSource(urlResourcesMapFactoryBean().getObject());
122+
public UrlFilterInvocationSecurityMetadataSource urlFilterInvocationSecurityMetadataSource() throws Exception {
123+
return new UrlFilterInvocationSecurityMetadataSource(urlResourcesMapFactoryBean().getObject(), securityResourceService);
125124
}
126125

127126
private UrlResourcesMapFactoryBean urlResourcesMapFactoryBean() {

security-db-auth/src/main/java/kr/seok/security/metadatasource/UrlFilterInvocationSecurityMetadataSource.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package kr.seok.security.metadatasource;
22

3+
import kr.seok.security.service.SecurityResourceService;
34
import org.springframework.security.access.ConfigAttribute;
45
import org.springframework.security.web.FilterInvocation;
56
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
@@ -14,9 +15,14 @@
1415
public class UrlFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
1516

1617
private LinkedHashMap<RequestMatcher, List<ConfigAttribute>> requestMap;
18+
private SecurityResourceService securityResourceService;
19+
20+
public UrlFilterInvocationSecurityMetadataSource(
21+
LinkedHashMap<RequestMatcher, List<ConfigAttribute>> resourcesMap
22+
, SecurityResourceService securityResourceService) {
1723

18-
public UrlFilterInvocationSecurityMetadataSource(LinkedHashMap<RequestMatcher, List<ConfigAttribute>> resourcesMap) {
1924
this.requestMap = resourcesMap;
25+
this.securityResourceService = securityResourceService;
2026
}
2127
/**
2228
*
@@ -55,4 +61,17 @@ public Collection<ConfigAttribute> getAllConfigAttributes() {
5561
public boolean supports(Class<?> clazz) {
5662
return FilterInvocation.class.isAssignableFrom(clazz);
5763
}
64+
65+
public void reload() {
66+
LinkedHashMap<RequestMatcher, List<ConfigAttribute>> reLoadedResourceList = securityResourceService.getResourceList();
67+
Iterator<Map.Entry<RequestMatcher, List<ConfigAttribute>>> iterator = reLoadedResourceList.entrySet().iterator();
68+
/* 현재 프로젝트에 적용되고 있는 변수의 값을 비운다. */
69+
requestMap.clear();
70+
71+
while(iterator.hasNext()) {
72+
Map.Entry<RequestMatcher, List<ConfigAttribute>> entry = iterator.next();
73+
requestMap.put(entry.getKey(), entry.getValue());
74+
}
75+
76+
}
5877
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package kr.seok.service;
2+
3+
4+
import kr.seok.domain.entity.Resources;
5+
6+
import java.util.List;
7+
8+
public interface ResourcesService {
9+
10+
Resources getResources(long id);
11+
12+
List<Resources> getResources();
13+
14+
void createResources(Resources Resources);
15+
16+
void deleteResources(long id);
17+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package kr.seok.service;
2+
3+
import kr.seok.domain.entity.Role;
4+
5+
import java.util.List;
6+
7+
public interface RoleService {
8+
9+
Role getRole(long id);
10+
11+
List<Role> getRoles();
12+
13+
void createRole(Role role);
14+
15+
void deleteRole(long id);
16+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package kr.seok.service.impl;
2+
3+
import kr.seok.domain.entity.Resources;
4+
import kr.seok.service.ResourcesService;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.data.domain.Sort;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.List;
12+
13+
@Slf4j
14+
@Service
15+
public class ResourcesServiceImpl implements ResourcesService {
16+
17+
@Autowired
18+
private kr.seok.domain.repository.ResourcesRepository ResourcesRepository;
19+
20+
@Transactional
21+
public Resources getResources(long id) {
22+
return ResourcesRepository.findById(id).orElse(new Resources());
23+
}
24+
25+
@Transactional
26+
public List<Resources> getResources() {
27+
return ResourcesRepository.findAll(Sort.by(Sort.Order.asc("orderNum")));
28+
}
29+
30+
@Transactional
31+
public void createResources(Resources resources){
32+
ResourcesRepository.save(resources);
33+
}
34+
35+
@Transactional
36+
public void deleteResources(long id) {
37+
ResourcesRepository.deleteById(id);
38+
}
39+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package kr.seok.service.impl;
2+
3+
import kr.seok.domain.entity.Role;
4+
import kr.seok.domain.repository.RoleRepository;
5+
import kr.seok.service.RoleService;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
import java.util.List;
12+
13+
@Slf4j
14+
@Service
15+
public class RoleServiceImpl implements RoleService {
16+
17+
@Autowired
18+
private RoleRepository roleRepository;
19+
20+
@Transactional
21+
public Role getRole(long id) {
22+
return roleRepository.findById(id).orElse(new Role());
23+
}
24+
25+
@Transactional
26+
public List<Role> getRoles() {
27+
28+
return roleRepository.findAll();
29+
}
30+
31+
@Transactional
32+
public void createRole(Role role){
33+
34+
roleRepository.save(role);
35+
}
36+
37+
@Transactional
38+
public void deleteRole(long id) {
39+
roleRepository.deleteById(id);
40+
}
41+
}

0 commit comments

Comments
 (0)