2021. 12. 17. 00:29ㆍ스프링부트
압축파일의 관리자 상세페이지 jsp, js, css를 붙여습니다
store폴더의 storeDetail.jsp는 관리자페이지도 같이 사용하기 위해 수정본으로 새로 준비했습니다


storeDetail.js의 다음 부분을 수정합니다

지난 장에서 DB에서 내 가게를 등록했었는데 등록한 가게 외에는 접근할 수 없게 막아야합니다
남의 가게의 정보를 수정할 수 없어야 하니까요
인터셉터나 AOP를 사용할 수 있겠지만 컨트롤러의 파라미터를 체크하기 위해 AOP를 사용하겠습니다
pom.xml에 추가합니다
<!-- AOP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
스프링부트 메인메서드에 @EnableAspectJAutoProxy를 붙여줍니다
@EnableAspectJAutoProxy @SpringBootApplication public class BaeminApplication { public static void main(String[] args) { SpringApplication.run(BaeminApplication.class, args); } }
AOP는 어노테이션, 접근제어자, 메서드이름 등등.. 특정 패턴에 의해 실행될 메서드를 지정할 수 있는데 특정 어노테이션에 의해 실행 될수 있게 구현하려고 합니다
AOP패키지를 만들고 어노테이션을 생성합니다
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface IsMyStore { }
내 가게인지 체크한다는 의미로 isMyStore라고 지었습니다
AOP패키지에 AdminAOP클래스를 생성합니다
@Aspect @Component public class AdminAOP { }
AOP클래스로 사용하겠다고 @Aspect를 붙여줍니다
@Component를 붙여 빈으로 등록합니다
@Around("@annotation(com.baemin.aop.IsMyStore)") public Object myStore(ProceedingJoinPoint j) throws Throwable { return null; }
@Around는 ProceedingJoinPoint객체의 proceed()메서드를 기준으로 컨트롤러 메서드의 앞 뒤에 실행될 코드를 작성합니다
@Around("@annotation(com.baemin.aop.IsMyStore)") public Object myStore(ProceedingJoinPoint j) throws Throwable { long storeId = 0; Object[] args = j.getArgs(); if(args.length > 0) { Object arg = args[0]; if(arg instanceof Long) { storeId = (long) arg; } else if(arg instanceof Store) { storeId = ((Store) arg).getId(); } else if(arg instanceof Food) { storeId = ((Food) arg).getStoreId(); } } if(!isMyStore(storeId)) { System.out.println("aop 에러"); return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED); } Object returnObj = j.proceed(); return returnObj; }
ProceedingJoinPoint객체의 Args()로 메서드의 파라미터를 가져옵니다
파라미터의 첫번째 값인 args[0]을 체크하고 isMyStore() 메서드를 실행해 내 계정에 등록된 가게인지 검사 후 통과한다면 j.proceed()를 반환해 해당 페이지에 접근할 수 있게합니다
@Autowired private AdminService adminService;
public boolean isMyStore(long storeId) throws IOException { ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes(); HttpSession session = attr.getRequest().getSession(); List<Long> storeIdList = (List<Long>) session.getAttribute("myStore"); if(storeIdList == null) { SecurityContext sc = (SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT"); LoginService user = (LoginService) sc.getAuthentication().getPrincipal(); long userId = user.getUser().getId(); storeIdList = adminService.getMyStoreId(userId); session.setAttribute("myStore", storeIdList); } if(storeIdList.size() == 0) { return false; } else { if(storeIdList.contains(storeId)) { return true; } else { return false; } } }
세션에 등록된 mystore 리스트를 가져옵니다
null이라면 시큐리티 세션의 계정의 id로 db에서 select해 세션에 저장합니다
adminService와 dao에 getMyStoreId()를 추가합니다
adminServiceImp
@Override public List<Long> getMyStoreId(long userId) { return adminDAO.getMyStoreId(userId); }
adminDAOImp
@Override public List<Long> getMyStoreId(long userId) { return sql.selectList("admin.getMyStoreId", userId); }
adminMapper
<select id="getMyStoreId" resultType="long"> SELECT STORE_ID FROM BM_MY_STORE WHERE USER_ID = #{userId } </select>
컨트롤러의 검사하고 싶은 메서드에 @IsMyStore를 붙여줍니다
@IsMyStore @GetMapping("/admin/management/detail/{id}") public String detail(@PathVariable long id, @AuthenticationPrincipal LoginService user, Model model) { long userId = user.getUser().getId(); StoreDetail storeDetail = storeService.storeDetail(id, userId); model.addAttribute("store", storeDetail); model.addAttribute("adminPage", true); return "admin/detail"; }
계정에 등록된 가게일때

계정에 등록되지 않은 가게일때

'스프링부트' 카테고리의 다른 글
스프링부트+jsp로 배달사이트 만들기-29 관리자페이지(메뉴 삭제,수정, 답장하기) (0) | 2021.12.17 |
---|---|
스프링부트+jsp로 배달사이트 만들기-28 관리자페이지(가게 정보 수정, 메뉴 추가) (0) | 2021.12.17 |
스프링부트+jsp로 배달사이트 만들기-25 매장검색 (2) | 2021.12.11 |
스프링부트+jsp로 배달사이트 만들기-24 찜하기(비회원) (0) | 2021.12.10 |
스프링부트+jsp로 배달사이트 만들기-23 찜한 가게 목록 (0) | 2021.12.10 |