Го-го-го! Всіх радий бачити, шановні колеги! Після довгої перерви, викликаної буремними подіями в моєму житті, я нарешті знайшов час та натхнення, щоб завершити цикл статей про контроль доступу за допомогою Casbin. У цій, другій та заключній частині, ми заглибимось у практичну реалізацію та розглянемо конкретний приклад використання цієї потужної бібліотеки разом з моїм власним open-source проєктом Guard.

Незважаючи на те, що часу на написання технічних статей останнім часом було обмаль, я продовжував працювати над інструментами, які можуть полегшити життя Go-розробникам. І сьогодні я радий поділитися з вами результатами цієї роботи.

Вступ

У попередній частині ми розглянули базові концепції контролю доступу та різні підходи до його реалізації. Зараз ми зосередимось на практичному впровадженні трирівневої системи контролю доступу за допомогою Casbin.

Open-source проєкт “Guard”

Guard — це бібліотека, яка спрощує роботу з Casbin у Go-проєктах та надає зручний інтерфейс для реалізації контролю доступу.

Код на Github

https://github.com/uagolang/guard

<aside> ⚠️

Якщо ви захочете законтриб’ютити: додати нових фабрик, знайшли баги тощо - велкам!

</aside>

Отже, Guard надає власну фабрику для створення багаторівневої авторизації, що значно спрощує роботу з Casbin у Go. Ця реалізація охоплює більшість типових сценаріїв використання.

Крім того, Guard дозволяє створювати власні реалізації авторизації через інтерфейс Factory:

type Factory interface {
    Scope(data ScopeData) Scope
    SubjectUser(id string) Subject
    SubjectRole(tenantID, id string) Subject
    SubjectGroup(tenantID, id string) Subject
    Object(s Scope, p Perm) Object
    GroupPolicy(sub, role Subject) GroupPolicy
    PolicyFromCasbin(p []string) (Policy, error)
    RolePolicyFromCasbin(p []string) (RolePolicy, error)
    RolePoliciesFromCasbin(p [][]string) ([]RolePolicy, error)
    GroupPolicyFromCasbin(p []string) (GroupPolicy, error)
}

Цей інтерфейс дає можливість:

Завдяки такій гнучкості, ви, як розробники, можете адаптувати Guard під специфічні потреби свого проєкту, зберігаючи при цьому всі переваги використання Casbin.

Приклад використання

Давайте розглянемо приклад використання Guard. Для цього достатньо перейти в папку guard/examples/tenant/main.go та переглянути файл: