|
|
|
@ -1,8 +1,6 @@
|
|
|
|
|
権限付与 |
|
|
|
|
======== |
|
|
|
|
|
|
|
|
|
> Note|注意: この節はまだ執筆中です。 |
|
|
|
|
|
|
|
|
|
権限付与は、ユーザが何かをするのに十分な許可を有しているか否かを確認するプロセスです。 |
|
|
|
|
Yii は二つの権限付与の方法を提供しています。すなわち、アクセス制御フィルタ (ACF) と、ロールベースアクセス制御 (RBAC) です。 |
|
|
|
|
|
|
|
|
@ -10,13 +8,14 @@ Yii は二つの権限付与の方法を提供しています。すなわち、
|
|
|
|
|
アクセス制御フィルタ (ACF) |
|
|
|
|
-------------------------- |
|
|
|
|
|
|
|
|
|
アクセス制御フィルタ (ACF) は、何らかの単純なアクセス制御だけを必要とするアプリケーションで使うのに最も適した、単純な権限付与の方法です。 |
|
|
|
|
その名前が示すように、ACF は、コントローラまたはモジュールにビヘイビアとしてアタッチすることが出来るアクションフィルタです。 |
|
|
|
|
ACF は一連の [[yii\filters\AccessControl::rules|アクセス規則]] をチェックして、現在のユーザがリクエストしたアクションにアクセスすることが出来るかどうかを確認します。 |
|
|
|
|
アクセス制御フィルタ (ACF) は、[[yii\filters\AccessControl]] として実装される単純な権限付与の方法であり、何らかの単純なアクセス制御だけを必要とするアプリケーションで使うのに最も適したものです。 |
|
|
|
|
その名前が示すように、ACF は、コントローラまたはモジュールで使用することが出来るアクション [フィルタ](structure-filters.md) です。 |
|
|
|
|
ACF は、ユーザがアクションの実行をリクエストしたときに、一連の [[yii\filters\AccessControl::rules|アクセス規則]] をチェックして、現在のユーザがそのアクションにアクセスする許可を持つかどうかを決定します。 |
|
|
|
|
|
|
|
|
|
下記のコードは、[[yii\filters\AccessControl]] として実装された ACF の使い方を示すものです。 |
|
|
|
|
下記のコードは、`site` コントローラで ACF を使う方法を示すものです。 |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
use yii\web\Controller; |
|
|
|
|
use yii\filters\AccessControl; |
|
|
|
|
|
|
|
|
|
class SiteController extends Controller |
|
|
|
@ -49,28 +48,29 @@ class SiteController extends Controller
|
|
|
|
|
上記のコードにおいて、ACF は `site` コントローラにビヘイビアとしてアタッチされています。 |
|
|
|
|
これがアクションフィルタを使用する典型的な方法です。 |
|
|
|
|
`only` オプションは、ACF が `login`、`logout`、`signup` のアクションにのみ適用されるべきであることを指定しています。 |
|
|
|
|
`site` コントローラの他の全てのアクションには ACF の影響は及びません。 |
|
|
|
|
`rules` オプションは [[yii\filters\AccessRule|アクセス規則]] を指定するものであり、以下のように読むことが出来ます。 |
|
|
|
|
|
|
|
|
|
- 全てのゲストユーザ (まだ認証されていないユーザ) に、'login' と 'singup' のアクションにアクセスすることを許可します。 |
|
|
|
|
`roles` オプションに疑問符 `?` が含まれていますが、これは「ゲスト」として認識される特殊なトークンです。 |
|
|
|
|
`roles` オプションに疑問符 `?` が含まれていますが、これは「ゲスト」を表す特殊なトークンです。 |
|
|
|
|
- 認証されたユーザに、'logout' アクションにアクセスすることを許可します。 |
|
|
|
|
`@` という文字はもう一つの特殊なトークンで、認証されたユーザとして認識されるものです。 |
|
|
|
|
`@` という文字はもう一つの特殊なトークンで、「認証されたユーザ」を表すものです。 |
|
|
|
|
|
|
|
|
|
ACF が権限のチェックを実行するときには、規則を一つずつ上から下へ、適用されるものを見つけるまで調べます。 |
|
|
|
|
そして、適用される規則の `allow` の値が、ユーザが権限を有するか否かを判断するのに使われます。 |
|
|
|
|
適用される規則が一つもなかった場合は、ユーザが権限をもたないことを意味し、ACF はアクションの継続を中止します。 |
|
|
|
|
|
|
|
|
|
デフォルトでは、ユーザが現在のアクションにアクセスする権限を持っていないと判定した場合は、ACF は以下のことだけを行います。 |
|
|
|
|
ユーザが現在のアクションにアクセスする権限を持っていないと判定した場合は、デフォルトでは、ACF は以下の手段を取ります。 |
|
|
|
|
|
|
|
|
|
* ユーザがゲストである場合は、[[yii\web\User::loginRequired()]] を呼び出します。 |
|
|
|
|
このメソッドで、ブラウザをログインページにリダイレクトすることが出来ます。 |
|
|
|
|
* ユーザがゲストである場合は、[[yii\web\User::loginRequired()]] を呼び出して、ユーザのブラウザをログインページにリダイレクトします。 |
|
|
|
|
* ユーザが既に認証されている場合は、[[yii\web\ForbiddenHttpException]] を投げます。 |
|
|
|
|
|
|
|
|
|
この動作は、[[yii\filters\AccessControl::denyCallback]] プロパティを構成することによって、カスタマイズすることが出来ます。 |
|
|
|
|
この動作は、次のように、[[yii\filters\AccessControl::denyCallback]] プロパティを構成することによって、カスタマイズすることが出来ます。 |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
[ |
|
|
|
|
'class' => AccessControl::className(), |
|
|
|
|
... |
|
|
|
|
'denyCallback' => function ($rule, $action) { |
|
|
|
|
throw new \Exception('このページにアクセスする権限がありません。'); |
|
|
|
|
} |
|
|
|
@ -100,7 +100,7 @@ ACF が権限のチェックを実行するときには、規則を一つずつ
|
|
|
|
|
- `?`: ゲストユーザ (まだ認証されていないユーザ) を意味します。 |
|
|
|
|
- `@`: 認証されたユーザを意味します。 |
|
|
|
|
|
|
|
|
|
その他のロール名を使う場合には、RBAC (次の節で説明します) が必要とされ、判断のために [[yii\web\User::can()]] が呼び出されます。 |
|
|
|
|
その他のロール名を使うと、[[yii\web\User::can()]] の呼び出しが惹起されますが、そのためには、RBAC (次の節で説明します) を有効にする必要があります。 |
|
|
|
|
このオプションが空であるか指定されていない場合は、規則が全てのロールに適用されることを意味します。 |
|
|
|
|
|
|
|
|
|
* [[yii\filters\AccessRule::ips|ips]]: どの [[yii\web\Request::userIP|クライアントの IP アドレス]] にこの規則が適用されるかを指定します。 |
|
|
|
@ -151,8 +151,7 @@ class SiteController extends Controller
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ロールベースアクセス制御 (RBAC) |
|
|
|
|
--------------------------------------- |
|
|
|
|
## ロールベースアクセス制御 (RBAC) <span id="rbac"></span> |
|
|
|
|
|
|
|
|
|
ロールベースアクセス制御 (RBAC) は、単純でありながら強力な集中型のアクセス制御を提供します。 |
|
|
|
|
RBAC と他のもっと伝統的なアクセス制御スキーマとの比較に関する詳細については、[Wiki 記事](http://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E5%BE%A1) を参照してください。 |
|
|
|
@ -166,7 +165,7 @@ RBAC を使用することには、二つの作業が含まれます。
|
|
|
|
|
説明を容易にするために、まず、いくつかの基本的な RBAC の概念を導入します。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 基本的な概念 |
|
|
|
|
### 基本的な概念 <span id="basic-concepts"></span> |
|
|
|
|
|
|
|
|
|
ロール (役割) は、*許可* (例えば、記事を作成する、記事を更新するなど) のコレクションです。 |
|
|
|
|
一つのロールを一人または複数のユーザに割り当てることが出来ます。 |
|
|
|
@ -183,14 +182,14 @@ Yii は、一般的な *半順序* 階層を実装していますが、これは
|
|
|
|
|
ロールは許可を含むことが出来ますが、許可はロールを含むことが出来ません。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### RBAC マネージャを構成する |
|
|
|
|
### RBAC を構成する <span id="configuring-rbac"></span> |
|
|
|
|
|
|
|
|
|
権限付与データを定義してアクセスチェックを実行する前に、[[yii\base\Application::authManager|authManager]] アプリケーションコンポーネントを構成する必要があります。 |
|
|
|
|
Yii は二種類の権限付与マネージャを提供しています。すなわち、[[yii\rbac\PhpManager]] と [[yii\rbac\DbManager]] です。 |
|
|
|
|
前者は権限付与データを保存するのに PHP スクリプトファイルを使いますが、後者は権限付与データをデータベースに保存します。 |
|
|
|
|
あなたのアプリケーションが非常に動的なロールと許可の管理を必要とするのでなければ、前者を使うことを考慮するのが良いでしょう。 |
|
|
|
|
|
|
|
|
|
#### authManager を `PhpManager` で構成する |
|
|
|
|
#### `PhpManager` を使用する <span id="using-php-manager"></span> |
|
|
|
|
|
|
|
|
|
次のコードは、アプリケーションの構成情報で [[yii\rbac\PhpManager]] クラスを使って `authManager` を構成する方法を示すものです。 |
|
|
|
|
|
|
|
|
@ -208,10 +207,10 @@ return [
|
|
|
|
|
|
|
|
|
|
これで `authManager` は `\Yii::$app->authManager` によってアクセスすることが出来るようになります。 |
|
|
|
|
|
|
|
|
|
> Tip|ヒント: デフォルトでは、[[yii\rbac\PhpManager]] は RBAC データを `@app/rbac/` ディレクトリの下のファイルに保存します。 |
|
|
|
|
権限の階層をオンラインで変更する必要がある場合は、必ず、ウェブサーバのプロセスがこのディレクトリとその中の全てのファイルに対する書き込み権限を有するようにしてください。 |
|
|
|
|
デフォルトでは、[[yii\rbac\PhpManager]] は RBAC データを `@app/rbac/` ディレクトリの下のファイルに保存します。 |
|
|
|
|
権限の階層をオンラインで変更する必要がある場合は、必ず、ウェブサーバのプロセスがこのディレクトリとその中の全てのファイルに対する書き込み権限を有するようにしてください。 |
|
|
|
|
|
|
|
|
|
#### authManager を `DbManager` で構成する |
|
|
|
|
#### `DbManager` を使用する <span id="using-db-manager"></span> |
|
|
|
|
|
|
|
|
|
次のコードは、アプリケーションの構成情報で [[yii\rbac\DbManager]] クラスを使って `authManager` を構成する方法を示すものです。 |
|
|
|
|
|
|
|
|
@ -243,7 +242,7 @@ return [
|
|
|
|
|
これで `authManager` は `\Yii::$app->authManager` によってアクセスすることが出来るようになります。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 権限付与データを構築する |
|
|
|
|
### 権限付与データを構築する <span id="generating-rbac-data"></span> |
|
|
|
|
|
|
|
|
|
権限付与データを構築する作業は、つまるところ、以下のタスクに他なりません。 |
|
|
|
|
|
|
|
|
@ -335,7 +334,7 @@ public function signup()
|
|
|
|
|
動的に更新される権限付与データを持つ複雑なアクセス制御を必要とするアプリケーションについては、`authManager` が提供する API を使って、特別なユーザインタフェイス (つまり、管理パネル) を開発する必要があるでしょう。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 規則を使う |
|
|
|
|
### 規則を使う <span id="using-rules"></span> |
|
|
|
|
|
|
|
|
|
既に述べたように、規則がロールと許可に制約を追加します。 |
|
|
|
|
規則は [[yii\rbac\Rule]] を拡張したクラスであり、[[yii\rbac\Rule::execute()|execute()]] メソッドを実装しなければなりません。 |
|
|
|
@ -394,7 +393,7 @@ $auth->addChild($author, $updateOwnPost);
|
|
|
|
|
|
|
|
|
|
![規則を持つ RBAC 階層](images/rbac-hierarchy-2.png "規則を持つ RBAC 階層") |
|
|
|
|
|
|
|
|
|
### アクセスチェック |
|
|
|
|
### アクセスチェック <span id="access-check"></span> |
|
|
|
|
|
|
|
|
|
権限付与データが準備できてしまえば、アクセスチェックは [[yii\rbac\ManagerInterface::checkAccess()]] メソッドを呼ぶだけの簡単な仕事です。 |
|
|
|
|
たいていのアクセスチェックは現在のユーザに関するものですから、Yii は、便利なように、[[yii\web\User::can()]] というショートカットメソッドを提供しています。 |
|
|
|
@ -406,7 +405,7 @@ if (\Yii::$app->user->can('createPost')) {
|
|
|
|
|
} |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
現在のユーザが ID=1 である Jane であるとすると、`createPost` からスタートして `Jane` まで到達しようと試みます。 |
|
|
|
|
現在のユーザが `ID=1` である Jane であるとすると、`createPost` からスタートして `Jane` まで到達しようと試みます。 |
|
|
|
|
|
|
|
|
|
![アクセスチェック](images/rbac-access-check-1.png "アクセスチェック") |
|
|
|
|
|
|
|
|
@ -431,7 +430,7 @@ Jane の場合は、彼女が管理者であるため、少し簡単になりま
|
|
|
|
|
|
|
|
|
|
![アクセスチェック](images/rbac-access-check-3.png "アクセスチェック") |
|
|
|
|
|
|
|
|
|
### デフォルトロールを使う |
|
|
|
|
### デフォルトロールを使う <span id="using-default-roles"></span> |
|
|
|
|
|
|
|
|
|
デフォルトロールというのは、*全て* のユーザに *黙示的* に割り当てられるロールです。 |
|
|
|
|
[[yii\rbac\ManagerInterface::assign()]] を呼び出す必要はなく、権限付与データはその割り当て情報を含みません。 |
|
|
|
|