작은 게시판을 만든다고 가정해보자. /board/v1.0/{boardId} API를 호출하면 게시물을 반환하게 되고 해당 API는 인증된 회원만 호출할 수 있다고 가정하자. 먼저 인증된 회원이라는 Role을 만들어야 한다.
curl을 사용한 예제에서 "{Appkey}" 와 "{SecretKey}" 값은 실제 프로젝트 내의 활성화한 Role상품의 Appkey와 SecreKey로 대채를 해야 한다.
1-1) [CONSOLE 사용 시]
1-2) [RESTFUL API 호출 시]
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"description": "인증된 회원",
"roleId": "MEMBER"
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/roles"
1-3) [Client SDK 이용 시]
// applicationContext.xml 에서 clientFactory 를 bean 으로 등록했다 가정한다.
TCRoleClient client = clientFactory.getClient();
client.createRole("MEMBER", "인증된 회원");
Role을 만들었으면 Operation을 만들어야 한다.
2-1) [CONSOLE 사용 시]
2-2) [RESTFUL API 호출 시]
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"description": "HTTP GET",
"operationId": "GET"
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/operations"
2-3) [Client SDK 이용 시]
client.createOperation("GET", "HTTP GET");
이제 /board/v1.0/{boardId}를 Resource로 등록해보자. board, v1.0, {boardId} 로 나누어서 순차적으로 등록해야 한다.
3-1) [CONSOLE 사용 시]
3-2) [RESTFUL API 호출 시]
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"description": "",
"metadata": "",
"name": "board",
"path": "/board",
"priority": 0,
"resourceId": "API_BOARD"
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/resources"
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"description": "",
"metadata": "",
"name": "v1.0",
"path": "/board/v1.0",
"priority": 0,
"resourceId": "API_BOARD_VERSION"
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/resources"
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"description": "",
"metadata": "",
"name": "{boardId}",
"path": "/board/v1.0/{boardId}",
"priority": 0,
"resourceId": "API_BOARD_ID"
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/resources"
3-3) [Client SDK 이용 시]
client.createResource("API_BOARD", "", "board", "/board", 0, "");
client.createResource("API_BOARD_VERSION", "", "v1.0", "/board/v1.0", 0, "");
client.createResource("API_BOARD_ID", "", "{boardId}", "/board/v1.0/{boardId}", 0, "");
Resource까지 등록했다면, Role과 Resource의 관계를 설정해야 한다. API_BOARD_ID 권한을 부여해보자.
4-1) [CONSOLE 사용 시]
4-2) [RESTFUL API 호출 시]
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"operationId": "GET",
"roleId": "MEMBER"
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/resources/API_BOARD_ID/authorizations"
4-3) [Client SDK 이용 시]
client.addAuthorization("API_BOARD_ID", "GET", "MEMBER");
마지막으로 User를 추가하고 Role을 부여한다.
5-1) [CONSOLE 사용 시]
5-2) [RESTFUL API 호출 시]
curl -X POST -H "Content-Type: application/json" -H "X-Secret-Key: {SecretKey}" -d '{
"users": [
{
"description": "홍길동",
"relations": [
{
"roleId": "MEMBER",
"scopeId": "ALL"
}
],
"userId": "12345678-1234-5678-1234-567812345678"
}
]
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/users"
5-3) [Client SDK 이용 시]
List<UserRoleRelation> relations = new ArrayList<UserRoleRelation>();
relations.add(new UserRoleRelation("MEMBER", "ALL"));
client.createUser("12345678-1234-5678-1234-567812345678", "홍길동", relations);
userId 가 Header 의 'uuid' 로 값이 넘어 온다고 가정해보자. 12345678-1234-5678-1234-567812345678 사용자가 /board/v1.0/1 API 를 호출하였을 때, 권한을 체크하면 아래와 같다.
6-1) [RESTFUL API 호출 시]
curl -X POST -H "Content-Type: application/json" -d '{
"resources": [
{
"operationId": "GET",
"resourceId": "",
"resourcePath": "/board/v1.0/1",
"scopeId": "ALL"
}
]
}' "https://role.api.nhncloudservice.com/role/v1.0/appkeys/{Appkey}/users/12345678-1234-5678-1234-567812345678/authorizations"
6-2) [Spring Client SDK 이용 시]
public class BoardController {
@Autowired
private TCRoleClientFactory clientFactory;
@RequestMapping(value = "/board/v1.0/{boardId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> getBoard(
@RequestHeader("uuid") String uuid,
@PathVariable("boardId") Integer boardId)
{
TCRoleClient client = clientFactory.getClient();
// scopeId 는 생략 시 'ALL' 을 사용하게 된다.
if (client.hasAuthorizationById(uuid, "/board/v1.0/{boardId}", "GET") == false) {
return new ResponseEntity<String>(HttpStatus.UNAUTHORIZED);
}
[Spring Client SDK @Authorization 이용 시]
public class BoardController {
@Autowired
private TCRoleClientFactory clientFactory;
// scopeId 는 생략 시 'ALL' 을 사용하게 된다.
@Authorization(
userId = @AuthParam(
type = AuthParamType.HEADER_PARAM, value = "uuid"))
@RequestMapping(value = "/board/v1.0/{boardId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> getBoard(
@RequestHeader("uuid") String uuid,
@PathVariable("boardId") Integer boardId)
{
userId 가 Query Parameter 의 'uuid' 로 넘어온다고 가정하면 아래와 같다.
[Spring Client SDK @Authorization 이용 시]
public class BoardController {
@Autowired
private TCRoleClientFactory clientFactory;
// scopeId 는 생략 시 'ALL' 을 사용하게 된다.
@Authorization(
userId = @AuthParam(
type = AuthParamType.QUERY_PARAM, value = "uuid"))
@RequestMapping(value = "/board/v1.0/{boardId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> getBoard(
@PathVariable("boardId") Integer boardId,
@ModelAttribute("uuid") String uuid)
{
userId 가 고정된 값이라고 가정하면 아래와 같다.
[Spring Client SDK @Authorization 이용 시]
public class BoardController {
@Autowired
private TCRoleClientFactory clientFactory;
// scopeId 는 생략 시 'ALL' 을 사용하게 된다.
@Authorization(
userId = @AuthParam(
type = AuthParamType.STATIC, value = "12345678-1234-5678-1234-567812345678"))
@RequestMapping(value = "/board/v1.0/{boardId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> getBoard(
@PathVariable("boardId") Integer boardId,
@ModelAttribute("uuid") String uuid)
{
ROLE 의 데이터를 한번에 다운받거나, 한꺼번에 업로드를 하려면 Import / Export 기능을 이용한다.
[Excel 다운로드] 를 클릭하면 ROLE 에 등록된 모든 Resource, Role, Operation, Scope, User 정보가 담긴 Excel 파일을 다운 받을 수 있다. [Excel 업로드] 를 클릭하면 Excel 에 담긴 데이터를 ROLE 로 업로드 할 수 있다. 이때 사용되는 Excel 파일은 반드시 [Excel 다운로드] 를 클릭하여 다운받은 Excel 파일의 형식과 동일해야 한다.
[Excel 다운로드] 를 통해 받은 Excel 파일을 열고, Resource 시트로 이동 후, 필수 Cell 의 값을 채운다.
Resource 에 권한을 부여하고 싶다면 Operation ID, Role ID 항목을 작성한다. 동일 Resource 에 여러 권한을 한꺼번에 부여하고 싶다면, Operation ID 와 Role ID 를 제외한 나머지 항목은 모두 동일하게 작성한다.
[Excel 다운로드] 를 통해 받은 Excel 파일을 열고, Role 시트로 이동 후, 필수 Cell 의 값을 채운다.
Role 의 연관 관계를 구성하려면 Related ID 를 작성한다. 하나의 Role 에 여러 연관 관계를 구성하려면, ID 와 Description 항목을 동일하게 작성한다.
[Excel 다운로드] 를 통해 받은 Excel 파일을 열고, Role 혹은 Scope 시트로 이동 후, 필수 Cell 의 값을 채운다.
[Excel 다운로드] 를 통해 받은 Excel 파일을 열고, User 시트로 이동 후, 필수 Cell 의 값을 채운다.
User에 Role을 부여하고 싶다면, Scope ID와 Role ID 항목을 작성한다. 이때, User에게 부여된 Role에 유효 기간을 설정하고 싶다면, Valid Start Date, Valid End Date 항목을 작성한다. 하나의 User에 여러 Role을 부여하고 싶다면, ID와 Description 항목을 동일하게 작성한다.
ROLE 을 사용하는 다른 프로젝트가 있다면, 데이터 이관 기능을 이용해서 편리하게 데이터를 동기화 시킬 수 있다. 데이터 동기화의 대상은 Resource, Role, Operation 이며 Scope 과 User 는 동기화 되지 않는다.
우측 상단의 데이터 이관 버튼을 누르면 데이터를 이관 할 프로젝트 혹은 AppKey 를 입력하는 팝업이 노출된다.
데이터를 이관 할 프로젝트를 선택하거나, 직접 AppKey 를 입력 할 수 있다.
Client SDK 와 서버의 Cache 때문에 변경된 Resource 에 대한 권한 체크 결과가 즉시 반영이 안될 수 있다.
그럴 경우 우측 상단의 서버 설정 파업에서 명시적으로 캐쉬를 삭제 하여 해결 할 수 있다.
Resource Path의 마지막 '/' 에 대한 설정을 할 수 있다.
Non Identical Path로 설정한다면, '/board/v1.0/{boardId}' 와 '/board/v1.0/{boardId}/' 는 서로 다른 경로이다.
하지만, Identical Path로 설정한다면, '/board/v1.0/{boardId}' 와 '/board/v1.0/{boardId}/' 는 같은 경로이다.