Een manier van een rechten systeem
We gaan uit van een website die meerdere pagina's heeft en je wilt gebruikers verschillende rechten toewijzen. Iedere pagina heeft ook weer zijn eigen functionaliteiten:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Nieuws
- Toevoegen
- Wijzigen
- Verwijderen
- Goedkeuren
Games
- Toevoegen
- Wijzigen
- Verwijderen
- Goedkeuren
- Toevoegen
- Wijzigen
- Verwijderen
- Goedkeuren
Games
- Toevoegen
- Wijzigen
- Verwijderen
- Goedkeuren
Hoe zou jij dit oplossen? Je kunt dit namelijk op verschillende manieren doen. Hier een voorbeeld zoals het zou werken, maar niet optimaal is.
Om gebruikers te koppelen aan functionaliteiten maken we een tabel aan die functioneert tussen gebruiker en functionaliteiten met de kolommen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `user_rights` (
`tid` INT( 11 ) NOT NULL ,
`news_add` ENUM( '0', '1' ) NOT NULL ,
`news_edit` ENUM( '0', '1' ) NOT NULL ,
`news_delete` ENUM( '0', '1' ) NOT NULL ,
`news_approve` ENUM( '0', '1' ) NOT NULL ,
`games_add` ENUM( '0', '1' ) NOT NULL ,
`games_edit` ENUM( '0', '1' ) NOT NULL ,
`games_delete` ENUM( '0', '1' ) NOT NULL ,
`games_approve` ENUM( '0', '1' ) NOT NULL ,
PRIMARY KEY ( `tid` )
)
`tid` INT( 11 ) NOT NULL ,
`news_add` ENUM( '0', '1' ) NOT NULL ,
`news_edit` ENUM( '0', '1' ) NOT NULL ,
`news_delete` ENUM( '0', '1' ) NOT NULL ,
`news_approve` ENUM( '0', '1' ) NOT NULL ,
`games_add` ENUM( '0', '1' ) NOT NULL ,
`games_edit` ENUM( '0', '1' ) NOT NULL ,
`games_delete` ENUM( '0', '1' ) NOT NULL ,
`games_approve` ENUM( '0', '1' ) NOT NULL ,
PRIMARY KEY ( `tid` )
)
De `tid` (to ID) verwijst naar de gebruiker en de rest spreekt voor zich.
Stel Klaas mag:
- Nieuws toevoegen
- Nieuws wijzigen
- Games wijzigen
- Games verwijderen
Dan zou een rij in deze kolom er als volgt uit zien:
Code (php)
1
2
2
tid news_add news_edit news_delete news_approve games_add games_edit games_delete games_approve
25 1 1 0 0 0 1 1 0
25 1 1 0 0 0 1 1 0
Stel dat Klaas nu op 'wijzigen' klikt. Dan zou dat er in PHP zo uit moeten zien:
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
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
<?php
// connect to database
include('includes/database.inc.php');
// retrieve the rights
$rights_sql = "SELECT * FROM user_rights WHERE tid = " . mysql_real_escape_string($_SESSION['user_id']);
if (!$rights_res = mysql_query($rights_sql))
trigger_error('Fout in query: ' . mysql_error());
else
{
if (mysql_num_rows($rights_res) >= 1)
$rights = mysql_fetch_assoc();
}
// the different pages
if ($_GET['show'] == 'nieuws')
{
// add
if ($_GET['page'] == 'add' && $rights['news_add'] == 1)
echo 'Add news';
elseif ($_GET['page'] == 'edit' && $rights['news_edit'] == 1)
echo 'Edit news';
elseif ($_GET['page'] == 'delete' && $rights['news_delete'] == 1)
echo 'Delete news';
elseif ($_GET['page'] == 'approve' && $rights['news_approve'] == 1)
echo 'Approve news';
else
echo 'Show overview news items';
}
elseif ($_GET['show'] == 'games')
{
if ($_GET['page'] == 'add' && $rights['games_add'] == 1)
echo 'Add a game';
elseif ($_GET['page'] == 'edit' && $rights['games_edit'] == 1)
echo 'Edit a game';
elseif ($_GET['page'] == 'delete' && $rights['games_delete'] == 1)
echo 'Delete';
elseif ($_GET['page'] == 'approve' && $rights['games_approve'] == 1)
echo 'Approve a game';
else
echo 'Show overview with games';
}?>
// connect to database
include('includes/database.inc.php');
// retrieve the rights
$rights_sql = "SELECT * FROM user_rights WHERE tid = " . mysql_real_escape_string($_SESSION['user_id']);
if (!$rights_res = mysql_query($rights_sql))
trigger_error('Fout in query: ' . mysql_error());
else
{
if (mysql_num_rows($rights_res) >= 1)
$rights = mysql_fetch_assoc();
}
// the different pages
if ($_GET['show'] == 'nieuws')
{
// add
if ($_GET['page'] == 'add' && $rights['news_add'] == 1)
echo 'Add news';
elseif ($_GET['page'] == 'edit' && $rights['news_edit'] == 1)
echo 'Edit news';
elseif ($_GET['page'] == 'delete' && $rights['news_delete'] == 1)
echo 'Delete news';
elseif ($_GET['page'] == 'approve' && $rights['news_approve'] == 1)
echo 'Approve news';
else
echo 'Show overview news items';
}
elseif ($_GET['show'] == 'games')
{
if ($_GET['page'] == 'add' && $rights['games_add'] == 1)
echo 'Add a game';
elseif ($_GET['page'] == 'edit' && $rights['games_edit'] == 1)
echo 'Edit a game';
elseif ($_GET['page'] == 'delete' && $rights['games_delete'] == 1)
echo 'Delete';
elseif ($_GET['page'] == 'approve' && $rights['games_approve'] == 1)
echo 'Approve a game';
else
echo 'Show overview with games';
}?>
Dit is een erg simpele manier om het te doen. EĆ©ntje die ik ook vaak tegen kom en werkt, maar niet optimaal is. Stel nu dat een gebruiker die games mag verwijderen, ze ook automatisch mag toevoegen, wijzigen en goed mag keuren? Dan krijg je in PHP iets als:
Code (php)
Stel nu dat gebruikers die mogen wijzigen, ook mogen toevoegen, dan kun je erg lange if statements krijgen. Dit is niet het geval als je de bitwise methode gebruikt. Zie de volgende pagina voor uitleg.
« vorige pagina | volgende pagina »