共通ドキュメント

ACL

概要

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

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

設定

設定項目

aclセクション名
providerClassACLプロバイダー実装クラス名
connectionACLプロバイダーが使用するデータ接続の接続名称

設定例

CFW.Acl.DbAclを使用してデータベース上のACLデータを扱う設定

<dataAccess defaultConnectionTimeout="15" defaultCommandTimeout="45">
    <add name="acl" 
         className="CFW.Database.SqlServer.SqlServerConnection,CFW.Database" 
         url="CRAFT-DACSERVER" 
         database="okada" 
         user="okada" 
         password="okada" 
         quoteStyle="0"
         commandTimeout="15" 
         connectionTimeout="15" 
         encryptUser="false" 
         option="" 
         />
  </dataAccess>
<acl
    providerClass="CFW.Acl.DbAcl,CFW.Acl"
    connection="acl"
    />

構成要素

ACLを構成する要素

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

ロール(Role)

利用者の役割を表す。

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

例 - ブログシステム
  • 管理者(administrator) - サイト全体の管理を行う。データの管理、バックアップなどが出来る。
  • 登録ユーザー(registeredUser) - ブログ記事を作成できる。記事の編集削除、コメントの削除、自身のページのデザイン変更などが出来る。
  • 匿名ユーザー(anonymousUser) - ブログ記事を読む事が出来る。記事に対してコメントを書くことが出来る。
例 - 販売管理システム + 在庫管理システム
  • 管理者(administrator) - システム全体の管理を行う。データの管理、バックアップなどが出来る。
  • 登録ユーザー(registeredUser) - システムが使える
    • 販売担当グループ - 販売情報記録などを行う。在庫の照会、引き当ては出来るが在庫の追加などは出来ない
      • 販売担当 管理者 - 販売情報の管理を行う。
    • 在庫管理担当グループ - 在庫の追加、管理を行う。
      • 在庫管理 管理者 - 新商品の在庫作成などを行う。
    • 商品管理担当グループ - 商品の追加、管理を行う。
  • 匿名ユーザー(anonymousUser) - システムの全てを使用できない

リソース(Resource)

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

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

例 - ブログシステム
  • ブログシステム
    • 記事 - 登録ユーザーが投稿する記事
    • コメント - 記事に追加するコメント
    • ユーザーデザイン - ユーザー別のデザイン
例 - 販売管理システム + 在庫管理システム
  • 販売情報 - 販売先の情報、商品の売上etc...
    • 販売先情報
    • 売上データ
    • 統計情報
  • 在庫 - 在庫商品の情報、在庫数、etc...
    • 商品在庫(在庫商品、在庫数)
  • 商品 - このシステムが扱う商品に関する事
    • 商品
      • 基本単価
      • 値引率
    • 商品カテゴリー

権限(Provilege)

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

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

ルール

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

例 - ブログシステム
リソースロール作成読取修正削除備考
記事管理者×管理者は記事を作成できないが、規約上まずい記事の修正、削除が可能。
記事登録ユーザー登録ユーザーは記事に関する操作の全てが可能
記事匿名ユーザー×××匿名ユーザーは記事を読むだけ
コメント管理者管理者からのコメント、を追加できる。
コメント登録ユーザー登録ユーザーはコメントに対してあらゆる操作が可能
コメント匿名ユーザー××匿名ユーザーはコメントを書けるが、修正削除は出来ない
ユーザーデザイン管理者×作成は出来ないが規約上問題のあるデザインの修正、削除が可能。
ユーザーデザイン登録ユーザー全てが可能
ユーザーデザイン匿名ユーザー×××匿名ユーザーは参照以外何も出来ない。
例 - 販売管理システム + 在庫管理システム
リソースロール作成読取修正削除備考
販売情報販売担当グループ
販売情報在庫管理担当グループ×××
販売情報商品管理担当グループ×××
販売先情報販売担当グループ×××
販売先情報販売担当 管理者

権限の評価

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

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

メッセージリソースの配置

上で生成した Message.Resources.dll(または別に生成したdll) を実行環境にコピーする。

asp.netであれば(asp.net仮想フォルダ)/bin、windowsアプリケーションであれば .exeと同じフォルダに配置。または(厳密名をつけた場合のみ)GACディレクトリ、app.config/system.runtime以下に設定したprobeパスに配置。

click onceアプリケーションの場合 Message.Resources.dllを マニフェストに含めなければならない。

ACLプロバイダー使用方法

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

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

//userに設定されているロールを取得
List 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

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

テーブル定義
acl_roles
列名null主キー説明
idintnot nullこのロールのID
namevarchar(100)×このロールの名称。ロール検索に使用する。
parent_idvarchar(100)××このロールの親のID
left_sidevarchar(100)×(ツリーデータ操作用)子要素範囲の左端
right_sidevarchar(100)×(ツリーデータ操作用)子要素範囲の右端
descriptionvarchar(100)×説明を記述
acl_resources
列名null主キー説明
idint×このリソースのID
namevarchar(100)×このリソースの名称。リソース検索に使用する。重複不可
parent_idvarchar(100)××このロールの親のID
left_sidevarchar(100)×(ツリーデータ操作用)子要素範囲の左端
right_sidevarchar(100)×(ツリーデータ操作用)子要素範囲の右端
descriptionvarchar(100)×説明を記述
acl_rules
列名null主キー説明
idint×このルールのID
resource_idint××対象リソースID
role_idint××対象ロールID
_createint××作成権限 0:拒否 1:許可
_readint××読取権限 0:拒否 1:許可
_updateint××更新権限 0:拒否 1:許可
_deleteint××削除権限 0:拒否 1:許可
descriptionvarchar(100)×説明を記述

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

クラス定義

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

ACLデータ編集機能

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