初めに
前回はこちらの記事で、Flowにおける認証処理(Authentication)について書きました。
今回はFlowで認可処理(Authorization)を実装してみましょう。
注意
この記事は前回の記事の続きになっています。
まだご覧になってない方はそちらからご覧ください。
実際に作ってみる
早速作ってみましょう。
前回はログインしたらTOP画面に遷移するという処理を実装しましたが、ログインしてなくても遷移が可能になっていました。
今回は、TOP画面をログイン状態でないと開けないという設定を追加してみます。
プロジェクト構成は以下です。
Packages/
├ Application/
| └ Neos.Welcome/
| ├ Classes/
| | └ Controller/
| | ├ AccountController.php
| | ├ LoginController.php
| | └ TopController.php
| |
| ├ Configration/
| | ├ Policy.yaml
| | └ Settings.yaml
| |
| └ Resources/
| └ Private/
| └ Templates/
| ├ Login/
| | └ index.html
| └ Top/
| └ index.html
|
├ Framework/
└ Libraries/
Policy.yaml
前回作成したPolicy.yamlに記載を追加します。
privilegeTargets:
'Neos\Flow\Security\Authorization\Privilege\Method\MethodPrivilege':
'Neos.Welcome:Restricted':
label: 'Top level'
matcher: 'method(Neos\Welcome\Controller\TopController->indexAction())'
roles:
'Neos.Welcome:Everybody':
# abstract: true
label: 'Magic "everybody" role'
description: 'This magic role is always active, even if no account is authenticated'
privileges:
-
privilegeTarget: 'Neos.Welcome:Restricted'
permission: GRANT
ポイント1:privilegeTargetsを記載
Policy.yamlにPlivirageTargets
の定義を記載します。
重要な用語について触れながら解説していきます。
①PlivirageTargets
PlivirageTargets
とは、特定のリソースや処理に対するアクセス権を定義するためのものです。PlivirageTargets
に保護したいリソースを記載し、後述するroleと紐づけることで、特定のroleでしか開けないという設定を付与することができます。
②MethodPrivilege
MethodPrivilege
はFlowが提供しているクラスで、これを指定することでにアクセス権をメソッドごと設定することができます。
Privirage
にも種類があり、MethodPrivilege
以外にもEntity
やParameter
を指定するPrivirage
などがあります。また、PrivirageInterface
を継承することで、独自のPrivirage
も作成可能です。
今回は、TOP画面を開くActionメソッドを設定し、Neos.Welcome:Restricted
という名前で定義しました。
ポイント2:roleにprivilegeTargetを紐づける
先ほど定義したNeos.Welcome:Restricted
とroleを紐づけます。
privilegeTarget
に定義名を記載し、Permission
をGRANT
に設定すればOKです。
動作確認
http://localhost:8081/neos.welcome/top/index
をブラウザ上で打ち込み、ログイン画面に遷移するか見てみましょう。
ちゃんとログイン画面に遷移してくれました。
続いてログインしてみます。
ログイン後はちゃんとTOP画面に遷移してくれました。
この状態でTOP画面のURLを直指定します。
問題なくTOP画面開いてくれました。いい感じですね。
余談:ロールにNeos.Flow:Everybody
を指定したPrivirageは、未ログイン状態でアクセスすることができる
Neos.Flow:Everybody
はFlowが用意しているroleで、未ログイン状態のユーザを指します。
そのため、このroleにPrivirageを紐づけた場合、未ログイン状態でアクセスできるリソースと定義することができます。
ログイン画面やパスワード設定画面などはこのroleで設定しておけば、未ログイン状態で開くことができますね。
privilegeTargets:
'Neos\Flow\Security\Authorization\Privilege\Method\MethodPrivilege':
'Neos.Welcome:Top.index':
label: 'Top level'
matcher: 'method(Neos\Welcome\Controller\TopController->indexAction())'
roles:
'Neos.Flow:Everybody':
# abstract: true
label: 'Magic "everybody" role'
description: 'This magic role is always active, even if no account is authenticated'
privileges:
-
privilegeTarget: 'Neos.Welcome:Top.index'
permission: GRANT
終わりに
今回は認可処理について書きました。
ログインって難しいイメージがあったんですが、前回の認証といい今回の認可といい、思いのほか簡単に実装できて面白いです。
認証系はいろいろ深堀が面白そうなので、SSOや二段階認証などの実装も今度試してみようと思います。
ここまで読んでくださりありがとうございました!