2.0 KiB
2.0 KiB
access
Kontrola dostępu oparta na rolach: hierarchia admin > editor > user.
Plugin wstrzykuje sztywne pole roles do klienckiej kolekcji auth i dostarcza
predykaty oraz gotowe funkcje dostępu (collection-level i field-level).
Config (payload.config.ts)
ipalKit({
access: {
authCollection: 'users', // slug Twojej kolekcji auth
// defaultRole: 'user', // rola nowych użytkowników, domyślnie 'user'
},
})
Wstrzykuje pole roles (select hasMany, saveToJWT, tylko admin może
zmieniać role) do wskazanej kolekcji. Kolekcja należy do Ciebie
(create-payload-app) — plugin tylko dokłada pole.
Po dodaniu: zadbaj, by seed / pierwszy user miał
roles: ['admin'], inaczej stracisz dostęp do zasobów admin-only (np. SiteIntegrations).
Predykaty (front / hooki / access)
import { isAdmin, isEditor, hasMinimumRole } from '@intecion/ipal-kit'
isAdmin(user) // admin?
isEditor(user) // editor lub admin (hierarchia)
hasMinimumRole(user, 'editor') // co najmniej editor
Przyjmują luźno typowanego usera (jak req.user), czytają roles defensywnie.
Gotowe funkcje dostępu
Collection-level (zwracają boolean | Where)
import { adminOnly, adminOrEditor, adminOrSelf, requireRole, authenticated } from '@intecion/ipal-kit'
export const Articles = {
slug: 'articles',
access: {
read: authenticated,
create: adminOrEditor,
update: adminOrEditor,
delete: adminOnly,
},
// ...
}
// Users: każdy widzi siebie, admin widzi wszystkich
access: { read: adminOrSelf }
// dowolny minimalny próg
access: { update: requireRole('editor') }
Field-level (zwracają boolean)
import { adminOnlyField, adminOrEditorField, requireRoleField } from '@intecion/ipal-kit'
{
name: 'internalNote',
type: 'textarea',
access: { read: adminOnlyField, update: adminOnlyField },
}
Hierarchia
import { ROLE_HIERARCHY } from '@intecion/ipal-kit'
// ['user', 'editor', 'admin'] — wyższa rola spełnia wymóg niższej