본문 바로가기

※/공부

스프링 시큐리티(Spring Security) 접근 권한 체크


각 화면에 접근할때, 권한에 따라 접근 여부를 판단해야 할 때가 있다.


이미 화면 진입 시 권한에 따라 메뉴를 그리긴하지만 그래도 마음이 편치않다.


그래서 메뉴 아이디와 로그인한 유저의 아이디로 접근 가능여부를 체크하기로 결심


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