# 共通ドキュメント

## ACL

### 概要

ACL(アクセス制御リスト)

- 構成要素
- 権限の評価
- ACLプロバイダー使用方法
- 実装済みのACLプロバイダー
- 新しいACLプロバイダーの実装
- ACLデータ編集機能

### 構成要素

ACLを構成する要素

- ロール(Role)
- リソース(Resource)
- 権限(Provilege)
- ルール

#### ロール(Role)

利用者の役割を表す。

ツリー構造を持つことでロールの階層関係を表現できる。

##### 例 - ブログシステム

- 管理者(administrator) - サイト全体の管理を行う。データの管理、バックアップなどが出来る。
- 登録ユーザー(registeredUser) - ブログ記事を作成できる。記事の編集削除、コメントの削除、自身のページのデザイン変更などが出来る。
- 匿名ユーザー(anonymousUser) - ブログ記事を読む事が出来る。記事に対してコメントを書くことが出来る。

##### 例 - 販売管理システム + 在庫管理システム

- 管理者(administrator) - システム全体の管理を行う。データの管理、バックアップなどが出来る。
- 登録ユーザー(registeredUser) - システムが使える
  - 販売担当グループ - 販売情報記録などを行う。在庫の照会、引き当ては出来るが在庫の追加などは出来ない
    - 販売担当 管理者 - 販売情報の管理を行う。
  - 在庫管理担当グループ - 在庫の追加、管理を行う。
    - 在庫管理 管理者 - 新商品の在庫作成などを行う。
  - 商品管理担当グループ - 商品の追加、管理を行う。
- 匿名ユーザー(anonymousUser) - システムの全てを使用できない

####

#### リソース(Resource)

使用される「物」を表す。

ツリー構造を持つことでリソースの階層関係を表現できる。

##### 例 - ブログシステム

- ブログシステム
  - 記事 - 登録ユーザーが投稿する記事
  - コメント - 記事に追加するコメント
  - ユーザーデザイン - ユーザー別のデザイン

##### 例 - 販売管理システム + 在庫管理システム

- 販売情報 - 販売先の情報、商品の売上etc...
  - 販売先情報
  - 売上データ
  - 統計情報
- 在庫 - 在庫商品の情報、在庫数、etc...
  - 商品在庫(在庫商品、在庫数)
- 商品 - このシステムが扱う商品に関する事
  - 商品
    - 基本単価
    - 値引率
  - 商品カテゴリー

#### 権限(Provilege)

どの様な操作が可能かを表す。

- 作成 に対する許可または拒否
- 読取 に対する許可または拒否
- 修正 に対する許可または拒否
- 削除 に対する許可または拒否

#### ルール

「どのロール」が「どのリソース」に対して「どの様な権限」を持つかを表現する。ロール、リソース、権限の組み合わせになる。

##### 例 - ブログシステム

リソース | ロール | 作成 | 読取 | 修正 | 削除 | 備考
--- | --- | --- | --- | --- | --- | ---
記事 | 管理者 | × | ○ | ○ | ○ | 管理者は記事を作成できないが、規約上まずい記事の修正、削除が可能。
記事 | 登録ユーザー | ○ | ○ | ○ | ○ | 登録ユーザーは記事に関する操作の全てが可能
記事 | 匿名ユーザー | × | ○ | × | × | 匿名ユーザーは記事を読むだけ
コメント | 管理者 | ○ | ○ | ○ | ○ | 管理者からのコメント、を追加できる。
コメント | 登録ユーザー | ○ | ○ | ○ | ○ | 登録ユーザーはコメントに対してあらゆる操作が可能
コメント | 匿名ユーザー | ○ | ○ | × | × | 匿名ユーザーはコメントを書けるが、修正削除は出来ない
ユーザーデザイン | 管理者 | × | ○ | ○ | ○ | 作成は出来ないが規約上問題のあるデザインの修正、削除が可能。
ユーザーデザイン | 登録ユーザー | ○ | ○ | ○ | ○ | 全てが可能
ユーザーデザイン | 匿名ユーザー | × | ○ | × | × | 匿名ユーザーは参照以外何も出来ない。

##### 例 - 販売管理システム + 在庫管理システム

リソース | ロール | 作成 | 読取 | 修正 | 削除 | 備考
--- | --- | --- | --- | --- | --- | ---
販売情報 | 販売担当グループ | ○ | ○ | ○ | ○ |
販売情報 | 在庫管理担当グループ | × | ○ | × | × |
販売情報 | 商品管理担当グループ | × | ○ | × | × |
販売先情報 | 販売担当グループ | × | ○ | × | × |
販売先情報 | 販売担当 管理者 | ○ | ○ | ○ | ○ |

####

### 権限の評価

ユーザーが所属するロール全てについて対象リソースと権限に対し権限ルールを下の順序で検索し、該当するものを採用する。複数のルールが該当する場合「許可」を優先する。何も見つからない場合、「拒否」する。

1. リソースとロールが一致するルール
2. リソースと親ロールが一致するルール
3. リソースの親とロールが一致するルール
4. リソースの親と親ロールが一致するルール

### ACLプロバイダー使用方法

CFW.Acl.AclFactoryからCFW.Acl.AccessControlのオブジェクトを受け取り使用する。

#### 例

    //最初にログインユーザーのロールを設定する。
    CFW.Auth.AuthProvider auth = CFW.Auth.AuthProviderFactory.GetInstance();
    //ログイン中のユーザー取得
    CFW.Auth.User user = auth.GetAuthenticated();

    //userに設定されているロールを取得
    List<CFW.Acl.AclRole> roles = user.Roles;

    //CFW.Acl.AccessControlのオブジェクトを取得
    CFW.Acl.AccessControl acl = CFW.Acl.AclFactory.GetInstance();

    //"blog"リソースの読取権限チェック
    bool result = acl.IsAllowed("blog",AclPrivilege.Read,roles);

    //"blog/entry"(ブログ記事)リソースの作成権限チェック
    result = acl.IsAllowed("blog",AclPrivilege.Create,roles);

### 実装済みのACLプロバイダー

- CFW.Acl.AccessControl
- CFW.Acl.DbAcl

#### CFW.Acl.AccessControl

基本となるACL機能の実装。ACLデータの読み込み機能はないのでAddResource(),AddRule()を使用してデータを追加して使用する。

#### CFW.Acl.DbAcl

（C#のみ)基本的なACLデータをデータベースから読み込むACL機能の実装。初回使用時にACLデータを全て読み込みstaticな領域に保持する。

##### テーブル定義

###### acl_roles

列名 | 型 | null | 主キー | 説明
--- | --- | --- | --- | ---
id | int | not null | ○ | このロールのID
name | varchar(100) | × | × | このロールの名称。ロール検索に使用する。
left_side | int | ○ | × | (ツリーデータ操作用)子要素範囲の左端
right_side | int | ○ | × | (ツリーデータ操作用)子要素範囲の右端
description | varchar(100) | ○ | × | 説明を記述

###### acl_resources

列名 | 型 | null | 主キー | 説明
--- | --- | --- | --- | ---
id | int | × | ○ | このリソースのID
name | varchar(100) | × | × | このリソースの名称。リソース検索に使用する。重複不可
left_side | int | ○ | × | (ツリーデータ操作用)子要素範囲の左端
right_side | int | ○ | × | (ツリーデータ操作用)子要素範囲の右端
description | varchar(100) | ○ | × | 説明を記述

###### acl_rules

列名 | 型 | null | 主キー | 説明
--- | --- | --- | --- | ---
id | int | × | ○ | このルールのID
resource_id | int | × | × | 対象リソースID
role_id | int | × | × | 対象ロールID
_create | int | × | × | 作成権限 0:拒否 1:許可
_read | int | × | × | 読取権限 0:拒否 1:許可
_update | int | × | × | 更新権限 0:拒否 1:許可
_delete | int | × | × | 削除権限 0:拒否 1:許可
description | varchar(100) | ○ | × | 説明を記述

### 新しいACLプロバイダーの実装

#### クラス定義

- CFW.Acl.AccessControlクラスを継承する。
- 必要なACLデータの読み込みロジックを追加する。
- IsAllowedの実行開始時にACLデータを読み込む必要があるなら、IsAllowedをオーバーライドし、基本クラスのIsAllowedを呼び出すようにする。

### ACLデータ編集機能

特に編集機能はないが、DbAclで使用するデータの編集は「AclEdit.exe」で可能