Šiek tiek anksčiau pristačiau savo būdą, kaip tvarkyti autorizavimą ir autentifikaciją CakePHP karkase. Jis buvo pakankamai didelis ir netvarkingas. Taip pat keli žmonės kreipėsi, nes negalėjo jo pritaikyti savo kode su paskutiniais leidimais. Šiame straipsnyje pristatau šiek tiek paprastesnį sprendimą, kuriame pasitelkiau ne tik , bet ir komponentą.

Neskaičiusiems apie sistemą siūlau peržvelgti mano straipsnio ankstesnę dalį ir CakePHP dokumentacijos skyrelį.

Autorizavimas ir autentifikacija remiasi ‘actions’ principu. Norintiems toliau pateiktus kodo gabaliukus pritaikyti ‘CRUD’ būdui, teks šiek padirbėti. Kadangi nusprendžiau visą šitą reikalą padaryti paprastesniu ir greitesniu, publikai (neprisijungusiems lankytojams) prieinami kontroleriai/veiksmai bus nustatomi faile, o ne lentelėse.

Šioje dalyje pasirinkau šiek tiek kitokį vartotojų/grupių medžio išdėstymą nei anksčiau, o kontrolerių ir veiksmų medžio principą palikau tą patį. Tiesa, vis tiek teks keisti komponento kodą ir tai atlikime iš karto.
Surandame cake/libs/controller/components/.php faile eilutę

for ($i = count($aroPath) - 1; $i >= 0; $i--) {

ir pakeičiame į

for ($i = 0; $i < count($aroPath); $i++) {

Pastaroji eilutė pakeis principą tikrinant ARO teises į ACO.

“AROs” - vartotojai/grupės

Everybody
    |- User
        |- johny
        |- Moderator
            |- tom
            |- Administrator
                |- admin

‘Everybody’, ‘User’, ‘Moderator’, ‘Administrator’ - rolės/grupės. ‘johny’, ‘tom’, ‘admin’ - vartotojai.
Taip išdėščiau medį, tam kad reiktų mažiau suteikinėti teisių atskiroms grupėms. Jeigu prie ‘posts/add’ kontrolerio/veiksmo gali prieiti
‘User’ grupė, tuomet gali ir ‘Moderator’ bei ‘Administrator’ grupės su joms priklausančiais vartotojais.

“ACOs” - kontroleriai/veiksmai

/ (ROOT)
    |- posts
        |- index*
        |- fullpost*
        |- edit
        |- add
    |- users
        |- index
        |- register*
        |- login*
        |- edit
    |- moderators
        |- ...
    |- admins
        |- ...

Su žvaigždute ‘*’ pažymėti kontrolerių veiksmai bus prieinami visiems, tad jų į ‘ACOs’ lentelę neįkelsim.
‘/ (ROOT)’ - pagrindinė direktorija;
‘posts’ - kontroleris, jo veiksmus ‘add’ ir ‘edit’ galės naudoti paprasti vartotojai (tuo pačiu ir moderatoriai bei administratoriai);
‘users’ - kontroleris, jo veiksmus ‘index’ ir ‘edit’, analogiškai kaip ‘posts’ kontrolerio veiksmais, galės naudoti vartotojai bei dukterinės grupės (moderatoriai ir administratoriai);
‘moderators’ - kontroleris, jo visus veiksmus galės naudoti moderatoriai ir administratoriai;
‘admins’ - kontroleris, jo visus veiksmus galės naudoti administratoriai.

Modeliai

Pirmiausiai sukuriame app/app_model.php, jame patalpinsime unikalaus laukelio tikrinimo funkciją (pvz., vartotojo vardo, el. pašto unikalumo patikrinimas):

<?php
class AppModel extends Model
{ 
	function isUnique($data, $field) 
	{ 
		$limit = array($field => $data);
		if (!empty($this->id))
			$limit += array("id" => "<>".$this->id);
 
		return ($this->findCount($limit) == 0); 
	}
}
?>

Taip pat prireiks ‘Group’ modelio (app/models/group.php):

<?php
class Group extends AppModel {
	var $name = 'Group';
	var $actsAs = array('Acl');
 
	// Apie parentNode galite pasiskaityti API ir dokumentacijose, paprastais žodžiais - 'parent_id' nustatymas grupei
	function parentNode()
	{
		if (!$this->id) 
		{
			return null;
		}
 
		$data = $this->read();
 
		if (!$data['Group']['parent_id'])
		{
			return null;
		} else {
			return $data['Group']['parent_id'];
		}
	}
}
?>

Ir ‘User’ modelio (app/models/user.php):

<?php
class User extends AppModel {
	var $name = 'User';
	var $belongsTo = array('Group');
	var $actsAs = array('Acl');                     
	var $validate = array(
			'email' => array(
					// El. pašto adresas turi atikti el. pašto formatą ir turi būti unikalus
					'unique' => array(
							'rule' => array('isUnique', 'email') 
							), 
					'format' => array(
							'rule' => array('email')
							),
					), 
			'username' => array(
					// Vartotojo vardas gali būti tik iš skaičių ir raidžių, turi būti unikalus ir  2-16 simbolių ilgio.
					'unique' => array(
							'rule' => array('isUnique', 'username')
							),
					'format' => array( 
							'rule' => array('alphaNumeric')
							), 
					'length' => array( 
							'rule' => array('between', 2, 16)
							)
					),
			// Vartotojas turi sutikti su taisyklėmis
			'terms' => array(
					'required' => '/1/'
					)
			);
	var $p4ss = null;
	function beforeValidate()
	{
		// Sugeneruojame slaptažodį
		$password = $this->generatePassword();
		$this->data[$this->name]["password"] = Security::hash(CAKE_SESSION_STRING . $password);
		$this->p4ss = $password;
		return true;
	}
	function afterSave()
	{
		// Atnaujiname informaciją `aros` lentelėje (cakephp pagal nutylėjimą, kažkodėl nenustato alias vartotojui)
		$data = $this->read();
		$this->query('UPDATE `aros` SET `alias` = \'' . $data['User']['username'] . '\' WHERE `model` = \'User\' AND `foreign_key` = ' . $data['User']['id']);
		return true;
	}
	// Iš php.net pasiskolinta slaptažodžio generavimo funkcija
	function generatePassword($number = 6)
	{
		$number = ( $number < 6) ? 6 : $number;
		// pirmasi simbolis būtinai a-z
		$pass =  chr(mt_rand(97,122));
 
		// sekantys 0-9, a-z arba A-Z
		for($k=0; $k < $number - 1; $k++)
		{
			$probab = mt_rand(1,10); 
			if($probab <= 5)   // a-z galimybė 50%
				$pass .= chr(mt_rand(97,122));
			elseif($probab <= 8 && $probab > 5)	// 0-9 galimybė 30%
				$pass .= chr(mt_rand(48, 57));
			else
				$pass .= chr(mt_rand(65,90));	// A-Z galimybė 20%
		}
 
		return $pass;
	}
	// Priskiriame vartotojui grupės, pagal nutylėjimą, ID (jį nustatom SQL lentelėje 'DEFAULT' reikšmėje)
	function parentNode()
	{
		if (!$this->id) {
			return null;
		}
		$data = $this->read();
 
		if (!$data['User']['group_id']){
			return null;
		} else {
			return array('model' => 'Group', 'foreign_key' => $data['User']['group_id']);
		}
	}
}
?>

Visus kitus jums reikiamus modelius (kaip ‘posts’) susikurkite pagal savo reikmes.

Kontroleriai

Vėlgi, pirmiausia sukuriame app/app_controller.php:

<?php
class AppController extends Controller {
	var $components = array('Acl', 'Auth'); // Į pagalbą išsikviečiam Acl ir Auth komponentus
	var $user = null;
	var $settings = array(
			'loginAction' => '/users/login', // Adresas, kur bus numestas vartotojas, jeigu neturės teisių pasiekti kontrolerio/veiksmo
			'loginRedirect' => '/', // Adresas, kur bus numestas vartotojas, kai prisijungs
			'logoutRedirect' => '/', // Adresas, kur bus numestas vartotojas, kai atsijungs
			'authorize' => 'actions', // autorizavimo būdas       
		);
	// Šiame masyve nustatome kuriuos kontrolerius/veiksmus galės pasiekti neprisijungę vartotojai
	var $allowed = array( 
			'init_acl' => '*', // Šito mums prireiks įdiegiant Acl teises
			'pages' => '*', // Manau pages kontrolerį pasiekti norite leisti visiems
			'posts' => array ('index', 'fullpost'), // 'posts' kontroleryje esančius 'index' ir 'fullpost' "actions" galės pasiekti visi			
			'users' => array('register', 'login') // 'users' kontroleryje esančius 'register' ir 'login' veiksmus galės pasiekti visi. Pagal nutylėjimą "Auth" komponentas login veiksmą leidžia visiems, tad jo nurodyti nebūtina
		);
 
	var $uses = array("User", "Group");
	var $helpers = array('Html', 'Form', 'Javascript', 'Session');
	function beforeFilter() 	
	{	
		$this->checkAuth(); // Patikriname teises ir t.t.
	}
	function checkAuth()
	{
		if (isset($this->Auth)) // Jeigu yra Auth komponentas
		{
			$this->Auth->userScope = array( 'User.active' => '1' ); // 'userScope' nustatome sql lentelės lauką, pagal kurio turinį atrinks vartotojus. Tarkim šiuo atveju tikrins duomenis tik tų vartotojų, kurių 'active' lauke yra nustatyta '1'
			$this->Auth->loginAction = $this->settings['loginAction'];
			$this->Auth->loginRedirect = $this->settings['loginRedirect'];
			$this->Auth->logoutRedirect = $this->settings['logoutRedirect'];
			$this->Auth->authorize = $this->settings['authorize'];
			$this->Auth->loginError = __("login_error", true); // Neteisingų prisijungimo duomenų klaidos žinutė
			$this->Auth->authError = __("auth_error", true); // Žinutė, kuri bus rodoma, jeigu prisijungęs vartotojas ateis į vietą, kur jis teisių neturi
			$this->Auth->userModel = "User"; // Vartotojų sistemos modelis, mūsų atveju "User"
			if ( array_key_exists( $this->viewPath, $this->allowed ) // Patikriname ar vartotojo esama vieta (kontroleris/veiksmasa) nėra leistina visiems, jeigu taip - praleisti vartotoją.
					&& ( $this->allowed[$this->viewPath] == '*'
							|| ( is_array( $this->allowed[$this->viewPath] )
								&& in_array( $this->action, $this->allowed[$this->viewPath] ) 
								) 
						) 
				) 
			{
				$this->Auth->allow(); 
			}
			$this->user = $this->Auth->user(); // Nustatome kontroleryje vartotojo duomenis į kintamąjį.
			$this->set("user", $this->user); // Nustatome vaizde (view`e) vartotojo duomenis į kintamąjį
		}
	}
} 
?>

Pastarasis failas yra praktiškai svarbiausias, nes juo apibendrinam visą sistemą ir jame vyksta vartotojo autentifikavimas.

‘User’ modeliui mums prireikes ‘Users’ kontrolerio (app/controllers/users_controller.php):

<?php  
class UsersController extends AppController 
{ 
	var $name = 'Users';
	function index()
	{
		echo "Čia tik prisijungusiems vartotojams matomas puslapis";
		$this->autoRender = false;
	}
	function login()
	{
		/* Jeigu vartotojas prisijungęs, išmetam iš login į pagrindinį puslapį */
		$user = $this->Auth->user();
		if ($user)
		{
			$this->autoRender = false;
			$this->redirect("/");
		}
		$this->set("message", $this->Session->read('Message'));
		/* Būna taip, jog dėl naršyklės kaltės 'referer' tampa logout veiksmas, ko pasekoja, lankytojas tik prisijungęs iškarto atsijungs, tad pašalinam šitą klaidą */
		if (preg_match("/logout/i", $this->Session->read('Auth.redirect')) || preg_match("/login/i", $this->Session->read('Auth.redirect')))
		{
			$this->Session->write('Auth.redirect', '/');
		}		
	}
	function logout()
	{
		$this->Auth->logout();
		$this->Session->setFlash(__("logged_out", true));	 /* atsijungimo žinutė */
		$this->autoRender = false;				
		$this->redirect('login');		
	}
	function edit()
	{
		echo "Vartotojo redagavimas, čia darykit ką norit";
		exit;
	}
	function register() 
	{ 
		if (!isset($this->user) || !$this->user)
		{
			if(!empty($this->data)) 
			{
				$this->User->data = $this->data; 
		        if ($this->User->save()) 
		      	{
		      		/* 
		      		* Čia galite įdėti skriptą, kuris išsiųs vartotojui el. laišką su slaptažodžiu ($this->User->p4ss)
		      		* dabar čia yra tiesiog žinutės atvaizdavimas su slaptažodžiu, jog viskas okey.
		      		*/
 
		      		$this->Session->setFlash(__("register_success", true) . " " . $this->User->p4ss, null, null, "smessage");
		      		$this->User->p4ss = null;
		      	}
		      	else
		      	{
		      		$this->Session->setFlash(__("register_unsuccess", true), null, null, "usmessage");
		      	}
 
				$this->set("message", $this->Session->read('Message')); 
 
		     }
		}
		else 
		{
			$this->autoRender = false;
		  	$this->redirect("/");
		}
	}
} 
?>

‘InitAcl’ kontrolerio, kuriuo inicijuosime pradines teises (app/controllers/init_acl_controller.php):

<?php
class InitAclController extends AppController
{
	var $name = 'InitAcl';
	var $uses = null;
	var $Aro = null;
	var $Aco = null;
	function setupAcl() 
	{ 
		$aro = new Aro(); 
		$aco = new Aco(); 
 
		/* Išvalom visas ACL lenteles */
		$aro->query("TRUNCATE TABLE `aros`");
		$aro->query("TRUNCATE TABLE `acos`");
		$aro->query("TRUNCATE TABLE `aros_acos`");
 
		/* Kuriam AROs */
 
		// Sukuriame pagrindinę šaką 'Everybody'
		$aro->create(); 
		$aro->save(array( 
			'model'=>'Group', 
			'foreign_key'=>1, 
			'parent_id'=>null, 
			'alias'=>'Everybody'
			)
		); 
 
		// Sukuriame 'User' po 'Everybody' šaka
		$aro->create(); 
		$aro->save(array( 
			'model'=>'Group', 
			'foreign_key'=>2, 
			'parent_id'=>1, 
			'alias'=>'User'
			)
		); 
 
		// Sukuriame 'Moderator' po 'User' šaka
		$aro->create(); 
		$aro->save(array( 
			'model'=>'Group', 
			'foreign_key'=>3, 
			'parent_id'=>2, 
			'alias'=>'Moderator'
			)
		); 
 
		// Sukuriame 'Administrator' po 'Moderator' šaka
		$aro->create(); 
		$aro->save(array( 
			'model'=>'Group', 
			'foreign_key'=>4, 
			'parent_id'=>3, 
			'alias'=>'Administrator'
			)
		); 
 
		// Vartotoją 'admin' sukuriame po 'Administrator' šaka
		$aro->create(); 
		$aro->save(array( 
			'model'=>'User', 
			'foreign_key'=>1, 
			'parent_id'=>4, 
			'alias'=>'admin'
			)
		);  
 
		// Vartotoją 'tom' sukuriame po 'Moderator' šaka
		$aro->create(); 
		$aro->save(array( 
			'model'=>'User', 
			'foreign_key'=>2, 
			'parent_id'=>3, 
			'alias'=>'tom'
			)
		);  
 
		// Vartotoją 'johny' sukuriame po 'User' šaka
		$aro->create(); 
		$aro->save(array( 
			'model'=>'User', 
			'foreign_key'=>3, 
			'parent_id'=>2, 
			'alias'=>'johny'
			)
		);  
 
		/* Kuriam ACOs */
 
		// Sukuriame pagrindinę ROOT direktoriją		
		$aco->create(); 
		$aco->save(array( 
				'model'=>null, 
				'foreign_key'=>null, 
				'parent_id'=>null, 
				'alias'=>'ROOT'
				)
			); 
 
		// Sukuriame 'posts' kontrolerį          
		$aco->create();
		$aco->save(array( 
				'model'=>'post', 
				'foreign_key'=>null, 
				'parent_id'=>1, 
				'alias'=>'posts'
				)
			); 
		// Sukuriame 'posts' kontrolerio veiksmus 'add' ir 'edit'        
		$aco->create();
		$aco->save(array( 
				'model'=>'post', 
				'foreign_key'=>null, 
				'parent_id'=>2, 
				'alias'=>'add'
				)
			); 
		$aco->create();
		$aco->save(array( 
				'model'=>'post', 
				'foreign_key'=>null, 
				'parent_id'=>2, 
				'alias'=>'edit'
				)
			); 
 
		// Sukuriame 'users' kontrolerį          
		$aco->create();
		$aco->save(array( 
				'model'=>'user', 
				'foreign_key'=>null, 
				'parent_id'=>1, 
				'alias'=>'users'
				)
			); 
		// Sukuriame 'users' kontrolerio veiksmus 'index' ir 'edit'        
		$aco->create();
		$aco->save(array( 
				'model'=>'user', 
				'foreign_key'=>null, 
				'parent_id'=>5, 
				'alias'=>'index'
				)
			); 
		$aco->create();
		$aco->save(array( 
				'model'=>'user', 
				'foreign_key'=>null, 
				'parent_id'=>5, 
				'alias'=>'edit'
				)
			); 
 
		// Sukuriame 'moderators' kontrolerį          
		$aco->create();
		$aco->save(array( 
				'model'=>null, 
				'foreign_key'=>null, 
				'parent_id'=>1, 
				'alias'=>'moderators'
				)
			); 
 
 
		// Sukuriame 'admins' kontrolerį          
		$aco->create();
		$aco->save(array( 
				'model'=>null, 
				'foreign_key'=>null, 
				'parent_id'=>1, 
				'alias'=>'admins'
				)
			); 
 
		/* Taisyklės */
 
		// Visiems apribojame teises į visus kontrolerius/veiksmus (toliau, ką reikės, tą leisime)
		$this->Acl->deny('Everybody', 'ROOT'); 
 
		// Leidžiame 'User' ir jos šakoms tvarkyti 'posts' kontrolerio veiksmus 'add' ir 'edit'
		$this->Acl->allow('User', 'posts/add');   
		$this->Acl->allow('User', 'posts/edit');
 
		// Leidžiame 'User' ir jos šakoms tvarkyti 'users' kontrolerio veiksmus 'index' ir 'edit'
		$this->Acl->allow('User', 'users/index');   
		$this->Acl->allow('User', 'users/edit');     
 
		// Leidžiame 'Moderator' ir jos šakoms tvarkyti 'moderators' kontrolerio visus veiksmus
		$this->Acl->allow('Moderator', 'moderators');       
 
		// Leidžiame 'Administrator' ir jos šakoms tvarkyti 'admins' kontrolerio visus veiksmus
		$this->Acl->allow('Administrator', 'admins');  
 
		echo "Baigta";
		$this->autoRender = false;
	}
}
?>

Visi kontroleriai: ‘moderators’, ‘admins’ ir ‘posts’, čia yra imituojami, tad juos susikurkite pagal savo reikalavimus, jeigu jų reikia. Atitinkamai, jeigu nereikia, iš pateikto kodo juos pašalinkite.

“Views”

Pagrindui mums reikia prisijungimo ir registracijos vaizdų (angl. views).
Prisijungimas - app/views/users/login.ctp

<div class="login"> 
<h2><?php __("login_form_title");?></h2>    
<?php if (isset($message["flash"]["message"])) echo $message["flash"]["message"]; ?> 
<?php echo $form->create('User', array('url'=>array('model'=>'user', 'controller'=>'users', 'action'=>'login')));?> 
	<?php echo $form->label("User.username", __("username", true));?><?php echo $form->input('username', array('div' => false, 'label' => false));?> <br />
	<?php echo $form->label("User.password", __("password", true));?><?php echo $form->input('password', array('div' => false, 'label' => false));?> 
	<?php echo $form->submit(__('login_button', true));?> 
<?php echo $form->end(); ?>
<?php __("wo_account")?> <?php echo $html->link(__("join_us", true), "/register");?>.
</div>

Registracija - app/views/users/register.ctp

<div class="register">
<h2><?php __("register_form_title");?></h2>    
<?php if (isset($message["smessage"]["message"])): ?>
	<?php echo $message["smessage"]["message"]; ?> 
<?php else: ?>
	<?php if (isset($message["usmessage"]["message"])): ?>
		<?php echo $message["usmessage"]["message"]; ?> 
	<?php endif; ?>
	<br />
	<br />
	<?php echo $form->create('User', array('action' => 'register'));?>
    		<?php echo $form->label("User.email", __("email", true));?>
		<?php 
    		echo $form->input('User.email', array(
    						'div' => false, 
    						'label' => false,
    						'error' => array(
    							'format' => __("bad_email", true),
    							'unique' => __("email_exists", true)
    						)
					)
    				);
    		?><br />
 
		<?php echo $form->label("User.username", __("username", true));?>
		<?php 
    		echo $form->input('User.username', array(
    							'div' => false, 
    							'label' => false,
    							'error' => array(
    								'length' => __("username_between_2_16", true),
    								'format' => __("username_alphanumeric", true),
    								'unique' => __("username_exists", true)
    							)
    						)
    					);
    		?><br />
 
		<?php echo $form->label("User.password", __("password", true));?>
		<?php 
		echo $form->input('User.password', array(
						'disabled' => 'disabled',
						'value' => '',
						'type' => 'password',
						'label' => false,
							'div' => false
						)
					);
		?><?php __("password_will_be_emailed"); ?><br />
 
		<?php echo $form->label("User.terms", __("agree_terms", true));?>
		<?php 
		echo $form->input('User.terms', array(
						'type' => 'checkbox',
						'label' => false,
						'div' => false,
						'error' => array(
								'required' => __("must_agree_terms", true)
							)
						)
					);
		?><br />
 
		<?php echo $form->submit(__('register_button', true));?> 
	<?php echo $form->end(); ?> 
<?php endif; ?>
</div>

Visus kitus Jums reikiamus “views” susikursite vėliau (pvz., ‘posts’ kontrolerio vaizdus, arba ‘users’ kontrolerio ‘index’ vaizdą).

SQL

Žinoma, jog be duomenų bazės lentelių čia neapsieisime.
Grupių lentelė - ‘groups’:

CREATE TABLE `groups` (
  `id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(50) collate utf8_unicode_ci DEFAULT NULL,
  `parent_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5;
 
 
INSERT INTO `groups` (`id`, `name`, `parent_id`) VALUES 
(1, 'Everybody', 0),
(2, 'User', 1),
(3, 'Moderator', 2),
(4, 'Administrator', 3);

Vartotojų lentelė - ‘users’:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(16) collate utf8_unicode_ci NOT NULL,
  `password` varchar(40) collate utf8_unicode_ci NOT NULL,
  `email` varchar(255) collate utf8_unicode_ci NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `group_id` tinyint(10) NOT NULL DEFAULT '3',
  `modified` datetime NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4;
 
 
INSERT INTO `users` (`id`, `username`, `password`, `email`, `active`, `group_id`, `modified`, `created`) VALUES 
(1, 'admin', '0926293e7126f2884d6de811567c1231a01d749c', 'admin@example.com', 1, 4, '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(2, 'tom', '0926293e7126f2884d6de811567c1231a01d749c', 'tom@example.com', 1, 3, '0000-00-00 00:00:00', '0000-00-00 00:00:00'),
(3, 'johny', '0926293e7126f2884d6de811567c1231a01d749c', 'johny@example.com', 1, 2, '0000-00-00 00:00:00', '0000-00-00 00:00:00');

Vartotojų slaptažodžiai yra užkoduoti sha1 formatu. Abiejų aukščiau esančių vartotojų slaptažodis yra: 1.
Taip pat dar reikia atlikti SQL užklausas esančias app/config/sql/db_acl.sql faile.

Pabaiga

Liko inicijuoti teises, tai galime padaryti adresu http://serveriohost/init_acl/setupAcl
Nepamirškite, jog prieš pateikiant atvirai projektą, reikia pašalinti init_acl kontrolerį iš publikos akių. Kai kuris kodas nėra mano, bet kam išradinėti dviratį, jeigu jį galima tiesiog patobulinti? :)
Sėkmės implementuojant ir . Jeigu kažkas nepavyksta, klauskite komentaruose arba el. paštu. Taip pat laukiu komentarų su pasiūlymais kaip dar labiau patobulinti sistemą. Galbūt kas turi minčių, kaip sutvarkyti medį, jog nereikėtų redaguoti integruoto komponento?

Panašūs straipsniai


“CakePHP 1.2 Acl ir Auth (2 dalis)” komentarų: 11

  1. asterisk

    cake/libs/controller/components/acl.php taisyti nebereikia, bug`as ištaisytas. Beja ir šiaip daugybė Auth/Acl bugų ištaisyta tad dabar per daug nesklandumų nebus setupinant signup/login :)

  2. asterisk
    var $actsAs = array('Acl');

    dabar rašoma

    var $actsAs = array('Acl' => 'requester');
  3. josoroma

    I think
    Security::hash(CAKE_SESSION_STRING . $password);
    must have to be:
    Security::hash(Configure::read(’Security.salt’) . $password);

    Where do i have to replace:
    var $actsAs = array(’Acl’);
    with
    var $actsAs = array(’Acl’ => ‘requester’);

    Im still in the login page, i introduce the password but this redirects me again to login page.

    thanks in advance.

  4. asterisk

    josoroma, yeah, CAKE_SESSION_STRING is now deprecated.
    You need to add

    var $actsAs = array('Acl' => 'requester');

    to User and Group models.
    You are redirected to login page probably because your password is bad or you haven’t added your main (index) controller to allowed pages list.

  5. Tadas

    Toks klausimas iskilo man. Ar bandei, kad butu galima priskirti teises tarkim trinti editinti posta tik tam useriui kuris yra sukures ji?

  6. asterisk

    Tadai, to nedariau, bet sistema manau veiktų panašiai. Postą dedi į acos ir tada useriui priskiri visas teises į jį. Nors galbūt paprastesnis sprendimas būtų tiesiog turėti duombazėje laukelį author :)

  7. josoroma

    Hi!.

    Im usin 3 groups: everybody, registered and admin:

    –Everybody
    ——Registered
    ———-Admin

    I have my USERS and GROUPS tables:
    http://bin.cakephp.org/saved/29195

    and the ACL tables created. My initACL is:
    http://bin.cakephp.org/view/1457401002

    After modifyng the app_controller.php
    http://bin.cakephp.org/view/1536361420

    My question is:
    How do i get inheritance working in groups?

    Thanks in advance.

  8. Aurimas

    Meta pranesima “Class ‘Aro’ not found” InitAclController klaseje nesuprantu ka darau negerai. InitAclController klase yra /app/controllers/

  9. Aurimas

    Radau klaida: appcontroller klaseje nereikia nurodyt login
    ‘users’ => array(’register’, ‘login’)
    pakeisti i
    ‘users’ => array(’register’)
    pagal manuala: Note: do not specifically allow ‘login’ because that will break Auth

  10. asterisk

    Aurimai, atkreipk dėmesį, jog straipsnis pakankamai seniai rašytas ir daug kas CakePHP nuo to pasikeitė :)

  11. Aurimas

    aha senas :)
    Turiu keleta klausimu, kaip daryti redirekta atitinkamai vartotoju grupej? Pvz: users nukreiptu /profile/ admin nukreiptu i /admin/ ir pan. nuo grupes priklauso kur keliauti turetu, as bandau taip: appController
    data[’User’][’username’])){
    $aro = new Aro();
    $parent = $aro->findByAlias($this->data[’User’][’username’]);
    if($parent[’Aro’][’parent_id’] == 2){ //Antra grupe yra dokumentai
    $this->settings[’loginRedirect’] = “/doc/”;
    }
    }
    $this->checkAuth();
    }
    ?>
    Redirektina tvarkingai tik ar teisingai darau :)
    Jei as sukuriu “acos” (model = doc, alias = dokumentai) Tai galiu pasiekti visus action “doc” modelio? neskirinedamas atskirai, nes nepavyksta nustatyti visi kontroleriai leidziami, ir kita beda jei bandau kitai grupej skirta modeli atsidaryt su useriu is kitos grupes serveris pakimba kazkur begalinis ciklas :) Gal turit kas naujesni example koki kaip veikia tas acl, nes internete nekazink ka randu straipsniai vienas nuo kito skiriasi .

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.