2014-07-09 3 views
5

HATEOAS를 구현하는 여러 RESTful API와 직접 대화하는 단일 페이지 응용 프로그램에서 권한을 처리하는 올바른 방법을 알아 내려고하고 있습니다. 예를 들어HATEOAS를 구현하는 나머지 API에 대한 사용 권한

: ". 내가 시작하고 작업을 일시 중지하지만 그들을 막을 수 없습니다 볼 수 있습니다 내 응용 프로그램의 사용자로서"

/작업/{ID} GET과 PUT 허용합니다

기본이되는 나머지 API는 다음과 같은 자원이 있습니다. 가져 오기는 작업 모델을 반환하고 PUT는 형태로 요청 본문 등의 작업 모델을 허용합니다

{ 
"_links" : { 
    "self" : "/jobs/12345678" 
} 
"id" : 12345678, 
"description" : "foo job", 
"state" : "STOPPED" 
} 

허용 작업 상태가 될 수 있습니다 : 휴면 | 달리기 | 일시 중지됨 | 멈췄다. ,

시작, 일시 정지를

정지 ... 만 사용자의 권한에 로그인을 기반으로 디스플레이 :

요구 사항은 UI에 나는 버튼이 있어야했다.

API 관점에서 볼 때 서버의 기본 로직으로 모든 것이 작동하므로 요청이있을 때 사용자가 상태를 STOPPED 상태로 업데이트 할 수 없습니다 (401이 반환 될 수 있음).

사용자의 권한을 앱/UI에 알리는 가장 좋은 방법은 무엇입니까? 그러면 사용자가 조치 권한이없는 버튼을 숨길 수 있습니까?

{ 
"_links" : { 
    "self" : "/permissions", 
    "jobs" : "/jobs" 
} 
"permissions" : { 
    "job" : ["UPDATE", "DELETE"], 
    "job-updates" : ["START", "PAUSE"] 
    } 
} 

또는 권한이 어쩌면 뭔가처럼 HATEOS 링크에서 API 변화를 반영해야 있도록 :

{ 
"_links" : { 
    "self" : "/jobs/12345678", 
    "start" : "/jobs/12345678/state?to=RUNNING", 
    "pause" : "/jobs/12345678/state?to=PAUSED", 
} 
"id" : 12345678, 
"description" : "foo job", 
"state" : "DORMANT" 
} 

이 API는 사용 권한 목록 같은 어쩌면 무언가를 제공해야 아니면 완전히 다른 방식으로해야합니까?

내가 대답을 제시의 다음 문서를 발견했습니다

UPDATE : https://softwareengineering.stackexchange.com/questions/215975/how-to-handle-fine-grained-field-based-acl-permissions-in-a-restful-service

답변

5

나는 후자로 갈 것 : 링크가 존재하는 기반으로 권한을 의미한다.

링크가 없으면 사용자는 리소스에 액세스하거나 작업을 수행 할 수 없습니다. 그렇다면 그렇게 할 수 있습니다. 그것이 간단하고 깨끗하고 프론트 엔드 코드의 재량에 거의 미치지 않기 때문에 내가 할 수있는 일입니다. 감 결합, 요. 당신이 경우

또는 각 응답에있는 모든 링크를 포함하지만, 명시 적으로 그것을 확장 할 수 허용하고 당신이 당신의 연결을 작성하는 등 HAL 같은 형식을 사용하는 경우,되지 않는되어있는 지정하려면 다음과 같은 각 링크의 국기 :

{ 
    "_links" : { 
     "self" : { 
      "href":"/jobs/12345678", 
      "allowed":false 
     }, 
     "start" : { 
      "href":"/jobs/12345678/state?to=RUNNING", 
      "allowed":false 
     }, 
     "pause" : { 
      "href":"/jobs/12345678/state?to=PAUSED", 
      "allowed":false 
     } 
    }, 
    "id" : 12345678, 
    "description" : "foo job", 
    "state" : "DORMANT" 
} 
+0

국기의 팬이 아니지만 def는 대답에 동의합니다. 이용 가능한 행동을 나타내는 링크를 제공하는 것이 HATEOAS의 주요 이점 중 하나입니다. 웹 페이지와 마찬가지로 항목을 삭제할 수없는 경우 삭제 버튼이 없습니다. –

+0

나는 깃발 팬이 아닙니다. 나는 대부분의 경우 깃발이 적절하지 않다고 생각하지만 어떤 경우에는 왜 가능할 수 있는지를 알 수 있습니다. 때로는 처리 상태로 인해 작업을 수행 할 수없는 경우가 있습니다. 그러나 링크 (본문의 특성과 같은)를 포함하고 링크가 실제로 사용되는 경우 모든 요청에 ​​적절한 상태 코드를 반환하는 동안 이러한 종류의 것을 나타낼 수있는 다른 방법이 있습니다. – basicallydan

1

나는 후자와 함께 갈 것이다.내가 이전 버전을 좋아하지 않는 이유는 클라이언트가 액세스 권한을 가진 리소스와 액세스 할 수있는 리소스 간의 매핑을 알아 내기 위해 클라이언트에 대한 추가 작업을 생성하기 때문입니다. hateoas를 사용하고 관계 유형이 있는지 확인하는 경우이 매핑은 서버에서 수행됩니다. 또한 우 리가 클라이언트를 깨지 않고 변경 될 수 있음을 의미합니다.

는 최근이 지역에이 블로그 포스트를 작성했습니다 : 당신은 상태 전이 하이퍼 미디어를 제공하는 형태가 아닌 링크를 사용한다

https://www.opencredo.com/2015/08/12/designing-rest-api-fine-grained-resources-hateoas-hal/

+0

어떻게 접근 방식에서 허용 된 작업을 정의합니까? PUT 등? – Dejell

0

. 미디어 유형에 양식을 제공 할 수없는 경우 양식 (예 : XHTML)을 지원하는 다른 미디어 유형을 사용하는 URI에 대한 링크를 제공하십시오.

IANA는이 목적으로 create-form, edit-formdelete-form에 대해 link relations을 갖습니다.

또한 실제 링크 관계로 startpause을 사용하지 마십시오. 직접 정의하는 경우에는 URI (선호 적으로 HTTP URL이지만 제어 할 수있는 URI이면 충분합니다.) 여야합니다. start은 사용하는 것과 완전히 다른 의미를 가지고 있으며 pause은 정의되지 않았습니다.

관련 문제