PHP Portal » PHP Forum » Entwicklung » Brainstorming und Code-Küche » Rechtesystem » Antworten

Antwort erstellen

Titel
Formatierung
b i u
Beitrag  
Datei anhängen max: 2M
Optionen







Spamschutz Eingabeformat HH:MM

Rechte System 

Hab dir mal so ein Rechte system geschrieben.

Datei absgruppen.php

PHP Code
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
<?php /** * Abstrace Gruppen * @version 1.2 * @author Splasch * @Filename: absgruppen.php * Benutzer Verwaltung **/ if (0 > version_compare(PHP_VERSION, '5')) { die('Dieses File wurde generiert für PHP 5'); } abstract class Absgruppen { private $gruppen = array(); # Gruppen Objekte private $allName = array(); # Namen aller Instanzierten Gruppen /** * Neue Gruppe den User hinzufügen * @param $gruppe Objekt * @param $name String * @return void */ abstract public function addGruppe(Gruppe $gruppe,$name); /** * Neues Objekt der Gruppe in Array Speichern und den Gruppen Namen * @param $gruppe Objekt * @param $name String * @return void * Nur hinzufügen wenn das Objekt noch nicht vorhanden ist */ function setGruppe(Gruppe $gruppe,$name) { if(is_object($this->gruppen[$name])) { echo "Gruppe <b>".$name."</b> schon drin."; return; } $this->gruppen[$name]=$gruppe; $this->allName[]=$name; } /** * Gibt das Angeforderte Gruppen Objekt zurück * @param $index String * @return gruppen Objekt */ function gibGruppe($index) { return $this->gruppen[$index]; } /** * Gibt die Namen Aller Gruppen zurück * @param * @return array */ function gibGrupNames() { return $this->allName; } } ?>


Datei access.php

PHP Code
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php /** * Access Zugangs Prüfung * @version 1.1 * @author Splasch * @File: access.php * Benutzer Verwaltung **/ if (0 > version_compare(PHP_VERSION, '5')) { die('Dieses File wurde generiert für PHP 5'); } class Access { /** * * @param * @return null */ public function __construct() { } /** * Pürfen ob der Zugriff zur Seite Erlaubt ist * @param $user Objekt * @param $seite String * @return bolean */ public function zugang(User $user,$seite) { # Session Prüfen if (!$this->checkSession()) { return false; } foreach ($user->getGrupNames() as $gruppe) { if (array_key_exists($seite,$user->getGruppen($gruppe)->getRechte())) { return true; } #echo "nicht enthalten in: ".$gruppe.ž; } return false; } /** * SESSION Prüfen * @return bolean */ protected function checkSession() { if (!isset($_SESSION["zugang"]) or $_SESSION["zugang"]==""or $_SESSION['broswer'] != $_SERVER['HTTP_USER_AGENT']or $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'] ) { return false; } else { # Session Prüfung bestanden return true; } }//ende checkSession /** * Gibt alle Rechte aus allen Gruppen zurück * Führt die Rechte zusammen und Filtert doppelte Werte * @param * @return array */ public function alleRechte(User $user) { $rechte=array(); foreach ($user->getGrupNames() as $gruppe) { foreach ($user->getGruppen($gruppe)->getRechte() as $key=>$inhalt) { if(!array_key_exists($key,$rechte)) { $rechte[$key]=$inhalt; } } } #asort($rechte); return $rechte; } /** * Leitet den Logout ein * @param * @return null */ public function logout() { $pfad=$_SERVER['PHP_SELF']; $pfad=dirname($pfad); $pfad=str_replace( '?',"",$pfad); $pfad=str_replace( '/php',"",$pfad); session_unset(); session_destroy(); echo 'Ausgelogt'; $umleitung =$pfad."/index.php"; header("Location: ".$pfad); exit(); } } ?>


Datei dbpdo.php (Datenbank verbindung)

PHP Code
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
<?php /** * Datenbank Klasse * @version 1.1 * @author Splasch * Filename: dbpdo.php * Verbindung über die PDO herstellen **/ class Dbpdo { private $uid=dbuid; #Benutzename private $pw=dbPw; #Password private $serv=dbServ; #Datenbank Server private $dbname=dbname; #Datenbank Name protected static $db_obj = null; #Datenbank Objekt PDO public $error; #Fehler Varibale /** * Klassen aufruf PDO verbindung aufbauen * */ public function __construct() { $db="mysql:dbname=".$this->dbname.";host=".$this->serv; #mysql:dbname=Datenbankname;host=localhost try { self::$db_obj = new PDO($db, $this->uid, $this->pw,array ( PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING #PDO::ERRMODE_EXCEPTION #PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true ) ); } catch (PDOException $e) { $this->error='Fehler beim Öffnen der Datenbank: ' . $e->getMessage(); echo $this->error; #Fehler ausgabe } } /** * Eine Instanz des PDO Objektes übergeben * @return Objekt $db_obj */ public static function get_db() { if(is_null(self::$db_obj)) { self::$db_obj = new Dbpdo(); } return self::$db_obj; } } // Ende Klasse ?>


Datei gruppe.php

PHP Code
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
<?php /** * Gruppe mit Rechten * @version 1 * @author Splasch * @Filename: gruppe.php * Benutzer Verwaltung **/ if (0 > version_compare(PHP_VERSION, '5')) { die('Dieses File wurde generiert für PHP 5'); } class Gruppe { protected $re_name = array(); # Beschreibungs Name des Zugriffs | Seitenkennung(id) für den Zugriff protected $gruppenName; # Name der Gruppe /** * Ladet Gruppen Rechte * @param $rename Array * @param $gruppe String * @return null */ public function __construct($rename,$gruppe) { $this->re_name=$rename; $this->gruppenName=$gruppe; } /** * Gibt den Gruppenname wieder * @param null * @return String */ public function getName() { return $this->gruppenName; } /** * Gibt den Rechte Namen wieder * @param null * @return array */ public function getRechte() { return $this->re_name; } } ?>


Datei user.php

PHP Code
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
<?php /** * User * @version 1.2 * @author Splasch * @Filename: user.php * Benutzer Verwaltung **/ if (0 > version_compare(PHP_VERSION, '5')) { die('Dieses File wurde generiert für PHP 5'); } class User extends Absgruppen { protected $user_id = 0; # Benutzer Nummer protected $user_name = ''; # Benutzer Name protected $user_mail = ''; # E-Mail Adresse /** * User Profil Eigenschaften füllen * @param $profil array * @return null */ public function __construct($profil) { if(is_array($profil)) { $this->user_id=$profil['id']; $this->user_name=$profil['name']; $this->user_mail=$profil['mail']; } return false; } /** * Neue Gruppe den User hinzufügen * @param $gruppe Objekt * @param $name String * @return void */ public function addGruppe(Gruppe $gruppe,$name) { $this->setGruppe($gruppe,$name); } /** * Gibt das Angeforderte Gruppen Objekt zurück * @param $index String * @return gruppen Objekt */ public function getGruppen($index) { return $this->gibGruppe($index); } /** * Gibt die Namen Aller Gruppen zurück * @param * @return array */ public function getGrupNames() { return $this->gibGrupNames(); } } /* end of class User */ ?>


Zu guter Letzt ein Anwendungs Beispiel: Test durchgang File

PHP Code
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
98
99
100
<?php /** * TEST * @version 1.2 * @author Splasch * @Filename: * Benutzer Verwaltung **/ include('config.php'); include('dbpdo.php'); include('gruppe.php'); include('absgruppen.php'); include('user.php'); include('access.php'); #User Dumy Profil $profil = array("name"=>"Nubon", "id"=>"4", "mail"=>"nubon@ttt.de" ); $user = new User($profil); #Laden der Berechtigungen $sql="SELECT grup_id,grup_name,re_name,re_bez FROM admin_gruppen,admin_rechte,gruppen,rechte WHERE f_userid='1' AND grup_id=admin_gruppen.f_grupid AND admin_gruppen.f_grupid=admin_rechte.f_grupid AND rechte.re_id = admin_rechte.f_reid ORDER by grup_name"; $obj= new Dbpdo(); $stmt =Dbpdo::get_db()->query($sql); $gruppe=""; while ($data = $stmt->fetch(PDO::FETCH_OBJ)) { if($gruppe=="" || $gruppe == $data->grup_name) { $rechte[$data->re_name]=$data->re_bez; $gruppe=$data->grup_name; echo $gruppe.""; } else { # Alle Rechte der Gruppe laden $grupobj= new Gruppe($rechte,$gruppe); # Gruppe erstellen unset($rechte); $user->addGruppe($grupobj,$gruppe); # Gruppe den User zuweisen # Weiter Gruppen daten einlesen $rechte[$data->re_name]=$data->re_bez; $gruppe=$data->grup_name; echo "else:".$gruppe.""; } } #Letzte Gruppe erstellen falls vorhanden if (is_array($rechte)) { $grupobj= new Gruppe($rechte,$gruppe); # Gruppe erstellen $user->addGruppe($grupobj,$gruppe); # Gruppe den User zuweisen echo "last:".$gruppe.""; } # Test Doppel belegung abfangen $user->addGruppe($grupobj,"Support"); # Doppel belegung echo"Test Objekt Array Zugriff User"; echo $user->getGruppen('Super Admininstrator')->getName().""; #Gruppen Namen der GGruppe admin ausgeben var_dump($user->getGruppen('Super Admininstrator')->getRechte()); #Gruppen Rechte der Gruppe admin ausgeben echo" Rechte von Support"; var_dump($user->getGruppen('Support')->getRechte()); #Gruppen Rechte der Gruppe support ausgeben echo" Alle Instanzierten Gruppen-Namen"; var_dump($user->getGrupNames()); # Test Seiten Prüfdurchgang echo""; /* foreach ($user->getGrupNames() as $gruppe) { if (array_key_exists("log",$user->getGruppen($gruppe)->getRechte())) { echo"zugriff erlauben gefunden in der Gruppe: ".$gruppe.""; break; } echo "nicht enthalten in: ".$gruppe.""; } */ $access = new Access(); if(!$access->zugang($user,"log")) { die('Zugriff auf die Seite Verweigert'); } echo "Zugang Erlaubt"; ?>


Im Anhang siehst das Datenbank diagram für das Rechte system der obigen Klassen.

Sql Datenbank

PHP Code
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
-- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `admin_gruppen` -- CREATE TABLE IF NOT EXISTS `admin_gruppen` ( `f_userid` int(10) unsigned NOT NULL, `f_grupid` int(11) NOT NULL, PRIMARY KEY(`f_userid`,`f_grupid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `admin_rechte` -- CREATE TABLE IF NOT EXISTS `admin_rechte` ( `f_reid` int(11) NOT NULL, `f_grupid` int(10) unsigned NOT NULL, PRIMARY KEY(`f_reid`,`f_grupid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `gruppen` -- CREATE TABLE IF NOT EXISTS `gruppen` ( `grup_id` int(11) NOT NULL AUTO_INCREMENT, `grup_name` varchar(45) NOT NULL, PRIMARY KEY(`grup_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ; -- -------------------------------------------------------- -- -- Tabellenstruktur für Tabelle `rechte` -- CREATE TABLE IF NOT EXISTS `rechte` ( `re_id` int(11) NOT NULL AUTO_INCREMENT, `re_name` varchar(20) NOT NULL, `re_bez` varchar(30) NOT NULL, PRIMARY KEY(`re_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Mfg Splasch

 

Habe werde noch.

 

nö, aber das ist doch mit dem DBDesigner bzw. der MySQL-Workbench innerhalb von Sekunden zusammengeklickt

 

Ich gehen mal davon aus, das du so ein Rechtesystem schon hast, kannst du davon mal die SQL-Struktur posten?

 

so sehe ich das auch,
kannst natürlich noch weiter gehen,
und eine recht_person anlegen für Sonderrechte