-
Notifications
You must be signed in to change notification settings - Fork 6
コントローラー側の$this can() の調査
Mitsuru Mutaguchi edited this page Feb 8, 2022
·
8 revisions
2020/08/28時点の調査記事です。
結論:ちょっとわかりにくい動きだけど、正常に動くコントローラー側の$this->can()を使う。
https://github.com/opensource-workshop/connect-cms/wiki/Policies(権限)
// Role Check(役割チェック)
if ($this->can('role_reporter')) {
return $this->view_error(403);
}
- 正常に動く。けど、ちょっとわかりにくい動きだった。
- role_reporter権限がないと、$this->can()メソッドは、
$this->view_error()
となり、エラー画面のHTML文字列が戻ってくる。 - role_reporter権限があると、$this->can()メソッドは、returnがないので nullになる。
- 権限エラーでエラー画面のHTML文字列が戻ってくると、if文は文字列あり=trueと判定して、
return $this->view_error(403);
する。
- role_reporter権限がないと、$this->can()メソッドは、
- コントローラー側の$this->can()はConnect-CMS自作メソッド。
- Bladeの
@can
は、Laravel Gate(ゲート)機能の一部みたい- Bladeの
@can
とAuth::user()->can()
は同一のものでした。 - コントローラー側の$this->can()メソッド内で、
Auth::user()->can()
を使ってるため、Bladeの@can
と同一のチェックができてます。 - コントローラー側の$this->isCan()メソッド内で、
Auth::user()->can()
を使っていますが、セットする引数がBladeの@can
と違うため、現状(2020/08/28時点)で同一チェックできてなかったです。- 結論:ちょっとわかりにくい動きだけど、正常に動くコントローラー側の$this->can()を使う。
- Bladeの
/**
* 権限チェック & エラー時
* roll_or_auth : 権限 or 役割
*
* @return view|null 権限チェックの結果、エラーがあればエラー表示用HTML が返ってくる。
*
* @see \App\Providers\AppServiceProvider AppServiceProvider::boot()
*/
public function can($roll_or_auth, $post = null, $plugin_name = null, $buckets = null, $frame = null)
{
$args = null;
if ($post != null || $plugin_name != null || $buckets != null || $frame != null) {
$args = [[$post, $plugin_name, $buckets, $frame]];
}
if (!Auth::check() || !Auth::user()->can($roll_or_auth, $args)) {
return $this->view_error("403_inframe", null, "canメソッドチェック:{$roll_or_auth}");
}
}
/**
* 権限チェック
* roll_or_auth : 権限 or 役割
*
* @return bool
*
* @see \App\Providers\AppServiceProvider AppServiceProvider::boot()
*/
public function isCan($roll_or_auth, $post = null, $plugin_name = null, $buckets = null, $frame = null): bool
{
$args = null;
if ($post != null || $plugin_name != null || $buckets != null || $frame != null) {
$args = [[$post, $plugin_name, $buckets, $frame]];
}
if (!Auth::check() || !Auth::user()->can($roll_or_auth, $args)) {
return false;
}
return true;
}
@can('posts.update', [[$inputs, $frame->plugin_name, $buckets]])
<div class="row mt-2">
<div class="col-12 text-right mb-1">
<button type="button" class="btn btn-success btn-sm" onclick="location.href='{{url('/')}}/plugin/databases/input/{{$page->id}}/{{$frame_id}}/{{$inputs->id}}'">
<i class="far fa-edit"></i> 編集
</button>
</div>
</div>
@endcan
https://github.com/opensource-workshop/connect-cms/blob/master/app/Providers/AppServiceProvider.php
https://reffect.co.jp/laravel/laravel-gate-policy-understand#Blade
// Gate(ゲート)とPolicy(ポリシー)、要はアクセス制限です。
// Policy(ポリシー)は、Connect-CMSで App\Policies はフォルダ自体なく使ってない。
@can('update', $post)
<!-- 現在のユーザーはポストを更新できる -->
@elsecan('create', App\Post::class)
<!-- 現在のユーザーはポストを作成できる -->
@endcan
@if (Auth::user()->can('update', $post))
<!-- 現在のユーザーはポストを更新できる -->
@endif
コントローラー側の$this->can() で使っているため、$this->can()
はBladeの@can
と同一のチェックができてます。
Bladeテンプレートによる認可 を参照 - 認可 5.5 Laravel
https://readouble.com/laravel/5.5/ja/authorization.html
- home
- Overview
- Install
- Install (インストール)(Linux等へのインストール:root権限ある場合)
-
Install-sakura(さくらのレンタルサーバ)
- Install-sakura-root(ドキュメントルート版)
- Install-Xserver(XServer)
- Install-lolipop(ロリポップ-ハイスピードプラン)
- Install-ColorfulBox(カラフルボックス)
- install-CentOS7+PHP7
- Install-XAMPP(Windows+XAMPP)
- install-Docker
- Update
- Plans
- Data
- File Upload
- Design
- Theme(テーマ)
- Font-Icon
- Button(ボタン)
- Display of input error(入力エラーの表示)
- Multi Language
- Policies
- Plugin
- Basic function(基本の関数)
- Opac(蔵書管理)
- OpeningCalendar(開館カレンダー)
- Template(テンプレート)
- Cabinet(キャビネット)
- Whatsnew(新着)
- Search(サイト内検索)
- Approval(承認機能)
- Holidays(祝日管理)
- Menu(メニュー)
-
OriginalPlugin(オリジナル・プラグイン開発)
- OriginalPluginFiles(ファイル一覧)
- Sample.php
- SamplePost.php
- plugin.ini
- SamplesPlugin.php
- create_samples_table.php
- create_sample_posts_table.php
- samples_frame_edit_tab.blade.php
- card/index.blade.php
- card/template.ini
- default/bucket.blade.php
- default/edit.blade.php
- default/index.blade.php
- default/list_buckets.blade.php
- default/show.blade.php
- default/template.ini
- WYSIWYG
- Session
- Programing tips
- Rule(ルール)
- Laravel method tips
- Laravel reference pages
- PHP
- phpcs
- Datetimepicker
- Hook(処理のフック)
- SQL
- Pull-Request(Web画面上)
- Post
- Optimize
- Composer
- npm
- コントローラー側の$this--can()-の調査
- API (外部サービスAPI)
- Test Case(テストケース)
- memo(永原のメモ)
- TCPDF(実装サンプル)
- Phpunit(ユニットテスト)
-
Dusk(ブラウザテスト)
- Github-Actions-Dusk(Github Actionsでブラウザテスト)
- Dusk-Manual(マニュアル自動生成)
- Develop-Windows(Windows開発環境)
- users_columns(ユーザ任意項目)
- container-page-beta(コンテナ方式(ページ)対応(ベータ版))
- Migration
- Other
- Link
- MultiLanguage(多言語化の際の注意点)