Laravel使用中介軟體進行許可權控制

飛凡的陀螺發表於2018-01-24

先看 文件
Laravel 中介軟體提供了一種方便的機制來過濾進入應用的 HTTP 請求。
這裡實現一個只有admin角色才能訪問特定路由的功能

  1. 新建middleware
    php artisan make:middleware MustBeAdmin
  2. 開啟生成的 appHttpMiddlewareMustBeAdmin.php 修改handle方法
    關於hasRole方法上一篇有講解
    這裡在請求前判斷使用者角色是否是admin,如果條件滿足進到下一個中介軟體。不滿足返回首頁。
    public function handle($request, Closure $next)
    {
           // 前置
        if ($request->user()->hasRole(`admin`)) {
            return $next($request);
        }
        return redirect(`/`);
    }
  1. 讓系統識別中介軟體。開啟 appHttpKernel
    在 $routeMiddleware 陣列裡追加
    `mustAdmin` => AppHttpMiddlewareMustBeAdmin::class,

  2. 關於中介軟體的呼叫非常靈活,比如

  • 在 routesweb.php 中
    Route::resource(`posts`, `PostsController`)->middleware(`mustAdmin`);
  • 在控制器中
class PostsController extends Controller
{

    public function __construct()
    {
        $this->middleware(`mustAdmin`, [`only` => `show`]);
    }
...
  1. 專案中用到過的中介軟體

例1

在route中定義哪些角色可以訪問,通過 role:ADMIN,TEACHER 知,role是中介軟體名字,後面的 ADMIN,TEACHER 是引數。
routes.php

Route::group([`middleware` => [`web`, `auth`, `role:ADMIN,TEACHER`], `namespace` => `StudentTracGuidesControllers`],
    function () {
        Route::resource(`guides`, `GuidesController`, [`only` => [`index`]]);
        Route::resource(`guides/admin`, `AdminController`, [`only` => [`index`, `edit`]]);
    }
);

/app/Http/Middleware/Role.php

    public function handle($request, Closure $next, $role)
    {
        //  [`ADMIN`, `TEACHER`]
        $roles = func_get_args();
        $roleIds = [];
        // 根據role名字拿到對應的id
        foreach ($roles as $index => $role) {
            // 為什麼這麼判斷我也忘了
            if ($index < 2) continue;
            $roleIds[] = config(`roles.` . trim($role));
        }

        // 判斷當前使用者的roleId是否存在
        if (! in_array((int)$this->auth->user()->RoleId, $roleIds)) {
            return response(`Unauthorized`, 403);
        }

        return $next($request);
    }

config/roles.php

return [
    /*
     * Role id for role.
     */
    `ADMIN`    => 1,
    `STUDENT`  => 2,
    `GUARDIAN` => 3,
    `TEACHER`  => 4,
    `SUPPORTSTAFF` => 5,
    `AUDITOR` => 6,
    `CURRICULUM` => 7,
    `CLIENTADMINISTRATOR` => 8,
];


相關文章