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에 대한 정보

  • 언제 사용하나

results matching ""

    No results matching ""