请自行添加命名空间,代码下载地址 https://github.com/caoxt/learngit
1、所需要用到的数据表
users(用户表)、roles(角色表)、role_user(用户角色对应表)、permissions(权限表)、permission_role(权限角色对应表)、posts(文章表)
-----------------------以上命令也同样可以在phpmyadmin里完成------------------
2、使用migration创建以上数据表
posts(文章表)
php artisan make:migration create_posts_table --create=posts
1 public function up() 2 { 3 Schema::create('posts', function (Blueprint $table) { 4 $table->increments('id'); 5 $table->integer('user_id')->unsigned(); 6 $table->string('title'); 7 $table->text('body'); 8 $table->timestamps(); 9 $table->foreign('user_id') 10 ->references('id') 11 ->on('users') 12 ->onDelete('cascade'); 13 }); 14 }
php artisan migrate
3、生成测试数据
php artisan make:model Post
在database/factories/ModelFactory.php在添加
$factory->define(AppPost::class, function (FakerGenerator $faker) {
return [
'user_id' => factory(AppUser::class)->create()->id,
'title' => $faker->sentence,
'body' => $faker->paragraph,
];
});
php artisan tinker
factory('AppPost')->create();
factory('AppUser')->create();
此时第一条create会在post和user表格创建一条数据,第二条create只会在user表中创建一条数据
4、创建Post控制器;
php artisan make:controller PostController
------------------------以下为访问一条尚未添加权限的文章--------------------------
5、在routes.php里添加一条路由
Route::resource('post', 'PostController');
6、在PostController.php中从数据库中取出一条数据并输出到视图
public function show($id)
{
//
$post = Post::find($id);
return view('post.show', compact('post'));
}
7、show.blade.php
标题:{{ $post->title }}
<br>
内容:{{ $post->body }}
预览:

-------------------------以下实现非文章作者则拒绝访问--------------------------
8、在Http/Providers/AuthServiceProvide.php中定义权限
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
$gate->define('show-post', function ($user, $post) {
return $user->owns($post);
});
}
此处$user会拿到登录user的表信息,$post会拿到所访问posts表信息
在User.php文件中添加
public function owns($post) {
return $this->id == $post->user_id;
}
在PostController.php中检查是否认证用户
public function show($id)
{
//
$post = Post::findOrFail($id);
Auth::loginUsingId(1);//登录用户id
if (Gate::denies('show-post', $post)) {
dd('无认证');
}
return view('post.show', compact('post'));
}
分别测试用户id1和id2登录时访问的页面

--------------------------------以下为 假如两个用户都可以访问页面,实现只有文章作者才可以有编辑权限----------------------------------------------
9、在PostController.php中修改为
public function show($id)
{
//
$post = Post::findOrFail($id);
Auth::loginUsingId(2);//登录用户id
/*
if (Gate::denies('show-post', $post)) {
dd('无认证');
}*/
return view('post.show', compact('post'));
}
10、在show.blade.php视图中修改为
标题:{{ $post->title }}
<br>
内容:{{ $post->body }}
@can('show-post', $post)
<a href="#">编辑文章</a>
@endcan
分别测试用户id1和id2登录时访问的页面,区别为是否能看到"编辑文章"的链接