feat(frontend) : RBAC #345 - usePermissions composable
Ajout de isAdmin et effectivePermissions dans UserData, creation du composable usePermissions() (can/canAny/canAll) avec bypass admin.
This commit is contained in:
38
frontend/shared/composables/usePermissions.ts
Normal file
38
frontend/shared/composables/usePermissions.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { useAuthStore } from '~/shared/stores/auth'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composable d'autorisation cote front.
|
||||||
|
*
|
||||||
|
* Source de verite : `useAuthStore().user`, qui porte le payload /api/me
|
||||||
|
* incluant `isAdmin` et `effectivePermissions` (tableau trie sans doublons).
|
||||||
|
*
|
||||||
|
* Regle de bypass dupliquee avec `PermissionVoter` (back) :
|
||||||
|
* si `user.isAdmin === true`, toutes les permissions sont accordees.
|
||||||
|
* Cette duplication est volontaire pour offrir un feedback UI immediat
|
||||||
|
* sans aller-retour serveur. Si la regle de bypass change cote back
|
||||||
|
* (decision architecturale #343 section 11), ce composable DOIT evoluer
|
||||||
|
* en meme temps.
|
||||||
|
*
|
||||||
|
* Stateless : aucun ref module-level, tout passe par Pinia. Le reset est
|
||||||
|
* assure automatiquement par `authStore.logout()` qui efface `user`.
|
||||||
|
*/
|
||||||
|
export function usePermissions() {
|
||||||
|
const auth = useAuthStore()
|
||||||
|
|
||||||
|
function can(code: string): boolean {
|
||||||
|
const user = auth.user
|
||||||
|
if (!user) return false
|
||||||
|
if (user.isAdmin) return true
|
||||||
|
return user.effectivePermissions.includes(code)
|
||||||
|
}
|
||||||
|
|
||||||
|
function canAny(codes: string[]): boolean {
|
||||||
|
return codes.some(can)
|
||||||
|
}
|
||||||
|
|
||||||
|
function canAll(codes: string[]): boolean {
|
||||||
|
return codes.every(can)
|
||||||
|
}
|
||||||
|
|
||||||
|
return { can, canAny, canAll }
|
||||||
|
}
|
||||||
@@ -2,4 +2,8 @@ export interface UserData {
|
|||||||
id: number
|
id: number
|
||||||
username: string
|
username: string
|
||||||
roles: string[]
|
roles: string[]
|
||||||
|
/** Vrai si l'utilisateur a le bypass admin total (voir ticket #343 section 11). */
|
||||||
|
isAdmin: boolean
|
||||||
|
/** Codes de permission effectifs de l'utilisateur, tries alphabetiquement, sans doublon. */
|
||||||
|
effectivePermissions: string[]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user