Toegangsniveau per 'module'
Ik ben bezig met een intranet voor de lokale omroep waar ik werk.
Nu kan je verschillende functie's hebben (DJ, Techniek, Bestuur, etc.) Maar natuurlijk kan je ook meerdere functie's hebben. Dus met een simpel toegangsniveau voor elk redt ik het niet, omdat je meerdere functies kan hebben (in theorie alles tegelijk).
Dus hoe kan ik per gebruiker zeggen voor welke module's hij/zij toegang heeft?
Ik hoop dat iemand met een oplossing komt!
Zelf zou ik denken aan een ACL, of RBAC systeem, waarmee je kan bepalen wie er toegang heeft, wie dingen mag aanpassen en wie dingen kan toevoegen en wie dingen mag verwijderen.
Als je dit in een database opslaat zou je dus een tabel users en een tabel user_ranks kunnen hebben met in de tabel user_ranks een foreign key naar users.
je maakt een tabel users hierin staat een role id.
Dan maak je een tabel role_permissions met daarin roleid, object en permission
voorbeeld table role_permissions:
roleid|object|permission
1|news|view
1|news|add
2|news|view
3|een module|view
3|een module|delete
In gebruik ziet het er dan zo uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$identity = unserialize($_SESSION['identity']);
//als gebruiker geen toestemming heeft dan sturen we hem terug naar de login pagina
if(!$identity->hasPermission('news','view')){
header('Location: login');
exit;
}
?>
$identity = unserialize($_SESSION['identity']);
//als gebruiker geen toestemming heeft dan sturen we hem terug naar de login pagina
if(!$identity->hasPermission('news','view')){
header('Location: login');
exit;
}
?>
Je heb ook nog een tabel roles, maar deze is alleen voor informatie over de role zoals naam.
Ik denk dat dit is wat jij zoekt.
Gewijzigd op 20/03/2013 19:18:36 door Tim S
Zou je me misschien meer kunnen vertellen hoe je de tabellen hebt opgebouwd?
En in dat code-voorbeeld heb je een identity, wat houd die in?
Alvast bedankt!
In dit geval het het systeem geschreven voor mijn cms en heb ik voor de user en role klasse een soort van model
gemaakt omdat ik ook met een controller werk.
Ik zal een voorbeeld geven van de login pagina:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
De authenticatie klasse controleert of de gebruiker bestaat en zo ja maak ik een accessIdentity(identity) aan.
De identity is een instantie van de authenticatie klasse met daarin de rolepermissions roleid en user id.
Met de identity kan ik dan bepalen of de gebruiker toestemming heeft om iets te doen/bezoeken. Ook kan ik een userid of roleid opvragen om zo informatie over de gebruiker of role op te halen.
Om het wat duidelijker te maken hier ook de authenticatie klasse:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
class Authentication{
private $userModel;
private $roleModel;
private $status;//houdt de status van de validatie, 1 = valid,
private $roleId;//roleId van de gebruiker
private $userId;//userId van de gebruiker
private $userName;
private $permissions = array();//toestemmingen die gebruiker heeft
public function __construct(){
$this->user = new model\User;
$this->roleModel = new model\Role;
}
public function getUserId(){
return $this->userId;
}
public function getRoleId(){
return $this->roleId;
}
public function getUserName(){
return $this->userName;
}
//kijk of de gebruiker is wij hij zegt dat hij is, zo ja update status en haal user en roleid op
public function authenticate($name,$pass){
if($this->user->isValid($name,$pass)){
$this->user->conserveByCredentials($name,$pass);
$this->roleId = $this->user->get('role_id');
$this->userId = $this->user->get('id');
$this->userName = $this->user->get('login_name');
$this->status = 1;
}
return $this;
}
//als de gebruiker valid is return true, dez methode valideerd niet zelf
public function isValid(){
if($this->status == 1){
return true;
}
}
//creer een toegangs object welke kan bepalen waar een gebruiker toestemming voor heeft.
//In dit object staan ook de userId en de roleid ter identificatie
public function createAccessIdentity(){
$this->permissions = $this->roleModel->getPermissions($this->roleId);
return $this;
}
public function __sleep(){
return array('roleId','userId','userName','permissions');
}
public function hasPermission($module,$perm){
foreach ($this->permissions as $permission){
if($permission['object'] == $module && $permission['permission'] == $perm || isset($permission['admin']) && $permission['admin'] == 'admin'){
return true;
}
}
}
}
?>
class Authentication{
private $userModel;
private $roleModel;
private $status;//houdt de status van de validatie, 1 = valid,
private $roleId;//roleId van de gebruiker
private $userId;//userId van de gebruiker
private $userName;
private $permissions = array();//toestemmingen die gebruiker heeft
public function __construct(){
$this->user = new model\User;
$this->roleModel = new model\Role;
}
public function getUserId(){
return $this->userId;
}
public function getRoleId(){
return $this->roleId;
}
public function getUserName(){
return $this->userName;
}
//kijk of de gebruiker is wij hij zegt dat hij is, zo ja update status en haal user en roleid op
public function authenticate($name,$pass){
if($this->user->isValid($name,$pass)){
$this->user->conserveByCredentials($name,$pass);
$this->roleId = $this->user->get('role_id');
$this->userId = $this->user->get('id');
$this->userName = $this->user->get('login_name');
$this->status = 1;
}
return $this;
}
//als de gebruiker valid is return true, dez methode valideerd niet zelf
public function isValid(){
if($this->status == 1){
return true;
}
}
//creer een toegangs object welke kan bepalen waar een gebruiker toestemming voor heeft.
//In dit object staan ook de userId en de roleid ter identificatie
public function createAccessIdentity(){
$this->permissions = $this->roleModel->getPermissions($this->roleId);
return $this;
}
public function __sleep(){
return array('roleId','userId','userName','permissions');
}
public function hasPermission($module,$perm){
foreach ($this->permissions as $permission){
if($permission['object'] == $module && $permission['permission'] == $perm || isset($permission['admin']) && $permission['admin'] == 'admin'){
return true;
}
}
}
}
?>
Ik wil je best wat verder helpen als je dit wat vindt maar dan moet je zelf ook wat maken en wat posten.
Gewijzigd op 20/03/2013 20:40:59 door Tim S
Ik heb nu enkele tabellen:
Quote:
acl_apps
- app_id
- name
- description
acl_users
- user_id
- (verdere gebruikerinfo als ww en username)
acl_roles
- role_id
- name
- app_id
acl_user_perms
- role_id
- user_id
- app_id
- name
- description
acl_users
- user_id
- (verdere gebruikerinfo als ww en username)
acl_roles
- role_id
- name
- app_id
acl_user_perms
- role_id
- user_id
Stel ik kom nu op een pagina (app = 'Redactie'), dan moet er 'uitgezocht' worden wat ik mag, dus welke 'roles' ik heb. Dat staat in de acl_user_perms tabel.
Hoe controleer ik nou of ik toestemming heb? (de user_id staat in een sessie)
Gewijzigd op 24/03/2013 15:39:33 door Jelle Hi