Pleasanter Tips: データ登録者がデータのアクセス権をコントロールできる

# はじめに
Pleasanterでは様々なデータのアクセス権限を設定する事ができます。サイト・レコード・項目へのアクセス権限の設定により、利用者でのデータ閲覧をコントロールできます。  
但し、登録者もしくはデータの状況により他社にアクセス権を付与する事はできません。  
今回はこの機能をサーバスクリプトと拡張SQLで実現してみます。

# 動作
今回のサンプルの説明をします。  
データは通常の登録ではデータ登録者（今回は管理者）しか見る事ができません。但し、ある条件（今回はチェック）によって他のグループがデータを見れるようにしました。  

## Youtube
https://youtu.be/HWl2diVzLS0

## SQLではどうしているか？
PleasanterのテーブルでPermissionsが有ります。このテーブルはレコードのアクセス権限を設定しています。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/5eb06c3f-1962-5e24-6d96-409d16ef9b5a.png)
ReferenceId:レコードのIDです。
DeptId/GroupId/UserId:権限を付与するIDを設定します。
PermissionType:権限のタイプを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/0dc05460-f3f5-3239-5715-990956ddfd41.png)
読取り：1  
作成：2（サイト）  
更新：4  
削除：8  
メール送信：16  
エクスポート：32（サイト）  
インポート：64（サイト）  
サイト管理：128（サイト）  
権限の管理：256（サイト） 
必要な権限を加算した数値をPermissionTypeに設定します。

# 設定方法
## 項目の設定
権限付与を決めるチェック項目を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/61f32c2f-adcc-6c8f-33f4-968de56eab08.png)
## サイトのアクセス権限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/88bf0b34-79db-a9c0-205f-df1b67c90b27.png)
データを登録するユーザー（管理者）と共に、全てのユーザーの設定をします。
全てのユーザーのアクセス権は全てチェックを外してください。これにより、サイトは閲覧できますがデータは表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/8ed8286b-f01f-e70f-dc82-0122e8abb9ee.png)

## レコードのアクセス権限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/944e56a4-c861-b5d7-c1c0-0594e2a977a8.png)
レコードのアクセス権限で担当者のみが編集・表示するように設定します。

## 拡張SQL
ChangePermission.json
※下記SiteIdListは利用者の環境に合わせて変更してください。
```
{
  "Name": "ChangePermission",
  "Description": "Permissionを変える",
  "Disabled": false,
  "SiteIdList": [99999],
  "Api": true
}
```
ChangePermission.json.sql(SQL-SERVER用)
```
DECLARE @ReferenceId INT={{Id}}
,@Creator INT=0
,@Updator INT=0
BEGIN
  IF NOT EXISTS (SELECT * FROM [dbo].[Permissions]
  WHERE [ReferenceId]=@ReferenceId AND [DeptId]=@DeptId AND [GroupId]=@GroupId AND [UserId]=@UserId)
  BEGIN
    INSERT INTO [dbo].[Permissions] VALUES(
      @ReferenceId,@DeptId,@GroupId,@UserId,1,@PermissionType,NULL,@Creator,@Updator,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP
    );
  END
  ELSE
  BEGIN
    UPDATE [dbo].[Permissions] 
	SET [PermissionType]=@PermissionType,[UpdatedTime]=CURRENT_TIMESTAMP
	WHERE [ReferenceId]=@ReferenceId AND [DeptId]=@DeptId AND [GroupId]=@GroupId AND [UserId]=@UserId;
  END
END
```

## サーバスクリプト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63349/b16b2225-3eee-b2c0-b0e5-59e521984222.png)
下記スクリプトの"DeptId":0,"GroupId":2, "UserId":0 は権限を付与する組織・グループ・ユーザーです。現在のスクリプトでは複数を考慮していません。  
サンプルはグループIDの2に権限を付与します。
```
context.Log(model.CheckA);
let ChkA=0;
if( model.CheckA == true ) ChkA=1;
extendedSql.ExecuteNonQuery('ChangePermission',`{"DeptId":0,"GroupId":2, "UserId":0, "PermissionType":${ChkA} }`);
```

# 注意事項
本スクリプトは特定条件の下での検証になります。参考にされる場合ご自身の環境で十分に検証を行った上でご使用ください。特に下記２点についてもご注意ください。
1. 今回のスクリプトは直接SQLを操作します。従って設定ミスをすると他にも影響するのでご注意ください。
1. サイト設定によりPermissionsのデータが操作された場合、動作におかしくなる場合が有ります。

# 終わりに
以前はview.Filtersで表示制限してみましたが、今回の作成してみてこっちの方が楽になる場合も有ると感じました。  
最近はデータ漏洩を防ぐ為にPermissionは重要なので、この辺りをコントロールできるスキルは必須ですね。

# おまけ
今回作成したスクリプトをPleasanterパッケージで無料で配布しています。  
作成が面倒だな～と思ったり、スクリプトはちょっと苦手だと思うからはPleasanterフリーサポートからダウンロードできるのでご活用ください。

https://iwate-cloud.com/support-site/