각 화면에 접근할때, 권한에 따라 접근 여부를 판단해야 할 때가 있다.
이미 화면 진입 시 권한에 따라 메뉴를 그리긴하지만 그래도 마음이 편치않다.
그래서 메뉴 아이디와 로그인한 유저의 아이디로 접근 가능여부를 체크하기로 결심
1 2 3 4 5 6 7 8 9 10 11 12 | //공통코드 관리 @PreAuthorize("@menuService.accessCheck(#userDetails.getUsername(), #menuId)") @GetMapping("/common/code") public String commonCode(Map<String, Object> model, @RequestParam(value = "menuId", defaultValue = "") int menuId, @AuthenticationPrincipal UserDetails userDetails) { //메뉴 정보 Menu menu = menuService.getMenu(menuId); model.put("menuInfo", menu); //로그인한 유저의 정보 User user = userService.getUser(userDetails.getUsername()); model.put("userInfo", user); return "common_code"; } | cs |
@PreAuthorize는 실행 전에 들어온다.
보통 @PreAuthorize("hasRole('ROLE_ADMIN')") 이런 식으로 로그인한 유저의 권한을 체크하지만
(*여러개를 체크하고 싶다면 @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')"))
권한이 바뀔때마다 소스를 고쳐야하는 점이 불편하다.
그래서 권한을 부여하는 관리자 화면을 하나 만들고 DB에 있는 권한을 조회해서 체크하도록 만들었다.
@PreAuthorize("@menuService.accessCheck(#userDetails.getUsername(), #menuId)") 여기서 #은 파라미터이다.
함수에서 받아온 파라미터 명을 #과 함께 넣어주면 사용할 수 있다.
(@AuthenticationPrincipal UserDetails userDetails은 로그인한 유저의 정보를 담고 있다.)
그리고 @는 사용할 서비스다.
이해를 돕기 위해서 @menuService.accessCheck()가 구현된 소스를 첨부
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Component("menuService") @Service public class MenuServiceImpl implements MenuService { ....생략.... public boolean accessCheck(String userId, int menuId){ ....생략.... if(userRoleOrder <= menuRoleOrder){ return true; } return false; } } |
|
@Component("menuService") 이름 이쁜걸로 넣어주고 멋지게 함수 만들면 끝이다.
'※ > 공부' 카테고리의 다른 글
화면에서 엑셀(xlsx) export하기 (0) | 2019.03.21 |
---|---|
jqGrid 페이징 예제 (0) | 2019.03.15 |
타임리프(thymeleaf) 속성 정리 (0) | 2019.03.12 |
타임리프(thymeleaf) javascript 변수 사용 (0) | 2019.03.12 |
Bootsrap DatePicker 기본 셋팅 (0) | 2019.03.11 |