RBAC 작업 시작!

1 minute read

RBAC 이란 유저의 롤 따라서 (계급인가? - -;) 엑세스를 허용하는 방법이다.

회사 4개를 작은 회사위주로 중소기업 위주로 돌아다니다 보니 여러 방식의 RBAC을 봤다.

엘릭서로 어떤 방식이 있나 해서 여러 조사를 했는데, 아무래도 가장 간편하고 RBAC을 코드적으로 기입해서 쉽게 수정할 수 있는 https://github.com/woylie/let_me 를 이용하기로 정했다.

예삶 멤버를 관련한 RBAC policy 파일을 예를 들어본다:

defmodule Yesalm.Policy.Members do

use LetMe.Policy

@org_admin_allow [:own_org, role: :org_admin]

@org_leader_allow [:own_org, role: :leader]

object :member do

`action :create do`

  `allow(role: :super_admin)`

  `allow(@org_admin_allow)`

`end`





`action :read do`

  `allow(role: :super_admin)`

  `allow(@org_admin_allow)`

  `# leaders can look at member list too`

  `allow(@org_leader_allow)`

`end`





`action :update do`

  `allow(role: :super_admin)`

  `allow(@org_admin_allow)`

  `allow([:own_resource])`

`end`





`action :delete do`

  `allow(role: :super_admin)`

  `allow(@org_admin_allow)`

`end`

end

end

ㅠ.ㅠ 왜 인덴트가 망가지지… 에고

아무튼 RBAC policy를 이렇게 분리되서 관리하면 실제 리소스를 주는 코드와 분리되기에 좀 더 관리하기가 편할 것 같아서 이것을 정했다.

그럼 이용은 요렇게 된다:

def list_members(org_id, %User{} = current_user) do

`with :ok <- Policy.authorize(:member_read, current_user, org_id) do`

  `Repo.all(Member, org_id: org_id)`

`end`

end