3分钟短文:任命管理员,给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 : 命名空间 , 指定该组内所有的控制器 , 均位于该命名空间下 。
public function index(){$users = User::orderBy('created_at', 'desc')->get();return view('admin.users.index')->withUsers($users);}
我们还需要一个视图文件 , 承载上述的数据 。 创建目录 resources/views/admin/users/index.blade.php , 简单创建一个模板:Registered Users@forelse ($users as $user)- {{ $user->name }} ({{ $user->email }})
@empty- No registered users
@endforelse
展示的是所有用户的信息 。 这显然必须拥有较高的权限 。 所以我们在给数据之前 , 要识别用户是否管理员:if (Auth::user()->is_admin != true) {return redirect()->route('home')->withMessage('Access denied!');}
如果不是就路由到首页 。 这样的判断 , 如果页面多了起来之后 , 每次都要在控制器内敲写 , 着实麻烦 。 所以 , 必须使用更靠前的验证 , 也就是 中间件!中间件中间件可以注册给路由文件 , 在命中路由后 , 调用中间件进行身份识别 , 这是不错的选择 。
使用命令行创建中间件文件:
php artisan make:middleware AdminAuthentication
生成的文件位于 app/Http/Middleware/ 目录下 , 编辑 AdminAuthentication 文件 , 并实现代码逻辑:namespace App\Http\Middleware;use Closure;use Illuminate\Contracts\Auth\Guard;use Illuminate\Http\RedirectResponse;class AdminAuthentication {public function handle($request, Closure $next){if ($request->user()){if ($request->user()->is_admin == true){return $next($request);}}// 验证不通过return new RedirectResponse(url('/'));}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- oAuth开发者David Recordon被任命为白宫技术总监
- 高通公司宣布任命安蒙为候任首席执行官
- 苹果任命媒体主编莫妮卡·洛萨诺为董事会成员
- 3分钟短文:Laravel说要用软删除,可不要真删
- 3分钟短文:Laravel把数据验证的手伸向“请求体”
- 大白话给你讲分布式架构,3分钟让你学一遍
- 3分钟短文:用Laravel发一封“漂洋过海”的电子邮件
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的正确姿势
- 3分钟短文:说说Laravel模型关联关系最单纯的“一对一”
- 3分钟短文:说说Laravel模型中还算常用的2个“关系”