Го-го-го! Всіх радий бачити, шановні колеги! Після довгої перерви, викликаної буремними подіями в моєму житті, я нарешті знайшов час та натхнення, щоб завершити цикл статей про контроль доступу за допомогою Casbin
. У цій, другій та заключній частині, ми заглибимось у практичну реалізацію та розглянемо конкретний приклад використання цієї потужної бібліотеки разом з моїм власним open-source проєктом Guard
.
Незважаючи на те, що часу на написання технічних статей останнім часом було обмаль, я продовжував працювати над інструментами, які можуть полегшити життя Go-розробникам. І сьогодні я радий поділитися з вами результатами цієї роботи.
У попередній частині ми розглянули базові концепції контролю доступу та різні підходи до його реалізації. Зараз ми зосередимось на практичному впровадженні трирівневої системи контролю доступу за допомогою Casbin
.
Guard — це бібліотека, яка спрощує роботу з
Casbin
у Go-проєктах та надає зручний інтерфейс для реалізації контролю доступу.
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)
}
Цей інтерфейс дає можливість:
scopes
) для обмеження контексту доступуCasbin
у формат Guard
та навпакиЗавдяки такій гнучкості, ви, як розробники, можете адаптувати Guard
під специфічні потреби свого проєкту, зберігаючи при цьому всі переваги використання Casbin
.
Давайте розглянемо приклад використання Guard. Для цього достатньо перейти в папку guard/examples/tenant/main.go
та переглянути файл: