Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Kris01's avatar

Laravel and Inertia with Policies

Hello,

My policy always returns false.

This is my policy class

<?php

namespace App\Policies\Admin;

use App\Models\Admin\User;
use App\Models\Client\Vehicles;
use App\Models\Client\Permissions;
use Illuminate\Auth\Access\HandlesAuthorization;
use Log;

class PermissionPolicy
{
    use HandlesAuthorization;

    public const MANAGE = 'manage';
 
    /**
     * Determine whether the user can manage vehicles.
     *
     * @param  \App\Models\Admin\User  $users
     * @return mixed
     */
    public function manage(User $authenticatedUser)
    {
        return true;
    }
}

this is how I call it

$user->can(PermissionPolicy::MANAGE)
0 likes
10 replies
tykus's avatar

You're not actually using the Policy (apart from the MANAGE const). The Policy would expect a Model instance to authorize against.

Maybe consider taking a primer on Policies

1 like
Kris01's avatar

@tykus Even when send the permissions model as param, it returns the same

tykus's avatar

@Kris01

public function manage(User $authenticatedUser, Permission $permission)
{
    return true;
}
$user->can('manage', $permission);
Kris01's avatar

@tykus still false...

<?php

namespace App\Policies\Admin;

use App\Models\Admin\User;
use App\Models\Client\Vehicles;
use App\Models\Client\Permissions;
use Illuminate\Auth\Access\HandlesAuthorization;
use Log;
Use App\Models\Admin\Permission;

class PermissionPolicy
{
    use HandlesAuthorization;

    public const MANAGE = 'manage';
 
    /**
     * Determine whether the user can manage vehicles.
     *
     * @param  \App\Models\Admin\User  $users
     * @return mixed
     */
    public function manage(User $authenticatedUser, Permission $permission)
    {
        Log::debug('inside manage users');
        Log::debug($authenticatedUser);
        return true;
    }
}
	$permissions = Permission::all();
    $user = User::whereId(User::authenticatedId())->firstOrFail();
    dd($user->can(PermissionPolicy::MANAGE, $permissions));
    

Kris01's avatar

btw, this is inside the controller to test it out

$permissions = Permission::all();
    $user = User::whereId(User::authenticatedId())->firstOrFail();
    dd($user->can(PermissionPolicy::MANAGE, $permissions));
    ```
Kris01's avatar

@tykus I tried like that too, but the problem is probably somewhere else...

        dd($user->can(PermissionPolicy::MANAGE, Permission::class));
Kris01's avatar

@tykus the idea is this. in the USER model

 protected $appends = [
        'can',
    ];

 public function getCanAttribute() : array
    {
        return [
            'manage' => [
                'userPermissions' => $this->can(PermissionPolicy::MANAGE, Permission::class),
            ],
        ];
    }

inside handleInertiaRequests

   'auth' => [
                'user' => function(){
                    $user = Auth::guard('admin')->user();
                    return $user 
                        ? $user->only(['id','name','email','can','is_active'])
                        : [];
                }
            ],
<?php

namespace App\Policies\Admin;

use App\Models\Admin\User;
use App\Models\Client\Vehicles;
use App\Models\Client\Permissions;
use Illuminate\Auth\Access\HandlesAuthorization;
use Log;
Use App\Models\Admin\Permission;

class PermissionPolicy
{
    use HandlesAuthorization;

    public const MANAGE = 'manage';
 
    /**
     * Determine whether the user can manage vehicles.
     * @return bool
     */
    public function manage(User $authenticatedUser, Permission $permission)
    {
	//just to test and see if it returns true, then login will go here
        return true;
	}

Please or to participate in this conversation.