Yii RBAC – Rollenbasierte Rechte und mehr – Teil 4

In diesem Artikel soll es um die YII RBAC (Yii Role Based Access Control) gehen. Auf deutsch Rollenbasierte Benutzer Rechte.

Dabei haben wir viel mehr Möglichkeiten, als nur Rechte in Rollen zu vergeben, wie das geht möchte ich in diesem Artikel schildern.

Dieser Artikel ist Teil der Artikelserie über das Yii User Management.

Was ist das YII RBAC

Das Modell der Yii RBAC setzt das in der ANSI-Norm 359-2004 genannte Role Based Access Control (RBAC) um. Jedes Mehrbenutzersystem hat bei vielen Benutzern das Problem, dass die Rechte der Benutzer immer komplizierter zu pflegen werden. Das RBAC soll genau dies vereinfachen und das Problem besiegen.

Dabei werden die Benutzer einer oder mehreren Rollen zugewiesen. In vielen Systemen wird erzwungen, dass ein Benutzer mindestens einer Rolle zugewiesen sein muss. Oft ist es jedoch möglich, einen Benutzer mehrere Rollen zu geben. Die meisten sehen die Rechteverwaltung über ein RBAC als bestes Verfahren an.

In den Yii RBAC ist es nicht nur möglich einem Benutzer eine oder mehrere Rollen zu geben. Es ist darüber hinaus auch möglich, einzelnen Benutzern über die Rechte der Rolle noch einzelne Rechte zu geben. Da dies jedoch dann wieder mit der Zeit unübersichtlich wird, empfehle ich dies nur im äußersten Notfall zu tun. Aber auch hier gibt es Anwendungsfälle, für die es einfacher bzw. besser ist dies so umzusetzen.

Business Regeln

Mit Business Regeln sind zu deutsch Geschäftsregeln gemeint. Geschäftsregeln sind mit Entscheidungstabellen vergleichbar. Geschäftsregeln bzw. entsprechende Entscheide treffen wir sehr oft am Tag. Die Geschäftsregeln setzen genau dies um. Beispiel: Wenn es 12 Uhr ist und wenn es Mittwoch ist, dann hole ich das Kind vom Kindergarten ab. So ist es möglich, mit den Geschäftsregeln das Rechte Management auf bestimmte Entscheidungen auszubauen. Zum Beispiel kann ich bestimmten Benutzern nur zu bestimmten Uhrzeiten Zugriff gewähren. Genau dies beschreiben die Geschäftsregeln. Geschäftsregeln sind im Yii User Management tief verankert und schon Integriert. Wir müssen diese nur anwenden.

Tätigkeiten

Als Tätigkeiten gelten alle Actions unserer Controller. Beziehungsweise würde ich eher umgekehrt sagen, alle Actions können eine Tätigkeit darstellen. Beim Yii RBAC wenden wir auch die Tätigkeiten an. Wir weisen die erlaubten Tätigkeiten entsprechenden Rollen zu. Damit aber kein unbefugter Zugriff bekommt, gehen wir besser umgekehrt vor. Wir verbieten allen alles und erlauben nur den gewünschten Benutzern (mit der bestimmten Rolle) die Tätigkeit. So können wir auch unterscheiden, ob ein Benutzer etwas bearbeiten darf oder nur ansehen. Beides stellt eine eigene Tätigkeit dar. Das Yii RBAC basiert auf Tätigkeiten. Die Rollen des Yii RBAC bringen uns rein gar nichts wenn wir diesen keine Tätigkeiten zuweisen können. Denn dann müssten wir im Quellcode wieder verankern wer was dürfte. Und genau das wollen wir mit dem Yii RBAC verhindern, Rechte sollen einfach, schnell und sicher verwaltbar sein.

Was meint Ihr zu den Yii RBAC?

Veröffentlicht unter Allgemein | Verschlagwortet mit , , | 3 Kommentare

Erweiterungen und verbesserungen für die Yii User Identity class – Teil 3

Dieser Artikel ist ein Beispiel, wie einfach das Hinzufügen von beliebigen Daten zur Yii User Identity Class ist. Dieser Artikel ist Teil der Artikelserie über das Yii User Management.

In diesem Artikel möchte ich zeigen, wie es möglich ist, schon beim Loginprozess noch weitere Daten im System zu speichern. In vielen Fällen ist es sinnvoll, schon direkt nach der Login Prozedur auf die Benutzerdaten zugreifen zu können.

Wie schon erwähnt, möchte ich hier noch einige Anmerkungen zum letzten Artikel machen. Wir möchten in der Yii User Identity Class gleich noch weitere Daten des Benutzers setzen, so dass diese direkt nach dem Login Prozess zur Verfügung stehen. Glücklicherweise bietet uns die Yii User Identity Class diese Möglichkeiten schon ohne weitere Implementierung neuer Methoden.

Mit folgendem Code können wir beispielsweise weitere Benutzerdaten zu den Identitätsdaten des Benutzers speichern:

1
$this->setState('vorname', $vorname);

Wie wir sehen, können wir also hier in der Yii User Identity Class noch beliebige weiter Daten setzen. Auf diese Daten können wir dann mit der Yii CWebUser Instanz darauf zugreifen. Und genau dies erfolgt genauso wie wir den Login ansteuern.

1
2
// Folgendes Beispiel würde uns dann also den Vornamen des Benutzers ausgeben
echo YII->app()->user->vorname;

So ist es dann direkt nach dem Login möglich, schon im Ausgabeseite den Vornamen des Benutzers an zu zeigen. Viele Systeme machen nach dem Login erst einen Reload oder man muss sich um diese Daten zur Laufzeit wirklich selbst kümmern.

Da die Yii User Identity Class von CUserIdentity abgeleitet ist und diese wiederrum von CComponent, haben wir hier alle üblichen Möglichkeiten einer Komponente. Wir können der Yii User Identity Class noch Events anhängen oder wie es in Yii eben auch mit Behaviors gemacht wird. Dabei verhält sich die Yii User Identity Class ebenso, wie jede andere beliebige Klasse die von CComponent abgeleitet wurde.

Zum Thema Yii Events und Yii Behaviors werde ich bei Gelegenheit noch einen eigenen Artikel verfassen.

Veröffentlicht unter YII | Verschlagwortet mit , , , | 3 Kommentare

Erstellen der Yii UserIdentity und was diese genau ist – Teil 2

Das User Management ist eines der wichtigsten Dinge, die am sichersten programmiert werden müssen, wenn es darum geht, Benutzerzugänge zur Verfügung zu stellen. Dabei sollte man immer in Gedanken haben, dass es nicht nur friedliche Besucher auf einer Webseite gibt. Auch wenn ich von keiner kriminellen Kraft ausgehe, muss ich doch dennoch sicherstellen, dass kein unbefugter Zugriff möglich ist.

Dieser Artikel ist Teil 2 der Artikelserie über die Yii User Management und umfasst folgende Artikel:

Die Yii UserIdentity ist eine Klasse, die die Klasse CBaseUserIdentity ableitet, die wiederum das Interface IUserIdentity implementiert. Die Yii UserIdentity ist dazu da, die Identitätsinformationen eines Besuchers zu speichern. Wenn dieser sich an der Webseite anmeldet, so macht er dies in der Regel mit einem Benutzernamen und einem Passwort. Damit Authentifiziert er sich am System, so dass das System weis, dass der Besucher auf bestimmte Aktionen Zugriff haben darf. In der Yii UserIdentity werden die Authentifizierungsdaten über den gesamten Zeitraum, in dem die Authentifizierung gültig ist, gespeichert.

In der Yii UserIdentity findet auch die Authentifizierung selbst statt. Hier kann also auch noch mehr, als nur der Vergleich von Username und Passwort stattfinden. Beispielsweise wenn man manche IP-Bereiche von der Webseiten authentifizierung ausschließen möchte, kann man das hier implementieren.

Ich erstelle die Yii UserIdentity wie folgt:

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
/**
  * Erstellen der Yii UserIdentity Klasse
*/

class UserIdentity extends CUserIdentity
{
  private $_id;
  # Hier findet in der Yii UserIdentity die Authentifizierung statt.
  public function authenticate()
  {
    # Je nach Datenmodell kann dies natürlich entsprechend abweichen
    $record=User::model()->findByAttributes(array('username'=>$this->username));
    if($record===null)
      $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if($record->pw!==md5($this->password))
      $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
    {
      $this->_admin = $record->admin;
      $this->_id=$record->id;
      $this->errorCode=self::ERROR_NONE;
    }
    return !$this->errorCode;
  }
  // Diese Methode ist nicht unbedingt notwendig. Jedoch finde ich dass die
  // Methode getId die ID der UserIdentity zurückliefern sollte und nicht
  // den Username wie das normalerweise bei Yii ist.
  public function getId()
  {
    return $this->_id;
  }
}
Veröffentlicht unter YII | Verschlagwortet mit , , , | 3 Kommentare

Eigenes YII User Management – Teil 1

Mit diesem Artikel möchte ich eine Artikelserie starten, die über ein eigenes Yii User Management handelt. Ich komme selbst immer wieder in die Verlegenheit, dass ich das Yii User Management benötige aber weder installiert noch erweiterbar zur Hand habe.

Dies soll sich mit dieser Artikel Serie ändern.

Übersicht

In der Artikelserie über das Yii User Management möchte ich folgende Themen abhandeln:

Überblick

Wie schon gesagt möchte ich in dieser Artikelserie nicht nur einen Überblick, sondern auch genaueres Wissen über das Yii User Management weitergeben.

Da Yii schon von Grund auf mit dem User Management ausgestattet ist, müssen wir es in den meisten Fällen nur richtig anwenden. Es gibt sogar schon fertige Funktionen für rollen basierte Rechte.

Was wir aber in jedem Fall selbst tun müssen, ist uns um die Verwaltung des Yii User Management zu kümmern. Wir benötigen also einen Bereich, den nur User mit dem Status Admin aufrufen können, in dem wir Benutzer erstellen und verwalten können. Möchten wir die Rollenbasierten Rechte verwenden, so benötigen wir natürlich auch noch Ansichten für das Verwalten der Rollen. Den Rollen müssen dann auch noch die Aktionen zugeteilt werden, so dass genau festgelegt werden kann, welcher Yii User was machen kann.

Warum ein eigenes Yii User Management

Es gibt schon sehr nützliche Module für das Yii User Management. Mit diesen fertigen Modulen kann man schon sehr gut arbeiten. Wer möchte, kann die Module ja auch an das Konzept der eigenen Seite anpassen. Gerade wenn man speziellere Anwendungsfälle hat, bei denen ein besonderes Yii User Management wichtig ist, wird es einfacher, wenn man sich diese selbst erstellt. Dies geht relativ einfach in Yii.

Wie bei so vielen Dingen im Leben finde ich, dass es auch hier wichtig ist, dass das Yii User Management so einfach wie möglich ist. Genauso sollte dies auch zu dem Projekt passen. Gerade wenn man mit Leuten zu tun hat, die nicht so versiert sind im Umgang mit komplizierteren Webseiten. Dann tue ich mir selbst einen Gefallen, wenn ich es im Look und Layout der Seite erstellen kann.

Wie genau das geht möchte ich in dieser Artikelserie anhand von konkreten Code-Beispielen zeigen.

Falls Ihr Fragen habt hinterlasst mir bitte einen Kommentar.

Veröffentlicht unter Frameworks, YII | Verschlagwortet mit , , , , | 3 Kommentare

Shell Suchen

Nun möchte ich euch zeigen, wie ich mit einem neuen Befehl eine shell Suche ausführe. Auf der shell suchen ist manchmal gar nicht so einfach, wenn man die Befehle für das suchen nicht in und auswendig kennt. Ich tu mir hier immer ein wenig schwer, wenn ich mich länger nicht mit dem Thema der shell suche beschäftigt habe.

Mein neuer Befehl, mit dem ich auf der Shell suche, ist folgender:

1
cd /pfad/ins/verzeichnis/; fgrep -R "suchstring" * 2>/dev/null

Der Befehl „fgrep“ ist gleich dem Befehl „grep -F“. Allerdings ist das shell suchen mit fgrep schneller, wenn es sich um einen einfachen String handelt und nicht um einen Pattern.

Mit der Option -R löst der Befehl auch gleich das Problem, wenn man auf der shell rekursiv suchen möchte. Auf der Shell rekursiv suchen ist ein Thema, was mich schon oft und viel beschäftigt hat, weil man halt doch etwas öfters etwas sucht. Gerade wenn man mit zwielichtigen Angriffen zu kämpfen hat, ist das rekursive durchsuchen auf der Shell sehr wichtig.

Kennt Ihr noch einen einfacheren Befehl für das Suchen auf der Shell?

Veröffentlicht unter Linux Shell | Verschlagwortet mit , , , , | Schreib einen Kommentar

Typo3 Template erstellen

In diesem Artikel möchte ich euch zeigen, wie man sich ein Typo3 Template erstellen kann. Ich möchte dabei auch auf jegliche Plugins und Erweiterungen bewusst verzichten. Da ich immer wieder gehört habe, dass viele Ihre Typo3-Templates mit TemplaVoila ausstatten, möchte ich zeigen, dass es auch viel einfacher ohne geht.
Ich gehe hier beim Typo3 Template erstellen einfach von folgender HTML-Struktur aus:

1
2
3
4
5
6
7
8
9
10
<body>
<div>
   <div id="navigation">
       Bereich für die Navigation
   </div>
   <div id="inhalt">
      Bereich für den Inhalt
   </div>
</div>
</body>

Damit wir aber nun unsere TypoScript Objekte auch den Markern im Typo3 Template zuordnen können, müssen wir auch im HTML-Code diese Marker einfügen. Dies würde wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<body>
<!-- ###DOCUMENT_BODY### begin-->
<div>
   <div id="navigation">
      <!-- ###navigation### begin-->
      <!-- ###navigation### end-->
   </div>
   <div id="inhalt">
      <!-- ###inhalt### begin-->
      <!-- ###inhalt### end-->
   </div>
</div>
<!-- ###DOCUMENT_BODY### end-->
</body>

Nun haben wir zwar die Marker im HTML eingefügt, wissen aber immer noch nicht, wie wir das Typo3 Template erstellen können. Dazu müssen wir den HTML-Code in eine Datei speichern. Damit ich alle Dateien zum Typo3 Template erstellen an einem Ort habe, lege ich mir folgende Struktur in dem Ordner fileadmin an.

/fileadmin/template/main/start.html
/fileadmin/template/main/default.html
/fileadmin/template/main/img/
/fileadmin/template/main/css/

Um das Typo3 Template erstellen zu können, müssen wir unseren HTML-Code nun in die Datei default.html legen. In der Datei start.html können wir später, sofern wir das wünschen, ein eigenes Typo3 Template erstellen für die Startseite.

Nun müssen wir nur noch die Inhalte vom Typo3 in das Template kommen. Dazu erstellen wir am besten im Typo3 mindestens eine Seite und dazu noch ein wenig Inhalt. Nun müssen wir noch ein Typoscript Template hinzufügen. In dieses sogenannte Root Template müssen wir nun folgenden TypoScript Code einfügen.

1
2
3
4
5
6
7
8
9
10
temp.navi = HMENU
# In temp.navi die Definition für die Navigation einfügen
page = PAGE
page.10= TEMPLATE
page.10 {
template = FILE
template.file = fileadmin/templates/main/default.html
subparts.navigation &lt; temp.navi
subparts.inhalt &lt; styles.content.get
}

Dieser Code variiert natürlich je nach Inhalt, der auf der Seite dargestellt werden soll.

Ich bin immer ein Fan von eigenen Templates und nicht von irgendwelchen gekauften. Daher auch dieser Artikel. Er soll eine Art Hilfestellung beim Typo3 Template erstellen sein.

Wie Ihr jetzt ein Typo3 Template erstellen könnt wisst Ihr ja nun, aber vielleicht habt Ihr ja auch ganz eigene Wünsche für meinen nächsten Post. Hinterlasst mir einfach ein Kommentar unten.

Veröffentlicht unter Typo3 | Verschlagwortet mit , , | Schreib einen Kommentar

Über die Shell Dateien durchsuchen

Ich Suchte schon länger nach einer Möglichkeit auf der Shell Dateien zu durchsuchen. Für mich als Entwickler sind dabei natürlich einige Informationen die über die Shell bereit gestellt werden können sehr hilfreich. Das Beste Kommando was ich dazu gefunden habe und selbst sehr gerne verwende ist folgendes:

find -type f -exec grep -iHn „stCurlLink = base64_decode“ /dev/null {} \; 2>/dev/null > ~/finds.txt

Hier wird mit dem Shell Kommando find entsprechende Dateien gesucht und anschließend diese Dateien selbst mit grep durchsucht. Anschließend schmeiße ich durch 2>/dev/null die eventuell auszugebende Fehlermeldungen weg. Wer möchte kann im Schluss noch mit „> ~/finds.txt“ die Suchergebnisse noch in eine Datei schreiben.

Ich finde dass dies eine Solide Möglichkeit ist um nach gezielten Begriffen oder Zeichenfolgen zu Suchen. Dies kann natürlich noch beliebig ausgebaut werden, ist jedoch für meinen Fall völlig ausreichend.

Veröffentlicht unter Linux Shell | Verschlagwortet mit , , , | Schreib einen Kommentar

Dateien via .htaccess sperren

Ich habe ab und zu gerne .zip Dateien mit eigenen Inhalten auf meinem Webspace. Allein um diese via FTP jemanden bestimmten zur Verfügung zu stellen. Ungeschickt natürlich wenn Google dies mitbekommt und diese Dateien auch einliest. Oder der Link zu der Datei in falsche Hände gerät.

Um dies vorzubeugen kann man via Apache Konfiguration (.htaccess) die Auslieferung bestimmter Dateien verhindern. Der Code muss natürlich je nach Dateityp angepasst werden.

1
2
3
<FilesMatch “/.(zip|ZIP)$”>
deny from all
</FilesMatch>

In den Klammern stehen die Dateitypen die Gesperrt sind. Hier sind es also .zip und .ZIP Dateien. Sie können hier mit einem | getrennt alle Dateitypen eintragen, die vom Browser aus nicht aufrufbar sein sollen.

Veröffentlicht unter Allgemein | Schreib einen Kommentar

Umleitung von Datei oder Verzeichnis via .htaccess

In vielen Foren ist das Posten von Reflinks nicht gestattet.

Es gibt die Möglichkeit via .htaccess also via Apache Konfiguration einen Dateinamen vorzutäuschen. Zumindest im ersten Moment ist so nicht ersichtlich dass dies ein Reflink ist.

1
Redirect /webentwicklung.html https://www.ch-webdev.de

Wenn Sie also dann https://www.ch-webdev.de/webentwicklung.html eingeben würden Sie auf die Startseite weitergeleitet werden. Im gegensatz zu einem Redirect über eine HTML-Datei besitzt diese Möglichkeit den Vorteil dass der Server bei dem die Datei angefragt wird, die Anfrage direkt weiterleitet.

Allerdings ist leider nach dem Weiterleiten die volle URL auf die weitergeleitet wurde sichtbar. Das bedeutet natürlich auch dass alle die den Link anklicken und dann in die Browserzeile schauen sehen dass es sich um einen Reflink handelt.

Dieses vorgehen kann natürlich nicht nur für Reflinks verwendet werden. Ebenso natürlich um beliebige andere Weiterleitungen zu Realisieren.

Veröffentlicht unter Apache | Verschlagwortet mit , , , , , | Schreib einen Kommentar

Über PHP Datei über FTP übertragen

Mit PHP ist es relativ einfach über ein PHP-Script Dateien über FTP zu übertragen. Jedoch müssen wir vor der FTP-Übertragung noch einige vorarbeiten in PHP Leisten.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# FTP Host
$host = 'example.org';
# FTP-Benutzer
$user = 'example';
# FTP Passwort
$password = 'secret';
# Name der Datei die übertragen werden soll
$file = 'dateiname/mit/pfadangabe/und.endung';
# Name der Datei auf dem Remoteserver
$remote_file = 'dateiname.endung';
# Pfad auf dem Remote Server
$remote_path = '/htdocs/';

# FTP-Verbindung herstellen
$connection = ftp_connect($host);
# Login
ftp_login($connection, $user, $password);
# Verzeichnis wechseln
ftp_chdir($connection, $remote_path);
# Datei übertragen
ftp_put($connection, $remote_file, $file, FTP_BINARY);
# Verbindung schließen
ftp_close($connection);

Wie man an dem Script sehen kann ist es relativ einfach ein PHP-Script zu schreiben was eine Datei über FTP überträgt. Zu beachten ist dass die Datei für den Webserver (bzw. PHP) lesbar ist sonst kann diese nicht über FTP übertragen werden. Während der FTP können natürlich auch noch Fehler abgefangen werden, was relativ einfach ist und dem folgenden Beispiel folgt. Dies geht für alle FTP-Befehle.

1
2
3
if(!ftp_put($connection, $remote_file, $file, FTP_BINARY)){
echo 'Das PHP-Script hat bei der FTP-Übertragung einen Fehler festgestellt';
}

Es gibt noch einige andere Befehle mit denen über PHP mit einer FTP-Verbindung gearbeitet werden kann. Zu nennen ist hier auf jeden Fall noch ftp_delete($connection, $filename); mit dem eine Datei auf dem Remote-Server gelöscht werden kann.

Veröffentlicht unter PHP | Verschlagwortet mit , , , , | Schreib einen Kommentar