OOP authorisation
Geen vragen over waar de fout zit, maar gewoon even kijken of ik het bij het rechte eind heb.
Ik ben bezig met een authorisatie classe.
Ik heb de volgende eisen:
- Inloggen
- Registreren -> activatie mail
- Bitewise rechten systeem
- users
- gewone users
- premium users
- administrators
Hoe kan ik dit het beste OOP bouwen, als in, in hoeveel classes moet ik dit opbreken?
Ik denk niet dat het handig is om meerdere instanties rond te hebben zweven als het gaat om zo'n class voor rechten, dus ik zou die overkoepelende class een singleton maken. (statisch kan ook, dat is voor kleinere projecten praktischer)
Deze overkoepelende class zal voor de rest van je code je enige aanspreekpunt zijn om te vragen of een gebruiker een bepaalde actie mag uitvoeren.
Die overkoepelende class moet dan een beslissing kunnen maken, en heeft daarvoor nodig wat wie wanneer kan. Ik zou voor een soort insteek-module gaan die dit voor je doet. Die krijgt dan een user-id, een subject-id (het 'iets' wat de actie ondergaat) en de actie. Bijv. user-24 edit post-32. Die geeft dan true of false terug. Je zou eventueel meerdere van dit soort insteek-modules tegelijk kunnen gebruiken, om zo regels die keihard zijn te scheiden van regels die kunnen veranderen. Moet je wel een oplossing vinden voor tegenstrijdige antwoorden (de ene module zegt true, de ander false, wat dan?)
De overkoepelende class wil ook weten of en wie er op dit moment is ingelogd. Vanwege PHP is dat makkelijk, er is maar één iemand per proces ingelogd. Ik zou ook hier (of juist hier) van die modules gebruiken, zodat je meerdere manieren van inloggen zou kunnen maken (denk aan wachtwoord, maar ook openid of oauth) In die module kan je dan ook het registratieproces opnemen, maar daar heeft het controleproces verder niet zoveel mee te maken.
Authorization
+ instance()
- authenticate($method_name, $arguments)
- userCan($user_id, $action, $subject) returns boolean
- currentUserCan($action, $subject) returns boolean
- addAuthenticationMethod($name, AuthenticationMethod $method)
- addAuthorizationModule(AuthorizationModule $module)
AuthenticationMethod
- authenticate($arguments) returns int $user_id
AuthorizationModule
- userCan($user_id, $action, $subject)