Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

User 新增 Role 與 ACL #55

Closed
puckwang opened this issue May 18, 2019 · 10 comments
Closed

User 新增 Role 與 ACL #55

puckwang opened this issue May 18, 2019 · 10 comments
Assignees

Comments

@puckwang
Copy link
Member

預計將使用 laravel-permission 來去完成這個功能。

前端相關

新增 Role 與擴充 User 頁面。

在 Role 頁面中,可讓使用者新增新的 Role,並可編輯所擁有的權限。權限編輯方式為用 CheckBox 列出全部權限讓使用者勾選。

在 User 頁面中,新增設定 User Role 的地方,支援一個 User 可擁有多個 Role。

後端相關

DB

直接採用 laravel-permission 所設計的 Table,但於 permission 中新增 description 用於說明該權限用處使用。

權限命名方式

格式:"Controller Name-Method Name"

範例:UserController@store = "user-store"

涵蓋範圍

所有 Controller 內的所有 public 方法都要有相對應的權限。

確認權限位置

在此有兩中方法實作,都先列出來,再來討論哪種比較適合。

方法一:於 Request 驗證

class IndexRequest
{
    public function authorize()
    {
        $user = Auth::user();

        return $user->hasPermissionTo('pemissionName');
    }
}

方法二:於 Middleware 驗證

簡單來說就相下面這樣。

class RoleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    function __construct()
    {
         $this->middleware('permission:role-list');
         $this->middleware('permission:role-create', ['only' => ['create','store']]);
         $this->middleware('permission:role-edit', ['only' => ['edit','update']]);
         $this->middleware('permission:role-delete', ['only' => ['destroy']]);
    }
}

我目前是傾向用『方法二』,因為『方法一』手續比較多,檔案也會變多。

UnAuthorized Handler

新增於 app/Exceptions/Handler.php

public function render($request, Exception $exception)
{
    if ($exception instanceof AuthorizationException) {
        return $this->unauthorized($request, $exception);
    }

    return parent::render($request, $exception);
}

private function unauthorized($request, Exception $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => $exception->getMessage()], 403);
    }

    flash()->warning($exception->getMessage());
    return redirect('/login');
}

再麻煩 @hashman 看看有沒有問題或需要補充的地方。

@unciax
Copy link
Contributor

unciax commented May 18, 2019

如果沒有權限導回登入頁面這段感覺怪怪的,應該是顯示沒有權限就可以了

@hashman
Copy link
Collaborator

hashman commented May 18, 2019

這個套件沒問題,幾個地方提一下

  1. 如果可以正常登入,該頁面無權限就直接回 401 就好,除非是連登入的 session 都不見再回 login 即可
  2. 權限應該可以最細到某個頁面的 read or write 功能即可,不用到 by function 這樣太細了
  3. 放 middleware 比較好,至於那邊要怎麼寫才漂亮可以再討論一下,但是 code change 確實是最少的沒錯

@puckwang
Copy link
Member Author

  1. 蠻尷尬的,我們 laravel view 部分沒有什麼權限要檢查,幾乎都是 API,或許暫時轉 /login 就好。
  2. 僅 Read 與 Write 可能太簡單了,某些地方可能有些人能動的地方跟其他人不同。

最後我好像忘了 Vue 處理方式,這邊有什麼解法比較好嗎? 我想到下面這兩種

  1. 讓 API 直接噴 unauthorized message 就好。
  2. 沒有 index 權限就直接不顯示畫面。

@hashman
Copy link
Collaborator

hashman commented May 18, 2019

先說 2 好了,因為它牽扯到其他的答案,在一個 function 裡面還會需要 唯讀 / 寫入權限以外的權限管理方式?有什麼例子呢?

我在 KK 做的後台的經驗,目前針對單一頁面控制 read / write 的限制其實就蠻夠了,蠻少會在一個功能頁面裡面,還要分不同的權限的需求

又或者換一個方式來想,有沒有可能先從簡進行,基本上這個 library 的彈性很高,如果真的有這個需求再額外增加上去呢?

@puckwang
Copy link
Member Author

先說 2 好了,因為它牽扯到其他的答案,在一個 function 裡面還會需要 唯讀 / 寫入權限以外的權限管理方式?有什麼例子呢?

我在 KK 做的後台的經驗,目前針對單一頁面控制 read / write 的限制其實就蠻夠了,蠻少會在一個功能頁面裡面,還要分不同的權限的需求

又或者換一個方式來想,有沒有可能先從簡進行,基本上這個 library 的彈性很高,如果真的有這個需求再額外增加上去呢?

那就先從簡進行吧

@puckwang
Copy link
Member Author

puckwang commented May 18, 2019

我更新了,再麻煩看一下 @unciax @hashman


預計將使用 laravel-permission 來去完成這個功能。

前端相關

新增功能

新增 Role 頁面、擴充 User 頁面與新增顯示 403 的頁面。

在 Role 頁面中,可讓使用者新增新的 Role,並可編輯所擁有的權限。權限編輯方式為用 CheckBox 列出全部權限讓使用者勾選。

在 User 頁面中,新增設定 User Role 的地方,支援一個 User 可擁有多個 Role。

檢查頁面權限

Axios 偵測到 403 就直接導向到 403 的頁面。

後端相關

DB

直接採用 laravel-permission 所設計的 Table,但於 permission 中新增 description 用於說明該權限用處使用。

權限命名方式

格式:"Controller Name-Action"

Actions:

  • write: 可使用 store / update / destroy 等牽扯到更新資料的操作。
  • read: 可使用 list / show 等僅做讀取,不會變更到資料的操作。
  • 其他:如有特殊操作需特殊權限,再另行定義。

涵蓋範圍

所有 Controller 內的所有 public 方法都要有相對應的權限。

確認權限

使用套件內建的 Middleware 進行驗證。

class RoleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    function __construct()
    {
         $this->middleware('permission:role-list');
         $this->middleware('permission:role-create', ['only' => ['create','store']]);
         $this->middleware('permission:role-edit', ['only' => ['edit','update']]);
         $this->middleware('permission:role-delete', ['only' => ['destroy']]);
    }
}

UnAuthorized Handler

新增於 app/Exceptions/Handler.php

public function render($request, Exception $exception)
{
    if ($exception instanceof Spatie\Permission\Exceptions\UnauthorizedException) {
        return $this->unauthorized($request, $exception);
    }

    return parent::render($request, $exception);
}

private function unauthorized($request, Exception $exception)
{
    if ($request->expectsJson()) {
        return response()->json([
                'success' => false,
                'message' => 'Forbidden',
                'data'    => [],
            ], 403);
    }

    flash()->warning($exception->getMessage());
    return redirect('/login');
}

@hashman
Copy link
Collaborator

hashman commented May 19, 2019

LGTM

@unciax
Copy link
Contributor

unciax commented May 25, 2019

LGTM+1

@hashman
Copy link
Collaborator

hashman commented May 27, 2019

@puckwang 這個你要實作還是我請資訊組的人幫忙?只是他們最近可能會忙一點

@puckwang
Copy link
Member Author

@puckwang 這個你要實作還是我請資訊組的人幫忙?只是他們最近可能會忙一點

我再自己實作好了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants