권한을 role === 'ADMIN' 처럼 역할 이름으로 판단하던 코드를, 역할에 붙은 권한 목록으로 판단하도록 바꾼 이야기입니다.
문제
- 역할 이름이 바뀌면 판단하는 코드가 깨졌다
- 같은 검사가 백엔드와 화면 여러 곳에 흩어져 있었다
역할이 셋일 때는 문제가 잘 보이지 않았다. 현장마다 역할이 하나둘 늘어나면서, 이름을 비교하는 if 문이 컨트롤러와 서비스, 화면 컴포넌트에까지 퍼져 있다는 걸 알게 됐다.
바꾼 방법
판단은 한 곳에서만 하고, 컨트롤러에는 어노테이션만 남겼다.
@RequirePermission(feature = "SENSOR", permissions = {"READ"})
public SensorResponse get(@PathVariable Long siteId) {
return sensorService.get(siteId);
}
바뀌기 전과 후
| 전 | 후 |
|---|---|
| 역할 이름 비교 | 역할에 붙은 권한 조회 |
| 화면마다 따로 검사 | 판단은 한 곳 |
옛 방식이 한 곳이라도 남아 있으면 규칙이 두 개인 셈이다.
판단하는 곳
권한 검사는 인터셉터 하나가 맡는다. 어노테이션을 읽고, 로그인한 사용자의 역할에 붙은 권한 목록과 비교한다. 화면도 같은 권한 목록을 내려받아 버튼을 감출지 정한다.
옛 방식을 찾은 방법
한 번 검색하고 끝내지 않고, 이름 → 비슷한 모양 → 같은 뜻 순서로 세 번 나눠 찾았다.
'ADMIN'같은 역할 이름 문자열hasRole,isAdmin처럼 비슷한 모양의 함수- 이름은 다르지만 같은 판단을 하는 코드
남은 일
권한을 바꿀 때 같이 고쳐야 하는 세 곳은 다음 글에서 다룬다. → 권한을 바꾸면 세 곳을 같이 고친다
판단 결과를 캐시하는 이야기는 따로 정리하고 있다. → 준비 중인 글