Setting Permissions
default.xml : 어플리케이션의 권한을 정의하는 Configuration file. default라는 이름은 Liferay의 convention. (The heart of Liferay's permissions system이라 함..)
1.어플리케이션의 권한 정의하기
목표
Add Guestbook은 관리자만 할 수 있도록 허용한다
Guestbook tab은 관리자가 각 사용자에게 권한을 부여하고 허용된 자만 볼 수 있도록 필터링한다
Add Entry는 site member만 가능하도록 한다.
default.xml은 두 섹션으로 나뉜다.
Portlet permissions
various model permissions
<portlet-resource>
<portlet-name>guestbook</portlet-name>
<permissions>
<supports>
<action-key>ADD_TO_PAGE</action-key>
<action-key>CONFIGURATION</action-key>
<action-key>VIEW</action-key>
</supports>
<site-member-defaults>
<action-key>VIEW</action-key>
</site-member-defaults>
<guest-defaults>
<action-key>VIEW</action-key>
</guest-defaults>
<guest-unsupported />
</permissions>
</portlet-resource>
설명 : 3개의 portlet permission 정의 (ADD_TO_PAGE, CONFIGURATION, VIEW)
site member에게는 default로 VIEW permission을 설정. guest에게는 default로 VIEW permission 설정.
<model-resource>
<model-name>com.liferay.docs.guestbook.model</model-name>
<portlet-ref>
<portlet-name>guestbook</portlet-name>
</portlet-ref>
<permissions>
<supports>
<action-key>ADD_GUESTBOOK</action-key>
<action-key>ADD_ENTRY</action-key>
</supports>
<site-member-defaults>
<action-key>ADD_ENTRY</action-key>
</site-member-defaults>
<guest-defaults />
<guest-unsupported>
<action-key>ADD_GUESTBOOK</action-key>
<action-key>ADD_ENTRY</action-key>
</guest-unsupported>
</permissions>
</model-resource>
설명 : Global level에서의 default model permissions 정의
2개의 permissions 설정 (ADD_GUESTBOOK, ADD_ENTRY). Site member는 ADD_ENTRY 권한 부여. guest는 아무것도 못함.
하지만 guest는 portlet permission에서 VIEW를 부여했기 때문에 application을 볼 순 있다.
이후 global level이 아니라 Guestbook과 Entry에 대해서 Permission을 설정
2.각 Permissions의 자바 코드 작성하기
각 Permission은 Database에 저장되어야 한다. 그러므로 우리는 Service layer의 수정이 필요하다. 하지만 이것조차 Service Builder가 제공해준다! Back end에서는 permissions은 resources라 불린다. Liferay는 resources를 관리하기 위한 API를 제공한다. Service Builder를 이용하면 이 API가 구현된 class에 자동으로 injection된다.
// GuestbookLocalServiceImpl.java의 addGuestbook method
resourceLocalService.addResources(user.getCompanyId(), groupId, userId,
Guestbook.class.getName(), guestbookId, false, true, true);
위의 코드는 guestbook의 resource (permission)을 데이터베이스에 추가한다.
마지막 3개의 parameter 설명
1.첫 번째 parameter (false) : portlet action permission을 추가할 것인지에 대한 파라미터 (이것은 guestbook model에 대한 것이므로 false)
2.두 번째 parameter (true) : group permission을 추가할 것인지 (true인 경우, configuration file에서 설정했던 default permission이 설정됨)
3.세 번째 parameter (true) : guest permission을 추가할 것인지 (true인 경우, configuration file에서 설정했던 default permission이 설정됨)
3.Permissions helper classes 생성하기
helper class : check permissions을 쉽게 해주는 클래스
Permission (ex, ADD_ENTRY) \/ Resource (ex, Guestbook) \/ User 가 있을 때,
-> Determining whether a particular user has the permission to perform a particular task is a simple matter of checking whether the particular permission exists for a particular user on a particular entity.
헷갈리는 점 ; Model과 Entity를 구분지어서 퍼미션을 주고 있는데.. 서로 같은것이 아닌가?
답변 -> Model은 Table에 대한 접근권한, Entity는 Table 안의 개별 Record에 대한 접근권한이라고 생각하면 된다. Add Guestbook button에 대한 Permission을 줄 때에는 Model helper class를 사용한다. 그 이유는 Add guestbook은 테이블에 접근(guestbook을 추가하겠다는 접근)하는 것이기 때문이다. 하지만 User 별로 Tab을 보여주기\/안보여주기를 설정할 때에는 Entity helper class를 사용한다. 그 이유는 guestbook table의 각 record 별(tab을 구성하는 것이 record)로 해당 tab을 보여줄지 말지, 즉 record 단위로 Permission을 주는 것이기 때문이다. Entity helper class는 파라미터로 guestbookId를 받는다. 왜냐하면 그 guestbookID (primary Key)로 해당 table의 record에 접근해서 값을 가져와야 하기 때문이다.
PermissionChecker class method 살펴보기 (ex, hasPermission의 parameters)
- Guestbook tab에 설정한 것 (Using scriptlet) -> entity helper clas
if (GuestbookPermission.contains(
permissionChecker, curGuestbook.getGuestbookId(), "VIEW"))
- Add button, Add entry에 설정한 것 (Using JSTL library) -> ADD guestbook model helper class
<c:if test='<%= GuestbookModelPermission.contains(permissionChecker, scopeGroupId, "ADD_GUESTBOOK") %>'> </c:if>
<c:if test='<%= GuestbookPermission.contains(permissionChecker, guestbookId, "ADD_ENTRY") %>'>
5/22 Update
Portlet permission에 대한 정보
- 언제 사용하나