目前我在codecourse.com上做了一个名为“laravel中的角色和权限”的教程。
在本教程的第4部分中,我遇到了每次结果都是真的问题。 如果我要求许可“编辑帖子”它应该显示我是真的,如果我要求许可“删除帖子”它应该显示我的错误。
我检查了数据库关系,但用户和权限“删除帖子”之间没有任何关系。
只有当我要求一个不存在的权限时,例如“blabla”(我的意思是数据库中不存在),我才会错误。
我相信他只是检查是否有使用此名称的权限,而不是检查是否允许用户使用该权限。
web.php
Route::get('/', function (\illuminate\Http\Request $request) {
$user = $request->user();
dump($user->can("delete posts"));});
HasPermissionTrait.php
trait HasPermissionsTrait {
public function hasRole(...$roles)
{
foreach ($roles as $role) {
if ($this->roles->contains('name', $role)) {
return true;
}
}
return false;
}
public function hasPermissionTo($permission) {
//Check has permission through role
return $this->hasPermission($permission);
}
protected function hasPermission($permission) {
return (bool) $this->permissions->where('name', $permission->name);
}
public function roles() {
return $this->belongsToMany(Role::class, 'users_roles');
}
public function permissions() {
return $this->belongsToMany(Permission::class, 'users_permissions');
}
PermissionsServiceProvider.php
public function boot()
{
Permission::get()->map(function ($permission) {
Gate::define($permission->name, function ($user) use ($permission) {
return $user->hasPermissionTo($permission);
});
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
你可以在这里看我的完整代码 - > https://github.com/RahmanG/joko
在此图片上,您可以看到Auth。没有权限“删除帖子”。但是你可以看到门是真的。
感谢您的支持
答案 0 :(得分:0)
我已经得到了答案。感谢来自laracasts.com的tykus
tykus:
看起来你的特质可能有错:
protected function hasPermission($permission) {
return (boolean) $this->permissions->where('name', $permission->name);
}
$ this-> permissions->其中(' name',$ permission-> name)返回一个Builder实例,一个强制转换为布尔值的对象始终为true。
你可能需要返回一个计数或第一个 - 如果没有许可就会出现错误,例如。
protected function hasPermission($permission) {
return (boolean) $this->permissions->where('name', $permission->name)->count();
}