视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
任命管理员,给Laravel普通用户提权
2020-11-02 17:29:00 责编:小采
文档
 下面由Laravel教程栏目给大家介绍如何给Laravel普通用户提权,希望对需要的朋友有所帮助!

引言

系统内使用User表记录用户的属性,各自维护用户自身的关联数据。 有一些前端页面也会需要分别根据身份展示不同级别的内容。

本期为大家说一说给普通用户提权为管理员

数据准备

我们希望在users表内指定用户的身份,比如任命为管理员,则可以展示更多的数据资源。

我们在users表内追加一个字段 is_admin 用于标记用户的管理员身份,使用命令创建迁移文件:

php artisan make:migration add_is_admin_to_user_table --table=users复制代码

首先填充 up 方法用于迁移执行的逻辑:

public function up(){
 Schema::table('users', function(Blueprint $table) {
 	$table->boolean('is_admin')->default(false);
 });
}

如果迁移失败,进行回滚使用的 down 方法:

public function down() 
{
 Schema::table('users', function(Blueprint $table) {
 	$table->dropColumn('is_admin');
 }
}

完成编辑后保存,并执行迁移指令:

php artisan migrate复制代码

为了测试,我们使用mysql客户端直接连接数据库,并手动指定一个管理员,使用下面的SQL语句:

update users set is_admin = true where email = 'admin@admin.com';

路由

为了区别于普通用户的前端页面,我们使用新的命名空间 Admin 放置管理员相关的代码。首先创建控制器:

php artisan make:controller Admin/UsersController复制代码

然后添加路由,编辑 routes/web.php 文件并添加以下内容:

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function(){
	Route::resource('user', 'UsersController');
});

注意我们使用了两个关键的参数,

  • prefix : 也就是该组内的所有路由地址,使用 prefix 最为前缀
  • namespace : 命名空间,指定该组内所有的控制器,均位于该命名空间下。
  • 控制器

    上一节的路由我们定义的是资源路由,使用restful风格声明。下面创建 app/Http/Controllers/admin/UsersController.php 文件,并实现 index 方法。代码内容如下:

    public function index(){
     $users = User::orderBy('created_at', 'desc')->get(); return view('admin.users.index')->withUsers($users);
    }

    我们还需要一个视图文件,承载上述的数据。创建目录 resources/views/admin/users/index.blade.php,简单创建一个模板:

    <h1>Registered Users</h1>
    <ul>
     @forelse ($users as $user)
     	<li>{{ $user->name }} ({{ $user->email }})</li>
     @empty
     	<li>No registered users</li>
     @endforelse
    </ul>

    展示的是所有用户的信息。这显然必须拥有较高的权限。所以我们在给数据之前,要识别用户是否管理员:

    if (Auth::user()->is_admin != true) {	return redirect()->route('home')->withMessage('Access denied!');
    }

    如果不是就路由到首页。这样的判断,如果页面多了起来之后,每次都要在控制器内敲写,着实麻烦。所以,必须使用更靠前的验证,也就是 中间件!

    中间件

    中间件可以注册给路由文件,在命中路由后,调用中间件进行身份识别,这是不错的选择。

    使用命令行创建中间件文件:

    php artisan make:middleware AdminAuthentication复制代码

    生成的文件位于 app/Http/Middleware/ 目录下,编辑 AdminAuthentication 文件,并实现代码逻辑:

    namespace AppHttpMiddleware;use Closure;use IlluminateContractsAuthGuard;use IlluminateHttpRedirectResponse;class AdminAuthentication { public function handle($request, Closure $next) { 	if ($request->user())
     	{ 	if ($request->user()->is_admin == true)
     	{ 	return $next($request);
     	}
     	} // 验证不通过
     return new RedirectResponse(url('/'));
     }
    }

    然后在 app/Http/Kernel.php 文件内注册该中间件,并命名:

    protected $routeMiddleware = [	'admin' => AppHttpMiddlewareAdminAuthentication::class,
    ];复制代码

    修改 路由 一节中声明的路由组,引入中间件:

    Route::group(
    [ 'prefix' => 'admin', 'namespace' => 'admin', 'middleware' => 'admin'], function(){
    	Route::resource('users', 'UsersController');
    });

    写在最后

    本文又是一个功能齐全却又mini小巧的短文,详细阐述了如何为users表添加管理员功能。

    通过注册路由到中间件的使用,又一次体验了laravel各个组件协同作用的能力!

    下载本文
    显示全文
    专题