iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 17
1
Software Development

從零開始的Laravel RESTful api系列 第 17

Day 17 : 用 Middleware 管理權限 ( part II )

接下來就來實際應用 Middleware 儲存的 auth_user 變數,在 Controller 作進一步的驗證

Controller

  • index

    index method 僅僅限於 admin 的請求才能被執行,因此驗證的部份就是確認 auth_user 是否為 admin

    public function index()
    {
        // 取得 Middleware 存入的變數
        $auth_user = request()->get('auth_user')->first();
    
        // 確認 auth_user 是否為 admin
        if($auth_user['is_admin']){
            return response(['data' => User::get()]);
        }
        return response(['message' => 'Unauthorized user']);
    
    }
    
  • show

    show method 除了 admin 之外,還有自己請求自己資料的動作也可以被執行

    public function show($id)
    {
        // 取得 Middleware 存入的變數
        $auth_user = request()->get('auth_user')->first();
        $user = User::find($id);
    
        // 確認是否為 admin
        if($auth_user['is_admin']){
            // 確認該使用者是否存在
            if(!is_null($user)){
                return response(['data' => $user]);
            }else{
                return response(['message' => 'User not found!!']);            
            }
        // 確認該使用者是否為本人
        }elseif($auth_user['id'] == $id){
            return response(['data' => $user]);
        }else{
            return response(['message' => 'Unauthorized!']);
        }
    
    }
    
  • update

    驗證該名使用者是否為自己

    public function update(Request $request, $id)
    {
        $rules = [
            'name' => 'string|min:2|max:255',
            'email' => 'email|max:256|unique:users,email,'.$id,
            'password' => 'string|min:6|max:12|confirmed',
        ];
        $validator = Validator::make($request->all(), $rules);
        if($validator->failed()){
            return response(['message' => $validator->errors()]);
        }
    
        // 取得 Middleware 存入的變數
        $auth_user = request()->get('auth_user')->first();
        $user = User::find($id);
    
        // 確認該使用者是否為本人
        if($auth_user['id'] == $id){
            // 確認該使用者是否存在或為 admin
            $user->update($request-only(['name', 'email', 'password']));
            return response(['data' => $user]);
        }elseif(is_null($user)){
            return response(['message' => 'User not found']);
        }else{
            return response(['message' => 'Unauthorized!']);
        }
    
    }
    
  • delete

    同於 show 的情形

    public function destroy($id)
    {
        // 取得 Middleware 存入的變數
        $auth_user = request()->get('auth_user')->first();
        $user = User::find($id);        
        // 確認是否為 admin
        if($auth_user['is_admin']){
            // 確認該使用者是否存在或為 admin
            if(!is_null($user) && !$user['is_admin']){
                $user->delete();
                return response(['message' => 'User deleted!!']);
            }else{
                return response(['message' => 'User not found or that is a superuser']);
            }
        }elseif($auth_user['id'] == $id){
            $user->delete();
            return response(['message' => 'User deleted!!']);
        }else{
            return response(['message' => 'Request error!!']);
        }
    
    
    

Postman 測試 ( 以 index、show、update 為例 )

此處有三個使用者 ( ken、kai 和 king ),而除了 ken 為 admin,其他為一般使用者

ken 的 api_token

image alt

kai 的 api_token

image alt

king 的 api_token

image alt

  • index

    • kai 的 request 無法通過

    image alt

    • ken 為 admin,所以可以查看所有使用者

    image alt

  • show ( 查看 kai 的資料 )

    • ken 為 admin,因此可以

    image alt

    • kai 為自己,所以可以

    image alt

    • king 並非本人或者 admin,所以 request 無法通過

    image alt

  • update ( 更改 king 的名字為 kingkong )

    • ken 為 admin,但依舊無法更改資料

    image alt

    • kai 並非本人,因此不行

    image alt

    • king 為自己,所以可以

    image alt

user 的部份到此結束,接下來就來建立 post 的 API,敬請期待!


上一篇
Day 16 : 用 Middleware 管理權限 ( part I )
下一篇
Day 18 : 貼文 ( Migration )
系列文
從零開始的Laravel RESTful api30

尚未有邦友留言

立即登入留言