Drupal 閲覧・編集権限を既存モジュールで設定する

##概要

###バージョン

本記事は、Drupal7の実施で実施した内容です。

###説明する内容

以下の制御を既存モジュールと管理画面の設定のみで実現します。


・権限によってViewsモジュールを利用した記事一覧の表示制御方法
・権限によって記事の登録・編集可否の制御方法


###権限

今回は4パターンを想定して説明します。

すべてログイン済みのユーザーとします。

| No  | 権限                                                                           | テストユーザー|
|:----|:------------------------------------------------------ |:------------:|
| 1    | 全ての記事の閲覧、編集ができる。                                        | user01      |
| 2    | 全ての記事の閲覧ができる。                                                | user02      |
| 3    | 所属するグループユーザーが投稿した記事の閲覧・編集ができる。     | user03      |
| 4    | 所属するグループユーザーが投稿した記事の閲覧ができる。             | user04      |

テストユーザーについては、
説明の中でそれぞれ、該当の権限を付与したユーザーを用意します。

![01_権限前提.png](https://qiita-image-store.s3.amazonaws.com/0/41498/69903451-b32c-ab8c-a287-0bafdbd1d7fd.png)

<!-- TODO 画像 権限説明図-->

##手順

###モジュールの準備

今回必須のモジュールです。

* Views

* Content Access

* Organic groups

このモジュールが必要としている他のモジュールも導入、有効にします。


###記事一覧の作成

Viewsモジュールでサクッと記事一覧を作ります。

今回の設定はこちら

![03_views設定.png](https://qiita-image-store.s3.amazonaws.com/0/41498/0d83ef33-4c56-e15c-9d1d-cde26dc4e487.png)


1つだけ投稿した直後の記事一覧画面です。

![03_記事一覧.png](https://qiita-image-store.s3.amazonaws.com/0/41498/575a2a0b-3eaa-1ea5-b557-75c6c633e35f.png)


###全記事に対する制御

まず、2つの権限制御について説明します。

| No  | 権限                                                                           | テストユーザー|
|:----|:------------------------------------------------------ |:------------:|
| 1    | 全ての記事の閲覧、編集ができる。                                        | user01      |
| 2    | 全ての記事の閲覧ができる。                                                | user02      |


####権限と役割

ユーザーの役割を2つ追加します。

* editor
* viewer

editorが全ての記事の閲覧、編集ができる user01、
viewerが全ての記事の閲覧ができる user02 と付与するつもりで進めます。


![02_役割.png](https://qiita-image-store.s3.amazonaws.com/0/41498/445fce13-dae9-6863-d35e-e723b0000aa3.png)

それぞれの有効にした権限は以下の通りです。

| viewerで有効にした権限 |
|:--------------------------|
| Access administration menu |
| コンテンツの概要ページを確認 |
| 公開されたコンテンツを読む |
| 管理ページとヘルプを利用 |



| editorで有効にした権限 |
|:--------------------------|
| Access administration menu |
| テキストフォーマット Filtered HTML を使用 |
| コンテンツの概要ページを確認 |
| 公開されたコンテンツを読む |
| 管理ページとヘルプを利用 |
| コンテンツアクセス制御を迂回する |
 ※上記以外にnodeのコンテンツタイプ=記事の編集と削除の権限も有効にしています。

####ユーザーの準備
user01とuser02を準備します。
user01には権限:editor
user02には権限:viewerを付与しました。

![06_ユーザー一覧.png](https://qiita-image-store.s3.amazonaws.com/0/41498/6807da18-7212-1f7f-c9f4-b1265e92de9c.png)



####Content Accessモジュールの設定
メニューから
サイト構築 > コンテンツタイプ > 記事 のページを表示します。
Content Accessモジュールが有効になっていると、Access controlのタブが表示されます。
Access controlタブのページを表示して、ユーザーの権限ごとに設定します。

設定の一例がこちら

![05_アクセスコントロール.png](https://qiita-image-store.s3.amazonaws.com/0/41498/26699916-5f1c-8dc1-7990-5296afb4a7eb.png)

editorにはすべての記事(article)に対して閲覧、編集、削除出来るように、
一方でviewerには、閲覧権限のみできるように設定しました。
最後のSubmitボタンのクリックで設定完了です。


####結果

ここまでの設定によりuser01とuser02で、
記事一覧の表示内容が変わっています。

---------------------------

**user01(全ての記事の閲覧、編集ができる。 )**

こちらは、編集権限があるので、記事の行に編集ボタンが表示されます。

![07user01でみた記事一覧.png](https://qiita-image-store.s3.amazonaws.com/0/41498/20f26fd0-cd2e-8d76-126e-b604e7ce46ff.png)

記事詳細でも編集タブが表示されます。

![08user01でみた記事.png](https://qiita-image-store.s3.amazonaws.com/0/41498/0aded382-ca27-43b8-93af-4b4c30f300cb.png)

---------------------------

**user02(全ての記事の閲覧ができる。 )**

こちらは、閲覧権限しかないので、編集ボタンが表示されません。

![09user02でみた記事一覧.png](https://qiita-image-store.s3.amazonaws.com/0/41498/495a22d2-b930-d151-17d6-e40933bddff1.png)


記事詳細に編集タブは無しです。

![10user02でみた記事.png](https://qiita-image-store.s3.amazonaws.com/0/41498/3509da27-5ce6-f70d-aee1-c11d234c205c.png)

###グループによる制御

ここからユーザーが所属するグループを追加して、
所属ごとの表示・編集制御を行います。

| No  | 権限                                                                           | テストユーザー|
|:----|:------------------------------------------------------ |:------------:|
| 3    | 所属するグループの記事の閲覧・編集ができる。     | user03      |
| 4    | 所属するグループの記事の閲覧ができる。             | user04      |


####準備
1.グループに所属するユーザー用に、別の権限・役割を当てておきます。

* group member


![15_グループ用役割追加.png](https://qiita-image-store.s3.amazonaws.com/0/41498/b812030e-ef6d-508d-c01a-54adb5879910.png)

権限の内容は「editor」と同様に設定します。
※ コンテンツアクセス制御を迂回するはチェックを外してください。

2. Content Accessモジュールの設定

Content Accessの設定で
「group member」にも「editor」と同じ権限を付与します。
(権限の制限はグループの設定で絞り込んでいきます)

####グループの作成と設定(Organic groupsモジュールの設定)

ここからOrganic groupsモジュールを利用していきます。

まずコンテンツタイプ「グループ」を追加します。
(サイト構築 > コンテンツタイプ > コンテンツタイプの追加)

ポイントは、Organic groupsの設定を有効にすることです。
図の赤枠の箇所です。

![14_グループ作成.png](https://qiita-image-store.s3.amazonaws.com/0/41498/ce709122-2fed-24d7-8d72-cd84d2a85c0e.png)

これでノード(コンテンツタイプ=group)とOrganic groupsが紐づきました。

コンテンツタイプ=groupでグループ（Aグループ,Bグループ）を作成します。

![17_グループ登録.png](https://qiita-image-store.s3.amazonaws.com/0/41498/656a9533-8bfa-45c2-b64a-9cbfe12e9411.png)


####グループとユーザー/グループと記事の紐付

環境設定 > Organic groups > OG field settings の画面を表示して、
ユーザー <-> グループ
記事 <-> グループ

この2つの関連性を登録します。

1. Bundles = 記事、Fields = Groups audience で登録

2. Bundles = ユーザー、Fields = Groups audience で登録

登録例↓
![15_ユーザーとグループ.png](https://qiita-image-store.s3.amazonaws.com/0/41498/8baad10f-45a1-6028-c9f7-577265e5d964.png)

![15_ユーザーとグループ紐付後.png](https://qiita-image-store.s3.amazonaws.com/0/41498/ac63426f-ab37-5ec1-8c51-d8040a95b7c4.png)


2つとも登録した結果↓

![20_フィールド設定.png](https://qiita-image-store.s3.amazonaws.com/0/41498/d97fbd3e-6377-4249-86f5-888158e9dc58.png)



####カスタムフィールド追加

**ユーザーのカスタムフィールドにグループを追加します。**
(管理 > 環境設定 > ユーザー > アカウントの設定 > フィールドの管理)

![16_ユーザーとグループ.png](https://qiita-image-store.s3.amazonaws.com/0/41498/bbe545a1-5d51-39e4-d39b-5073f5738173.png)

ENTITY SELECTION は、先ほど追加したグループを選択します。
(編集の画面で表示されます)
この設定でユーザー登録・編集時にグループの紐付が出来るようになります。

ユーザー登録画面の一部
![18_ユーザー登録にグループが追加された.png](https://qiita-image-store.s3.amazonaws.com/0/41498/5acc9ad1-4a59-9354-bf92-38ff0b0e234c.png)

**記事も同様にカスタムフィールドを追加します。**

この設定で記事登録時にグループが指定できるようになります。


####Organic groupsでの権限設定

グループに所属するユーザーに対して、
通常の権限・役割とは別に権限を上書きで与えることができます。
この設定を行います。

環境設定 > Organic groups > OG roles overview の画面で、登録した「グループ」行の編集をクリック。

この画面で2つのグループ内権限を追加します。

* editor member
* viewer member

設定内容は、下記の画像を見てください。

![34_グループ内権限.png](https://qiita-image-store.s3.amazonaws.com/0/41498/cdb326a4-30c4-2706-127a-41cef3e1f9f6.png)


editor memberには、記事の閲覧、編集ができるように、
viewer memberには、記事の閲覧ができるように権限を付与します。
また、NON-MENBERにもコンテンツ内の表示権限は与えてあげてください。

これが完了したら、ユーザーにグループ内権限を付与します。

グループのコンテンツの編集画面にグループタブが登場しています。

![21_グループの編集.png](https://qiita-image-store.s3.amazonaws.com/0/41498/f096560a-127e-552b-3ac4-8f08f2e1663b.png)

ユーザーの画面で、権限が追加できます。

user03にはeditor memberを、user04にはviewer memberを付与します。


####記事の投稿
テストデータとして、Aグループの記事とBグループ記事を投稿します。

![22_投稿追加.png](https://qiita-image-store.s3.amazonaws.com/0/41498/b40de0dd-b45c-7f10-03ad-a95fc6844161.png)

####記事一覧(Views)の追加設定

この項目で最後です。
今までの設定もほぼOKなのですが、
記事一覧でグループ設定のない記事がuser03とuser04に見えてしまいます。
そこで、記事一覧のViews設定を追加します。


AdvancedのCONTEXTUAL FILTERSで、
記事に追加したグループのカスタムフィールドを選択し、次の画面へ。
![23_Views設定追加.png](https://qiita-image-store.s3.amazonaws.com/0/41498/bae8b5d0-af41-9099-1c86-32bb90959672.png)

記事のグループ値を元に絞り込みをします。

![24_PHPコード.png](https://qiita-image-store.s3.amazonaws.com/0/41498/c3e8eb35-235d-a6e7-403b-f4a7d763565d.png)

Provide default value でPHPコードを選択して、以下のコードを記入。

```lang:PHP

global $user;
if(in_array('group member', $user->roles)){
    $r =  og_get_groups_by_user($user);
    return empty($r['node'])? '' : implode(',',array_values ($r['node']));
}
return 'all';


```

画面の下の方の「続き」リンクを開いて、
Allow multiple valuesにもチェックを付ける。

![24_続き.png](https://qiita-image-store.s3.amazonaws.com/0/41498/daaaa742-0b7c-6974-befc-3db2fa3919ba.png)


この設定を保存すると・・・記事のグループに所属する人だけ、グループの絞り込み条件がつくので
自グループの記事だけ表示されるようになります。

####結果
user01～user04まで

**user01(全ての記事の閲覧、編集ができる。 )**

![30_user01.png](https://qiita-image-store.s3.amazonaws.com/0/41498/4db10be0-abf8-dc5e-a7d3-c455748b6ab6.png)

**user02(全ての記事の閲覧ができる。 )**

![31_user02.png](https://qiita-image-store.s3.amazonaws.com/0/41498/edcb6413-6c7d-eb51-1736-3e2ea1fef833.png)

**user03(所属するグループの記事の閲覧・編集ができる。 )**

![32_user03.png](https://qiita-image-store.s3.amazonaws.com/0/41498/c898bca7-6782-a509-ba17-1e1187054ae3.png)

**user04(所属するグループの記事の閲覧ができる。)**

![33_user04.png](https://qiita-image-store.s3.amazonaws.com/0/41498/48a390a2-f6f8-9d9b-c06a-6202dfce6d47.png)

長かったですね！
でも覚えれば全然時間はかからないと思います。(たぶん！)
もっと簡単な方法があったらた教えてください。
お疲れ様でした。