Го-го-го! Всіх радий бачити, шановні колеги! Після довгої перерви, викликаної буремними подіями в моєму житті, я нарешті знайшов час та натхнення, щоб завершити цикл статей про контроль доступу за допомогою 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 та переглянути файл: