Ξεκινήστε το ACL στο CakePHP

02 Απρ 2010 | Development

Δεν επιτρέπονται τα σχόλια.


cakephp-logo

Το συστατικό ACL που συνοδεύει το CakePHP μπορεί να είναι αποθαρρύνει τους νέους χρήστες του CakePHP ή του ACL. Μόλις πάρετε την απόφαση να ασχοληθείτε με αυτό το συστατικό του CakePHP δεν θα θέλετε να επιστρέψετε με τίποτα ξανά πίσω. Η ευελιξία και η δύναμη του ACL αξίζουν να εγκατασταθούν στο site σας.

Τι είναι το ACL;

Το ACL ή Access Control List είναι μια κοινή έννοια για τον έλεγχο της πρόσβασης σε προγράμματα και ιστοσελίδες σε πολύ χαμηλό επίπεδο. Η βασική αρχή είναι απλή, έχετε τα “ποιος” και τα “τι”. Ο συνδυασμός αυτών τον δυο προσδιορίζει “ποιος” μπορεί να προσπελάσει “τι”.

Γιατί να χρησιμοποιήσετε το ACL;

Αν θέλετε η πρόσβαση στο site σας να μην είναι της μορφής “πρόσβαση σε όλα ή σε τίποτα” τότε θα πρέπει να χρησιμοποιήσετε το ACL. Το ACL σας επιτρέπει να ορίζετε ποιοι χρήστες θα έχουν πρόσβαση σε τι.

Πως να ξεκινήσετε με το ACL;

Πολλοί πιστεύουν πως δεν μπορεί το ACL να λειτουργήσει χωρίς το συστατικό Auth του CakePHP. Παρόλο που λειτουργούν άψογα το ένα με το άλλο, η χρήση του ACL δεν απαιτεί την ταυτόχρονη χρήση του Auth. Για να σας το αποδείξω, ομολογώ πως εγώ δεν χρησιμοποιώ καθόλου το Auth. Στην πραγματικότητα έχω αναπτύξει ένα αρκετά ισχυρό μοντέλο χρήστη που χειρίζεται της άδειες πρόσβασης, την εγγραφή, κ.α.

Απλά να θυμάστε πως το ACL ορίζει ποιος μπορεί να κάνει τι και το Auth ορίζει πως οι χρήστες μπαίνουν στο σύστημα.

Τα βασικά του ACL

Αρχικά σας προτείνω να ρίξετε μια ματιά στην ενότητα ACL στο εγχειρίδιο χρήσης του CakePHP. Αν μπορείτε να ανεχθείτε όλη την αναφορά στον Άρχοντα του δακτυλιδιού, θα μπορέσετε να βρείτε και τις πληροφορίες που ψάχνετε. Απλά να θυμάστε πως χρειάζεστε τη μέθοδο της βάσης δεδομένων όπως είναι στο αρχείο ini.

Αναβαθμίστε ένα υπάρχον site σε ACL

Για αρχή πάρτε μια σελίδα χαρτί. Σκεφτείτε το λίγο. Τα ποιος και τα τι στην ιστοσελίδα σας. Ένα απλό παράδειγμα μπορεί να μοιάζει κάπως έτσι.

Τα ποιος

Κρατήστε το απλό, έχουμε χρήστες και διαχειριστές.

[1] Χρήστες
	[4] Νίκος
	[5] Μαρία
	[6] Σοφία
[2] Διαχειριστές
	[3] Νίκος

Τα τι

Σε αυτή την ενότητα θα πρέπει να αφιερώσετε λίγο χρόνο παραπάνω για τη σχεδίαση. Σκεφτείτε για τα κοινά σημεία σε όλα τα μοντέλα ή της περιοχές της ιστοσελίδας σας.

[1] Ολόκληρο το site
	[2] Βασικά μοντέλα
		[4] Χρήστες
		[5] Εργαλειοθήκες
		[6] Αντικείμενα
	[3] Βοηθητικά μοντέλα
		[7] Ενέργειες
		[8] Προτεραιότητες
		[9] Ρυθμίσεις
		[10] Έλεγχοι Robots

Το κλειδί στο παράδειγμα είναι πως οι χρήστες θα πρέπει να μπορούν να δημιουργούν και να διαβάζουν στιγμιότυπα από τα βασικά μοντέλα, αλλά να μπορούν μόνο να διαβάζουν τα βοηθητικά μοντέλα.

Ο κώδικας τώρα που θα τα συνδυάσει όλα – acos, aros και aros_acos

Αυτός είναι ένας απλός ελεγκτής για την υλοποίηση του ACL για ένα από τα site μου. Τα βήματα που γίνονται είναι τα ακόλουθα :

  • Αρχικοποίηση των πινάκων με την ενέργεια initAcl
  • Στη συνέχεια αντιστοιχεί δικαιώματα (συνδέει τα ποιος με τα τι)
  • Στο τέλος κάνει δοκιμές για τα δικαιώματα
<?php

 class AclprepController extends AppController
{
      var $name = 'Aclprep';
      var $uses =array('User');
      var $components =array('Acl');

function initAcl()
{
	//Αρχικά
      /*
      * δημιουργήστε τους πίνακες στη βάση δεδομένων με την εκτέλεση του
	* cake schema run create DbAcl
      */

	/*
	* Ορίζουμε της βασικές ομάδες χρηστών, για να το διατηρήσουμε απλό
	* έχω ορίσει μόνο χρήστες και διαχειριστές
      */     

	//always declare an Aro object to create and save
	// Να δημιουργείται πάντα ένα αντικείμενο Aro για δημιουργία και αποθήκευση
	$aro = new Aro();

	// Κάντε επανάλυψη ανάμεσα στισ ομάδες για να τις βάλετε στον πίνακα aro
      $groups = array(
		0 => array(
            	'alias' => 'users'
            ),
            1 => array(
			'alias' => 'administrators'
		),
	);

	// Επαναλάβετε και δημιουργήστε της ομάδες στο ARO
	foreach($groups as $data)
	{
		// Θυμηθείτε να καλέσετε τη μέθοδο create() όταν αποθηκεύεται σε απαναλύψεις
            $aro->create();

		// Αποθηκεύστε τα δεδομένα
            $aro->save($data);
	}

	/*
	* Στη συνέχεια προσθέτουμε τους χρήστες μας στην ομάδα users
      */

	$aro = new Aro();

	// Δημιουργήστε μια λίστα με όλους τους χρήστες στη βάση δεδομένων σας
      $users=$this->User->find('list');

	debug($users);

	$i=0;

	foreach($users as $key=>$value)
	{
		$aroList[$i++]=array(
			'alias' => $value,
                  'parent_id' => 1,
                  'model' => 'User',
			'foreign_key' => $key,
		);
	}

	// Κάντε μια εκτύπωση στην οθόνη για να επιβεβαιώσετε τη δομή
	debug($aroList);

	// Και τώρα αποθηκεύουμε
      foreach($aroList as $data)
	{
		// Ξανά. Θυμηθείτε να καλέσετε τη μέθοδο create μέσα σε επαναλύψεις
            $aro->create();

		// Αποθηκεύστε τα δεδομένα
            $aro->save($data);
	}

	/*
	* Τώρα στο τι μπορούν να προσπελάσουν.
      * Για τη δική μου δομή έχω όλο το site σαν γωνέα και δυο υπό-μοντέλα που 	* περιέχουν όλα τα άλλα μοντέλα.
      */

	$aco = new Aco();

	// Οι διαχειριστές μπορούν να προσπελάσουν όλο το site
      $controllers = array(
		0 => array(
			'alias' => 'Entire_Site'
		),
	);

	// Σαρώστε τους controllers και δημιουργήστε ομάδες στο ARO
      foreach($controllers as $data)
	{
            $aco->create();

            $aco->save($data);
	}

	$aco = new Aco();

	// Οι χρήστες έχουν διαφορετικά δικαιώματα πρόσβασης στο Βασικό μοντέλο 	// και το Βοηθητικό μοντέλο
      $controllers = array(
		0 => array(
            	'alias' => 'Main_Models',
                  'parent_id'=> '1'
		),
            1 => array(
			'alias' => 'Aux_Models',
                  'parent_id'=> '1'
		),
	);

	// Σαρώστε τους Controllers και δημιοργήστε αντικείμενα ACO
      foreach($controllers as $data)
      {
            $aco->create();

            $aco->save($data);
	}

      $aco = new Aco();

	// Έχουμε βάλει όλα τα υπό-ACO μέσα σε ένα πίνακα για να τα σκανάρουμε 	// αργότερα και να τα αποθηκεύσουμε
	$controllers = array(
		0 => array(
            	'alias' => 'Users',
                  'model' => 'User',
                  'parent_id' => 2,
		),
            1 => array(
			'alias' => 'Toolboxes',
                  'model' => 'Toolbox',
                  'parent_id' => 2,
		),
            2 => array(
			'alias' => 'Items',
                  'model' => 'Item',
                  'parent_id' => 2,
		),
            3 => array(
			'alias' => 'Actions',
                  'model' => 'Action',
                  'parent_id' => 3,
		),
            4 => array(
			'alias' => 'Priorities',
                  'model' => 'Priority',
                  'parent_id' => 3,
		),
            5 => array(
            	'alias' => 'Settings',
                  'model' => 'Setting',
                  'parent_id' => 3,
		),
            6 => array(
            	'alias' => 'Botchecks',
                  'model' => 'Botcheck',
                  'parent_id' => 3,
		),
	);

	// Σαρώστε όλους τους Controllers και δημιουργήστε κόμβους ACO
      foreach($controllers as $data)
      {
            $aco->create();

            $aco->save($data);
	}

	die;
	exit;
}

function assignPermissions()
{
	// Δίνει στον διαχειριστή δικαιώματα να κάνει τα πάντα (κοριφαίο ACO)
      $this->Acl->allow('administrators', 'Entire_Site');

	// Δίνει στους χρήστες το δικαίωμα να διαβάσουν το βασικό μοντέλο
	// να αναβαθμίσουν και να διαγράψουν τα δικά τους δεδομένα.

	$this->Acl->allow('users', 'Main_Models','create');
	$this->Acl->allow('users', 'Main_Models','read');

	// Επίσης παραχωρεί στους χρήστες το δικαίωμα ανάγνωσης από το βοηθητικό μοντέλο
	$this->Acl->allow('users', 'Aux_Models','read');

	die('done');
}

function checkPermissions()
{
	// Όλα από τα παρακάτω επιστρέφουν true
	echo $this->Acl->check('administrators', 'Settings');
      echo $this->Acl->check('users', 'Items','create');
      echo $this->Acl->check('users', 'Actions','read');

	// Να θυμάστε ότι μπορούμε να χρησιμοποιήσουμε το συντακτικό
	// model/foreign key για τους χρήστες μας στο ARO
	//
      // Σκεφτείτε αν μπορεί ο   να προσπελάσει  ,
      // Μπορεί το μοντέλο User ο χρήστης 2356 να προσπελάσει το Weapons
      // $this->Acl->check(array('model' => 'User', 'foreign_key' => 2356), 'Weapons');

	echo 'and dissallows...';

	// Τα ακόλουθα επιστρέφουν false
	// Ο χρήστης δεν μπορεί να διαγράψει ή να επεξεργαστεί θα βοηθητικά
	// μοντέλα
      echo $this->Acl->check('users', 'Actions', 'delete');
      echo $this->Acl->check('users', 'Actions', 'create');

	// Ούτε μπορούν να επεξεργαστούν ή να διαγράψουν τα βασικά μοντέλα άλλων
      echo $this->Acl->check('users', 'Items', 'delete');
      echo $this->Acl->check('users', 'Items', 'update');
      die('done');
}

}

?>

Οι τελικές πινελιές

Οι τελικές πινελιές θα γίνουν ενώ αναβαθμίζετε ή δημιουργείται νέες ενέργειες για τα μοντέλα σας. Όταν για παράδειγμα ο χρήστης δημιουργεί μια νέα εργαλειοθήκη, άμεσα θα παραχωρείτε σε αυτό το χρήστη το δικαίωμα να αναβαθμίζει και να διαγράφει αυτή την εργαλειοθήκη.

//example code when a user creates a model
//let user with id 1234 update toolbox with id 5678
$this->Acl->allow(array('model' => 'User', 'foreign_key' => 1234), array('model'=>'Toolbox','foreign_key'=>'5678'), 'update');

Έτσι την επόμενη φορά θα μπορείτε να κάνετε έλεγχο αν ο χρήστης έχει δικαίωμα να κάνει αλλαγές πάνω σε αυτή την εργαλειοθήκη.

//example code when a user attempts action a model
//can user with id 1234 in fact update toolbox with id 5678?
$this->Acl->check(array('model' => 'User', 'foreign_key' => 1234), array('model'=>'Toolbox','foreign_key'=>'5678'), 'update');

Περισσότερα για τον CorfuGmr

CorfuGmr

Ονομάζομαι Νίκος και ασχολούμαι με το internet και την κατασκευή ιστοσελίδων από το 1998. Σήμερα, μετά από 12 χρόνια γεμάτα με ενημέρωση, εκπαίδευση και εξάσκηση έχω ανεβάσει σε ένα άλλο επίπεδο τις γνώσεις μου και τις τεχνικές μου. Στα άρθρα μου προσπαθώ να σας δείξω τα μικρά, αλλά σημαντικά πράγματα που με έχουν ανεβάσει σε αυτό το επίπεδο.








Σχόλια



3 Απριλίου 2010

[…] This post was mentioned on Twitter by Web Resoures.eu. Web Resoures.eu said: Ξεκινήστε το ACL στο CakePHP http://bit.ly/d7p5wf […]


Συγνώμη, τα σχόλια για αυτό το άρθρο είναι κλειστά.



^
Top
css.php