권한 설정
0. Overview
관리자에서의 권한 설정에 대한 내용을 다룹니다.
1. 화면 메뉴 제어
관리자 화면의 메뉴 제어는 Setting > 메뉴 권한 관리
메뉴에서 설정하며,메뉴 권한 관리
는 route 설정을 기반으로 전체 메뉴 목록을 생성한다.
1.1 메뉴명과 메뉴 권한 코드
메뉴 권한 관리
에서 나오는 메뉴명은 route 설정의 meta.title
을 사용하며, 메뉴 권한 코드는 name
이 기본적으로 사용된다.
즉, 아래 route 설정에서는 메뉴명은 약관 관리
가 된며, 메뉴 권한 코드는 term-list
가 된다.
{
path: 'term',
name: 'term-list',
component: () => import('src/views/term/term-list.vue'),
meta: { title: '약관 관리' }
}
만약 메뉴 권한 코드로 route 설정의 name
이 아닌 다른값을 사용 하고 싶으면, meta 하위에 id 값을 정의하면, id 값을 메뉴 권한 코드로 사용하게 된다.
아래 route 설정에서는 menu:term
이 권한 코드가 된다.
{
path: 'term', name: 'term-list',
component: () => import('src/views/term/term-list.vue'),
meta: {
id: 'menu:term',
title: '약관 관리'
}
}
1.2. 상세 권한 코드
기본으로 지원되는 상세 권한은 생성(c), 읽기(r), 수정(u), 삭제(d), 엑셀다운로드(x) 이다.
각 상세 권한은 메뉴 권한 코드 뒤에 ::
를 붙여서, 데이터베이스에 저장된다.
메뉴 권한 코드 | 상세 권한 코드 | 최종 코드 |
---|---|---|
term-list | c | term-list::c |
term-list | r | term-list::r |
term-list | u | term-list::u |
term-list | d | term-list::d |
term-list | x | term-list::x |
1.3. 추가 확장 권한 코드
만약 위 권한들 외에, 해당 메뉴에 추가적인 별도의 권한이 필요하다면, 다음과 같이 meta.authExtTypes
에 해당 항목을 추가하면 된다.
{
path: 'admin', name: 'admin-list',
component: () => import('src/views/admin/admin-list.vue'),
meta: {
title: '관리자 관리',
authExtTypes: [{ label: '역할 지정', value: 'roles' }, { label: '비밀번호 초기화', value: 'pwd-init' }]
}
},
위 예에서는 역할 지정(roles
), 비밀번호 초기화(pwd-init
) 이라는 두개의 상세 권한을 추가한 것이다.
이를 역할 또는 사용자 에게 할당을 하게되면 각각 admin-list::roles
, admin-list::pwd-init
으로 디비에 저장되게 된다.
이렇게 추가한 확장 권한은 메뉴 권한 관리
화면에 다음과 같이 selectbox 형태로 노출되게 된다.
1.4. API 권한
각각의 메뉴 권한은, 해당 메뉴를 구성하는 domain 에 대한 API 사용 권한이 자동으로 주어진다.
INFO
사실 API 권한이 자동으로 주어진다기 보다는,
API 를 담당하는 java Resource 클래스에서 체크하는 권한코드가 메뉴권한 코드와 일치하게끔 코드지니가 코드를 생성하기 때문이다.
만약 특정 메뉴를 사용하는데, 다른 메뉴에서 사용하는 API 기능 필요하다면,
예를 들어 아래와 같이 메일을 작성하는 메뉴에서, 대상자를 찾기 위해 회원 정보를 가져와야 한다면. 다음과 같이 meta.authDependsOn
항목에 해당 권한을 추가한다.
{
path: 'message/mail', name: 'mail-list',
component: () => import('src/views/message/mail-list.vue'),
meta: {
title: 'MAIL 내역',
authExtTypes: [{ label: '발송', value: 'send' }],
authDependsOn: [API_PERMISSION.MEMBER.READ]
}
}
이렇게 하면 menu-list
권한을 가지는 사용자(또는 역할)는 API_PERMISSION.MEMBER.READ(api:member::r
) 또한 자동으로 가지게 된다.
다음은 constants.ts 에 선언된 API_PERMISSION
내용이다.
export const API_PERMISSION = {
META: {
READ: 'api:meta::r'
},
MEMBER: {
READ: 'api:member::r'
}
}
서버단(MemberResource.java)에도 api:member
권한에 대한 허용 처리가 되어 있는지 확인해 보도록 한다.
@Slf4j
@RestController
public class MemberResource {
public static final String PERMISSION_MENU_ID = "member-list";
public static final String PERMISSION_API_ID = "api:member";
@GetMapping(value = "/api/member", produces = MediaType.APPLICATION_JSON_VALUE)
@PreAuthorize("""
hasPrefixAuth(@accountResource.PERMISSION_MENU_ID, @permission.READ)
|| hasPrefixAuth(@accountResource.PERMISSION_API_ID, @permission.READ)""")
public ResponseEntity<List<Member>> listMember(@RequestParam(value = "q", required = false) Map<String, Object> q) {
}
}