ポートレットでのJSRロールの使用

Liferay DXPのロールは、コンテンツへのアクセスを許可または制限するための主要な手段です。Liferayのアクセス許可システムを使用しないことにした場合は、ポートレット内のロールをポータルが提供するロールにマップするJSR168、286、および362の仕様が提供する基本システムを使用できます。

JSRポートレットのセキュリティ

ポートレットの仕様は、ポートレットがdocroot/WEB-INF/portlet.xml記述子で使用するロールを指定する手段を定義します。ただし、ロール名自体は標準化されていません。これらのポートレットをLiferay DXPで実行する場合、ポートレットで定義されたロール名をポータルに存在するロールにマップする必要があります。

たとえば、ゲストブックポートレットとゲストブック管理ポートレットの2つのポートレットを含むゲストブックプロジェクトを考えてみましょう。ゲストブックプロジェクトのportlet.xmlファイルのWARバージョンは、administratorguestpower-user、およびuserロールを参照します。

<?xml version="1.0"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0">

<portlet>
    <portlet-name>guestbook</portlet-name>
    <display-name>Guestbook</display-name>
    <portlet-class>
        com.liferay.docs.guestbook.portlet.GuestbookPortlet
    </portlet-class>
    <init-param>
        <name>view-template</name>
        <value>/html/guestbook/view.jsp</value>
    </init-param>
    <expiration-cache>0</expiration-cache>
    <supports>
        <mime-type>text/html</mime-type>
        <portlet-mode>view</portlet-mode>
    </supports>
    <portlet-info>
        <title>Guestbook</title>
        <short-title>Guestbook</short-title>
        <keywords></keywords>
    </portlet-info>
    <security-role-ref>
        <role-name>administrator</role-name>
    </security-role-ref>
    <security-role-ref>
        <role-name>guest</role-name>
    </security-role-ref>
    <security-role-ref>
        <role-name>power-user</role-name>
    </security-role-ref>
    <security-role-ref>
        <role-name>user</role-name>
    </security-role-ref>
</portlet>
<portlet>
    <portlet-name>guestbook-admin</portlet-name>
    <display-name>Guestbook Admin</display-name>
    <portlet-class>
        com.liferay.docs.guestbook.portlet.GuestbookAdminPortlet
    </portlet-class>
    <init-param>
        <name>view-template</name>
        <value>/html/guestbookadmin/view.jsp</value>
    </init-param>
    <expiration-cache>0</expiration-cache>
    <supports>
        <mime-type>text/html</mime-type>
        <portlet-mode>view</portlet-mode>
    </supports>
    <portlet-info>
        <title>Guestbook Admin</title>
        <short-title>Guestbook Admin</short-title>
        <keywords></keywords>
    </portlet-info>
    <security-role-ref>
        <role-name>administrator</role-name>
    </security-role-ref>
    <security-role-ref>
        <role-name>guest</role-name>
    </security-role-ref>
    <security-role-ref>
        <role-name>power-user</role-name>
    </security-role-ref>
    <security-role-ref>
        <role-name>user</role-name>
    </security-role-ref>
</portlet>

OSGiベースのguestbook-webモジュールプロジェクトは、ポートレットクラスの@Componentアノテーションに、XMLファイルを含まないロールを定義します。

@Component(
	immediate = true,
	property = {
		"com.liferay.portlet.display-category=category.sample",
		"com.liferay.portlet.instanceable=true",
		"javax.portlet.init-param.template-path=/",
		"javax.portlet.init-param.view-template=/view.jsp",
		"javax.portlet.name=" + GuestbookPortletKeys.Guestbook,
		"javax.portlet.resource-bundle=content.Language",
		"javax.portlet.security-role-ref=power-user,user"
	},
	service = Portlet.class
)

OSGiベースのMVCポートレットを使用している場合、JSR-362ロールをLiferayロールにマッピングする唯一の方法は、Liferay WARファイルのportlet.xmlに配置することであるため、Liferayのアクセス許可システムを使用する必要があります。

portlet.xmlロールは、作成済みの特定のロールにマップする必要があります。 これらのマッピングにより、Liferay DXPは、異なるポートレット(例:異なる開発者のポートレット)からの名前が同じロール間の競合を解決できます。

:ポートレットの<security-role-ref>要素で指定された各ロールには、ポートレットをページに追加する権限が付与されます。

ポータルロールへのポートレットロールのマッピング

ロールをLiferay DXPにマップするには、docroot/WEB-INF/liferay-portlet.xml Liferay固有の構成ファイルを使用する必要があります。例については、ゲストブックプロジェクトのliferay-portlet.xmlファイルで定義されているマッピングを参照してください。

<role-mapper>
    <role-name>administrator</role-name>
    <role-link>Administrator</role-link>
</role-mapper>
<role-mapper>
    <role-name>guest</role-name>
    <role-link>Guest</role-link>
</role-mapper>
<role-mapper>
    <role-name>power-user</role-name>
    <role-link>Power User</role-link>
</role-mapper>
<role-mapper>
    <role-name>user</role-name>
    <role-link>User</role-link>
</role-mapper>

ポートレット定義がロールpower-userを参照している場合、そのポートレットは、すでにLiferayのデータベースにあるパワーユーザーと呼ばれるLiferayロールにマップされます。

前述したように、ポータルのロール名は標準化されていません。上記のデフォルトのLiferay名とは異なるロール名でポートレットをデプロイする場合は、portal-ext.propertiesファイルのsystem.rolesプロパティに名前を追加する必要があります。

system.roles=my-role,your-role,our-role

これにより、ロールが誤って作成されるのを防ぎます。

ロールがポータルにマップされると、ポートレット仕様で定義されているメソッドを使用できます。

  • getRemoteUser()
  • isUserInRole()
  • getUserPrincipal()

たとえば、次のコードを使用して、現在のユーザーにpower-userロールがあるかどうかを確認できます。

if (renderRequest.isUserInRole("power-user")) {
    // ...
}

デフォルトでは、Liferayは組み込みポートレットでisUserInRole()メソッドを使用しません。Liferayは、独自のアクセス許可システムを直接使用して、よりきめ細かいセキュリティを実現します。ポートレットを他のポータルサーバーにデプロイする予定がない場合は、Liferayのアクセス許可システムを使用することをお勧めします。このシステムでは、アプリケーションの権限を調整するためのより堅牢な方法が提供されます。

関連トピック

Liferay Permissions

Asset Framework

Portlets

Understanding ServiceContext

« 権限の確認認証パイプライン »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています