LoginSignup
2
1

【PHP】マイナーフレームワーク「Flow」を試してみる~認可編~

Last updated at Posted at 2024-03-28

初めに

前回はこちらの記事で、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に記載を追加します。

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以外にもEntityParameterを指定するPrivirageなどがあります。また、PrivirageInterfaceを継承することで、独自のPrivirageも作成可能です。

今回は、TOP画面を開くActionメソッドを設定し、Neos.Welcome:Restrictedという名前で定義しました。

ポイント2:roleにprivilegeTargetを紐づける

先ほど定義したNeos.Welcome:Restrictedとroleを紐づけます。
privilegeTargetに定義名を記載し、PermissionGRANTに設定すればOKです。

動作確認

http://localhost:8081/neos.welcome/top/indexをブラウザ上で打ち込み、ログイン画面に遷移するか見てみましょう。

image.png

ちゃんとログイン画面に遷移してくれました。

image.png

続いてログインしてみます。

image.png

ログイン後はちゃんとTOP画面に遷移してくれました。

image.png

この状態でTOP画面のURLを直指定します。

image.png

問題なくTOP画面開いてくれました。いい感じですね。

image.png

余談:ロールにNeos.Flow:Everybodyを指定したPrivirageは、未ログイン状態でアクセスすることができる

Neos.Flow:EverybodyはFlowが用意しているroleで、未ログイン状態のユーザを指します。
そのため、このroleにPrivirageを紐づけた場合、未ログイン状態でアクセスできるリソースと定義することができます。

ログイン画面やパスワード設定画面などはこのroleで設定しておけば、未ログイン状態で開くことができますね。

Policy.yaml
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や二段階認証などの実装も今度試してみようと思います。

ここまで読んでくださりありがとうございました!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1