【问题标题】:Laravel 5.6 Policy is not working properly on remote serverLaravel 5.6 策略在远程服务器上无法正常工作
【发布时间】:2019-01-25 16:57:47
【问题描述】:

我创建了一个名为 LetterPolicy 的策略,这是代码

    namespace App\Policies;

    use App\Letter;
    use App\User;
    use Illuminate\Auth\Access\HandlesAuthorization;

    class LetterPolicy
    {
        use HandlesAuthorization;

        /**
         * Create a new policy instance.
         *
         * @return void
         */

        public function __construct()
        {
            //
        }

        public function update(User $user, Letter $letter)
        {
            return($user->id === $letter->user_id || $user->role_id===1 ) ;
        }
    }

这是authserviceprovider

namespace App\Providers;

use App\Letter;
use App\Policies\LetterPolicy;
use App\Policies\UserPolicy;
use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
        User::class => UserPolicy::class,
        Letter::class => LetterPolicy::class,
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        //
    }
}

在下面的代码中我检查用户

class LetterController extends Controller
{
protected $user;
public function __construct()
{
    $this->middleware(function ($request, $next){
       $this->user = Auth::user();
        return $next($request);
    });

}
public function edit(Letter $letter)
{
    if($this->user->can('update', $letter)){           
       //edit
    }
    else
        abort('403', 'Access Denied');
}

代码在 localhost 中运行良好,但在远程服务器上它报告 access denied 错误。我在服务器上部署站点后创建了此策略,因此我使用代码创建了一个路由 /clear-cache

    Route::get('/clear-cache', function() {
        $exitCode = \Illuminate\Support\Facades\Artisan::call('cache:clear');
    });

创建策略后清除缓存。但它仍然报告403 错误。有什么问题?

【问题讨论】:

  • 检查策略类文件的权限并尝试运行 composer dump-autoload
  • @SyedFaisal 如何在服务器上运行作曲家?
  • 你有 ssh 访问服务器的权限吗??
  • 是的,我可以访问
  • 用户真的可以编辑信件吗?也许您的数据有误,而政策运作正确?

标签: php laravel laravel-5 laravel-authorization


【解决方案1】:

Fjarlaegur 的回答是关键。我遇到了同样的问题:在 localhost 中没有问题,但在生产服务器中,每次授权都失败了,这是因为比较运算符。从 === 更改为 == 一切都很好。

【讨论】:

    【解决方案2】:

    我在控制器中尝试了dd($this->user->id === $letter->user_id || $this->user->role_id===1 );,它返回了false。我试过dd($this->user->id == $letter->user_id || $this->user->role_id==1 );,它是true。现在可以了,但我不知道为什么!!!

    【讨论】:

    • 您使用的是=== 而不是==。使用=== 将强制进行相同的类型比较,并且不会像== 那样进行隐藏类型转换。看看this question 显然或$this->user->id$letter->user_id 不是同一类型或$this->user->role_id 不是整数。通过使用==,它不会比较类型,所以它会返回true。尝试dd()变量,然后你可以在浏览器中看到类型。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 2018-12-24
    • 2017-06-02
    • 2021-11-29
    • 2019-11-24
    • 2012-08-02
    相关资源
    最近更新 更多