Laravel 授权策略提供的 @can Blade 命令?

blade模板语法 can 问题
使用方法是

 can(还是个用户 尴尬就不写@了)
        Html 代码
@endcan

使用 can 存在什么先决条件 update 对应的是策略里面的 update 的方法 还是 控制器里面的
对应的里面的update 的方法

public function update(TopicRequest $request, Topic $topic)
{
    $this->authorize('update', $topic);  //或者说是不是这个语句的另一种在页面的显示方式
    $topic->update($request->all());
    return redirect()->route('topics.show', $topic->id)->with('success', '更新帖子成功');
}

或者说can是一个什么样的机制? 怎么样做到判断的 ? 请各位大神指教下 谢谢!

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

首先第一个问题 :

can()是一个什么样的机制

can() 方法其实是如下代码写法的缩写:

@if (Auth::user()->can('update', $post))
    <!-- 当前用户可以更新博客 -->
@endif

@unless (Auth::user()->can('update', $post))
    <!-- 当前用户不可以更新博客 -->
@endunless

也就是说会默认的调用当前登录用户的can()辅助方法。
第二个问题:

update 对应的是策略里面的 update 的方法 还是控制器里面的对应的里面的update的方法,怎么样做到判断的 ?

can()方法会根据第二个参数的模型的类型去授权策略注册表里面去查找该模型对应的授权策略类,也就是你在AuthServiceProviderpolicies 属性指定的模型以及授权策略类对应关系:

<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 应用的策略映射。
     *
     * @var array
     */
    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    /**
     * 注册任意用户认证、用户授权服务。
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

所以回到问题上来,因为你传入的$topicTopic模型,那么can()方法就会去AuthServiceProvider 里面你指定的 Topic模型对应的授权策略类里面去寻找叫update的方法。
推荐自己仔细看一下文档 编写策略

6年前 评论
讨论数量: 2

首先第一个问题 :

can()是一个什么样的机制

can() 方法其实是如下代码写法的缩写:

@if (Auth::user()->can('update', $post))
    <!-- 当前用户可以更新博客 -->
@endif

@unless (Auth::user()->can('update', $post))
    <!-- 当前用户不可以更新博客 -->
@endunless

也就是说会默认的调用当前登录用户的can()辅助方法。
第二个问题:

update 对应的是策略里面的 update 的方法 还是控制器里面的对应的里面的update的方法,怎么样做到判断的 ?

can()方法会根据第二个参数的模型的类型去授权策略注册表里面去查找该模型对应的授权策略类,也就是你在AuthServiceProviderpolicies 属性指定的模型以及授权策略类对应关系:

<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 应用的策略映射。
     *
     * @var array
     */
    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    /**
     * 注册任意用户认证、用户授权服务。
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

所以回到问题上来,因为你传入的$topicTopic模型,那么can()方法就会去AuthServiceProvider 里面你指定的 Topic模型对应的授权策略类里面去寻找叫update的方法。
推荐自己仔细看一下文档 编写策略

6年前 评论

首先第一个问题 :

can()是一个什么样的机制

can() 方法其实是如下代码写法的缩写:

@if (Auth::user()->can('update', $post))
    <!-- 当前用户可以更新博客 -->
@endif

@unless (Auth::user()->can('update', $post))
    <!-- 当前用户不可以更新博客 -->
@endunless

也就是说会默认的调用当前登录用户的can()辅助方法。
第二个问题:

update 对应的是策略里面的 update 的方法 还是控制器里面的对应的里面的update的方法,怎么样做到判断的 ?

can()方法会根据第二个参数的模型的类型去授权策略注册表里面去查找该模型对应的授权策略类,也就是你在AuthServiceProviderpolicies 属性指定的模型以及授权策略类对应关系:

<?php

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 应用的策略映射。
     *
     * @var array
     */
    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    /**
     * 注册任意用户认证、用户授权服务。
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

所以回到问题上来,因为你传入的$topicTopic模型,那么can()方法就会去AuthServiceProvider 里面你指定的 Topic模型对应的授权策略类里面去寻找叫update的方法。
推荐自己仔细看一下文档 编写策略

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!