Sie sind auf Seite 1von 17

CakePHP API Docs Bakery Live Forge Trac Login Register About CakePHP Donate

News   Articles   Code      Articles

How to use ACL with Cake PHP 1.2.x?
By Ketan (ketan) TUTORIALS  AUG 7, 2007   

This tutorial will brief you on how to use Acl in CakePHP 1.2.x versions. I had tough time figuring  Details
this out. But with help of Gwoo, AD7Six & others, and doing debugging and reading code, here 
comes the tutorial.  Version: 
1.2.0.5146 
This tutorial assumes you know basic concept of ACL and what it is suppossed to be used for? If not  Views: 44220 
then please read http://manual.cakephp.org/chapter/acl  
Comments (43) 
You can setup the databases needed for ACL through console command  
Download code
cake acl initdb  Rating
  3.50 by 2 Users 
Now we would setup some higher level aros and acos for initial setup. You could do it through console. 
But I prefered to do it through controller, nothing special, just did it that way!     
 
Log in to add 
Think of Aros (could be Users, service, etc) as the one who is requesting access to Acos (could be 
rating 
controller, actions or services). But in this example, we will limit Aros as the users and Acos as the 
controllers. We will setup the following Aros (users): 
1. Admin  Tags
2. |­­>User::1  
3. User  aco 
4. Guest  aro 
You could add more depending on your requirements, but we will stick to basic requirements for now.   
Admin, User & Guest are higher level group and the actual users will belong to one of these groups.  Log in to add tags 
'User::1' is an alias for User with user id 1. We define that user with user id 1 is a child of Admin and 
will inherit all admin previledges. Doing this is not essential, but you will have to define at least one user 
to be Admin, so why not do it here. Change the id to the userid representing the admin user on your system. 
 
We will setup the following Acos (controllers): 
1. User 
2. Post 
 
This would add two acos 'User' and 'Post'. But now you think if Acos is controller then why not have 'Posts' instead of 'Post'? Good 
question. This is because usually a controller's action can be divided into four types of action 'create', 'read', 'update' or 'delete' which 
are performed on a single or group of records belonging to a model. Hence, in this approach we going at record level Access Control. 
We want to make sure whether the current Aro (a User) has access to do 'C', 'R', 'U' or 'D' action on the Aco ( a record for eg. A 
post). If yes, then let him do the action otherwise don't. Now the code, that shows you the manual way to create aros and acos as 
discussed above. 
 
Controller Class: 
Download code
<?php   
class InitAclController extends AppController  
{  
  var $name = 'InitAcl';  
  var $component = array('Acl');  
  var $uses = array();  
 
  function setupAcl()  
  {  
    $aro = new aro();  
 
    $aro­>create();  
    $aro­>save(array(  
      'model'=>'User',  
      'foreign_key'=>null,  
      'parent_id'=>null,  
      'alias'=>'Admin'));  
 
    $aro­>create();  
    $aro­>save(array(  
      'model'=>'User',  
      'foreign_key'=>null,  
      'parent_id'=>null,  
      'alias'=>'User'));  
 
    $aro­>create();  
    $aro­>save(array(  
      'model'=>'User',  
      'foreign_key'=>null,  
      'parent_id'=>null,  
      'alias'=>'Guest'));  
 
    $parent = $aro­>findByAlias('Admin');  
    $parentId = $parent['Aro']['id'];      
 
    $aro­>create();  
    $aro­>save(array(  
      'model'=>'User',  
      'foreign_key'=>1,  
      'parent_id'=>$parentId,  
      'alias'=>'User::1'));  
 
      
      
    $aco = new Aco();  
    $aco­>create();  
    $aco­>save(array(  
       'model'=>'User',  
       'foreign_key'=>null,  
       'parent_id'=>null,  
       'alias'=>'User'));  
         
    $aco­>create();  
    $aco­>save(array(  
       'model'=>'Post',  
       'foreign_key'=>null,  
       'parent_id'=>null,  
       'alias'=>'Post'));  
   }  
   // Give admin full control over acos 'User' & 'Post'  
   $this­>Acl­>allow('Admin', 'User', '*');  
   $this­>Acl­>allow('Admin', 'Post', '*');  
 
   // Give the user group only create & read access for 'Post'   
   $this­>Acl­>allow('User', 'Post', array('create', 'read'));  
 
   // Give the Guests only create access for 'User'  
   $this­>Acl­>allow('Guest', 'User', 'create');  
}  
?> 

 
Above you saw that using Acl, we granted the Admin full rights over 'User' and 'Post' Acos. ie. Admin can do CRUD for all user and 
post, which in turn means that for any controller action which involves creating, reading, updating or deleting a 'User' or 'Post' record, 
Admin group is allowed to do it. So does any user that belongs to group Admin.  
 
'User' aro is allowed to do only create & read action for 'Post' acos, which means that a 'User' group in general has access to a 
controller action that can create and read 'post' records, which is what we want. We want that any user that belongs to 'User' group 
can create new posts and read posts. But we do not want all users (aros) to 'update' or 'delete' any 'Post' (acos) they want.  Which 
means, that belonging to a 'User' group does not give you any previledges to 'U', 'D' actions of 'Post' (acos). But you want to have 
'U', 'D' action for the user who created that Post!! I will get to giving user who created post the full CRUD rights later on, but this 
explanation was just to clear your concepts. Note that, above we did not do any 'allow' statement for 'User' aco, so this means that by
default 'User' group and its children, don't have access to 'CRUD' on 'User' records (acos). A user himself only has the CRUD right for 
his record and not other users. That's why we did it that way :) 
 
'Guest' aro is allowed to only 'create' action for 'User' acos. ie. Guest can only register a new user account, and is denied all other 
access to everything else. 
 
Now that we have the basic setup done, we would want to get the aros and acos populated as and when user is added to system. 
Below is shown the code on how to create aros and acos manually and also how to setup the permissions. 
 
Controller Class: 
Download code
<?php   
class UsersController extends AppController  
{  
  var $name = 'Users';  
 
  var $components = array('Acl');  
 
  function register()  
  {  
     if(!empty($this­>data))  
     {  
        $this­>User­>data = $this­>data;  
 
        if ($this­>User­>validates())  
        {  
           if ($this­>User­>save())  
           {  
               $aro = new Aro();  
               $parent = $aro­>findByAlias('User');  
               $parentId = $parent['aro']['id'];  
 
               $aro­>create();  
               $alias = $this­>User­>name.'::'.$this­>User­>id;  
               $aro­>save(  
                 'model'       => $this­>User­>name,  
                 'foreign_key' => $this­>User­>id,  
                 'parent_id'   => $parentId,  
                 'alias'   => $alias  
                       );  
 
               $aco = new Aco();  
               $parent = $aco­>findByAlias('User');  
               $parentId = $parent['aco']['id'];  
 
               $aco­>create();  
               $aco­>save(  
                 'model'       => $this­>User­>name,  
                 'foreign_key' => $this­>User­>id,  
                 'parent_id'   => $parentId,  
                 'alias'       => $alias  
                       );  
 
               $this­>Acl­>allow(  
                    $alias,   
                    $alias,   
                    array('read','update'));  
           }  
        }  
   
     }  
  }  
}  
?> 

 
Above you saw, how to create aro and aco each time a new user is registered on the system. Also you saw how to allow a user himself
the full CRUD previledges on his own record. Say User 'a' with user id '5' just registered on the site. Above code, will create an aro with
alias 'User::5' and an aco with alias 'User::5' and will create an entry in aros_acos table that would let aro with alias 'User::5' CRUD 
rights over aco with alias 'User::5'. Now no other user has access User 'a' except User 'a' and anyone who belongs to 'Admin' aro 
group. To verify, give following code a try 
 
Controller Class: 
Download code
<?php   
class TestController extends AppController  
{  
  var $name = 'Test';  
  var $components = array('Acl');  
  var $uses = array('User');  
  var $curLoggedInUserId = 3;  
 
  function view()  
  {   
    $aroAlias = 'User::'.$curLoggedInUserId;  
    $acoAlias = 'User::5';  
 
    if ($this­>Acl­>check($aroAlias, $acoAlias, 'read'))  
    {  
       echo 'Read access allowed for User Id'.$curLoggedInUserId;  
    }  
    else  
    {  
       echo 'Read access denied for User Id'.$curLoggedInUserId;  
    }  
  }  
}  
?> 

 
When you visit the above page (http://localhost/test/view), you will get 'access denied'. Now change the $curLoggedInUserId = 5, and 
try visiting the same page again, you will get 'allowed access'. This is because the logged in user id now is the same as user 'a'. And we
had defined that user 'a' has full rights on user 'a' record. Note what happens when you have $curLoggedInUserId = 1!! You still get 
'allowed access', now why did this happen? Just because User with userid 1 belongs to Admin group and he has full CRUD rights over 
any 'User' aco. Above code is a very crude code and is meant just to demonstrate the purpose of Acl check & is not meant to be used 
in production use. 
 
Above was a manual & tedious way to create aros and acos. Now I will now show you the magical way to create aros and acos without 
much effort on your end. All you have to do is implement the Acl Behavior which comes with cake 1.2 distribution. Below is the code 
that you would have to add to 'Post' Model.  
 
Model Class: 
Download code
<?php   
class Post extends AppModel{  
var $name = 'Post';  
var $actsAs = array('Acl'=>'controlled');  
// 'controlled' means you want to create a 'aco'  
// 'requester' means you want to create an 'aro'  
 
/**  
 * Returns the parent Alias for current  
 */  
function parentNode()  
{  
    return $this­>name;  
}  
 
}  
?> 

 
Above code, will now automatically create a new aco for every new post that is posted. The Acl behavior takes care of all details. Just 
so you know, in Acl behavior, there is 'afterSave' callback, which would be called once the save callback is completed in current model. 
 
Acl behavior would even delete the aco whenever the post is deleted, without any extra effort on your end. Isn't this cool? Hell yaaa! it 
is... Now you would want to setup the permissions on the newly create 'aco'? How do you do that, check out the code below: 
 
Controller Class: 
Download code
<?php   
class PostsController extends AppController {  
 
   var $name = 'Posts';  
   var $helpers = array('Html', 'Form' );  
   var $uses = array('Post');  
   var $components = array('Acl');  
 
   function add() {  
       if(!empty($this­>data)) {  
       $this­>Post­>data = $this­>data;  
              
           if ($this­>Post­>validates())  
       {  
         $this­>Post­>create();  
                  
        if($this­>Post­>save($this­>data))   
                {   
                    $acoNode = array('model'=>$this­>Post­>name,  
                                     'foreign_key' =>$this­>Post­>id);  
 
                    $aroNode = array('model'=>'User',  
                                   'foreign_key'=>$this­>getUserId());  
 
            // User has full control of the post he created  
            $this­>Acl­>allow($aroNode, $acoNode, '*');  
        }  
    }  
    }  
}  
?> 

 
So if a save is successful from Post then we know that the Aco is created and then all we have to do is setup proper aro and aco 
nodes and then give the required permissions and we are done!! 
 
I would welcome feedback via comments and suggestions. Let me know if you have any troubles implementing this. Till then enjoy 
baking. 
 
Cheers, 
Ketan Patel 

Comments   
CakePHP Team Comments   Author Comments   

  
1 Problem doing initial setup Question

Hi, I'm having troubles trying to setup the initial ACL config. I tried using the provided code (InitAclController) but I always run into 
problems (no Class defined or else). I tried going to the console but I'm having difficulties translating your setup into acl commands 
for the console. 
 
For example: 
 
$aro­>save(array(  
'model'=>'User',  
'foreign_key'=>null,  
'parent_id'=>null,  
'alias'=>'Admin'));  
 
Reading the console help, I can see the format is: 
 
create aro|aco  
would that translate into something like: 
cake acl create aro / User/Admin ? 
 
Any help would be very welcome. Thanks

Posted Jul 25, 2007 by camille moussette
  
2 Re Problem during initial setup Comment

Hi, I'm having troubles trying to setup the initial ACL config. I tried using the provided code (InitAclController) but I always run 
into problems (no Class defined or else).

Where do you create this init_acl_controller.php file? 
 

$aro­>save(array(  
'model'=>'User',  
'foreign_key'=>null,  
'parent_id'=>null,  
'alias'=>'Admin'));  
 
Reading the console help, I can see the format is: 
 
create aro|aco  

The above command would translate to 
 
 
create aro root Admin  
create aro root User  
create aro User User::1  

 
­­> Alias for parent Node 
­­> Alias for the node you are creating. 
 
It would ideal if you could use the init_acl_controller as it gives you clear idea of what you are getting started with.  

Posted Jul 25, 2007 by Ketan
  
3 Guest users Question

Assuming 'Guests' users are unidentified web visitors, how do you handler their access rights? They don't login, so they can't be 
assigned an ARO and thus ACL will reject their access to any actions. 
 
Sorry if the answer is too obvious, but after spending many hours on it I can't work this out.

Posted Jul 29, 2007 by Gorka Lopez de Torre
  
4 Guest Users Comment

I treat any user who does not have a user id to be a guest. By this what I mean is that whenever a user logs­in, I create a session 
variable with the userId and check it in the beforeFilter method of the controller. So if I do not find the userId in the session, it 
means that the user is a guest! Hope this helps, 
Ketan 
Free Classifieds ­ eClassifieds4U 

Posted Aug 1, 2007 by Ketan
  
5 Access Control for groups of records Question

Nice tutorial, really useful, thanks Ketan. 
 
I've a question about Access Control for groups of records. 
 
Say your app is multilingual and you have a model for articles that you use across all territories. You also have several administrator 
users all belonging to the same user group, each of which also belong to a territory or are "global". 
 
You only want to allow update & delete (and ideally read in the Admin part of the app) access to the articles belonging to a particular 
territory, to the users that also belong to that territory (or are global), but deny access to those administrators belonging to a 
different territory? 
 
Would you handle that scenario using ACL, if so, how, or would you do it another way? I do it using my own access control methods,
which I'll bung on the bakery soon, but I wonder how easy it would be to do it using ACL. 
 
I know this question might be more suited to the google group, but I think its a common problem that no tutorials on ACL that I've 
seen yet, actually discuss, so thought add it here.

Posted Aug 2, 2007 by Neil Crookes 
  
6 InitAclController is not working Question

What I'm doing wrong? I tried to run InitAclController and always get error "Class 'Aro' not found". I paste directly code of 
InitAclController and put file init_acl_controller.php into app/controllers directory. First time I saw model missing and I added: 
var $uses = array(); 

Posted Aug 2, 2007 by Patryk
  
7 What version are you using Comment

What I'm doing wrong? I tried to run InitAclController and always get error "Class 'Aro' not found". 

 
What version of cake are you using? This code uses the Acl Component that is available with cake 1.2.x.x and will work with 1.2.x.x. 

Posted Aug 5, 2007 by Ketan
  
8 Territory based ACL Comment

You only want to allow update & delete (and ideally read in the Admin part of the app) access to the articles belonging to a 
particular territory, to the users that also belong to that territory (or are global), but deny access to those administrators 
belonging to a different territory? 

 
You would add another group of users.  
 
Admin ­> Full Control on all records 
Territory1, Territory2 & so on ­> This group has update and read access to the respective territory based records.  
 
Whenever you create a record using your controller, depending on which territory the record belongs to, allow the territory group the
update/read access to that record/action.  
 
Say you have 3 territory. US, Canada & Mexico. You would have 6 groups.  
 
ADMIN, GUEST, USER, US_MODERATORS, CANADA_MODERATORS, MEXICO_MODERATORS.  
 
If a user registers to the US territory then in the controller, allow the US_MODERATORS group (ARO) the read/write access to that 
user(ACO).  
 
This is the first thought that came to my mind and I am sure could be implemented in much better way. But definitely ACL could be 
used for this situation very efficiently. 
 
Ketan 
Free Classifieds ­ eClassifieds4U 

Posted Aug 5, 2007 by Ketan
  
9 Cant get it working with 1.2.0.5427alpha Comment

What I'm doing wrong? I tried to run InitAclController and always get error "Class 'Aro' not found". 

 
What version of cake are you using? This code uses the Acl Component that is available with cake 1.2.x.x and will work with 
1.2.x.x.
 
I just did a fresh install of 1.2.0.5427alpha and I get the same "Fatal error: Class 'aro' not found in ..." error.

Posted Sep 21, 2007 by Kagor
  
10 Use Aro instead of aro Comment

Use 'Aro' instead of 'aro'. It is case­sensitive. There is a typo in the tutorial, I will fix it sometime soon. 
 
Ketan 
Free Classifieds ­ eClassifieds 4U 

Posted Sep 23, 2007 by Ketan
  
11 Class Aro not found.... Comment

Fatal error: Class 'Aro' not found in E:\wamp\www\acl\app\controllers\init_acl_controller.php on line 10 
 
The case sensetivity seems to be irrelevant, it cannot even find the 'Aro' (or aro).  
 
What are the pre­requisites for this tutorial to work correctly? Is it possible for you to show us your views? 
 
Also, in users_controller, shouldnt the lines that say: 
 
$aro­>save( 
'model' => $this­>User­>name, 
'foreign_key' => $this­>User­>id, 
'parent_id' => $parentId, 
'alias' => $alias 
);  
 
actually be 
 
$aro­>save(array( 
'model' => $this­>User­>name, 
'foreign_key' => $this­>User­>id, 
'parent_id' => $parentId, 
'alias' => $alias) 
);  
 
I assume your "posts" table is from the blog tutorial, speaking of the posts controller, there is an extra closing brace on line 27. 
 
 

Posted Sep 24, 2007 by Mike Green
  
12 and also.. Comment

on line 5 of init_acl_component.php, it should read: 
 
var $components = array('Acl'); 
 
Hopefully this will help others too :) 
 
Mike 

Posted Sep 24, 2007 by Mike Green
  
13 testacl controller problem Bug

in this file, $curLoggedInUserId isnt set, since it should be: 
 
$this­>curLoggedInUserId; 
 
in all occurences within the view() method.

Posted Sep 24, 2007 by Mike Green
  
14 Warning when running setupAcl Question
When running the setupAcl method from the InitAclController, CakePHP issues a warning about wrong usage of the $Acl­>allow() 
method. In my database no record is made for the User group. I figured out that when coding the "create & read" access as follows, 
there is no warning and everything works fine: 
$this­>Acl­>allow('User', 'Post', 'create');  
$this­>Acl­>allow('User', 'Post', 'read'); 

Can anybody tell me why the array notation doesn't work?

Posted Sep 30, 2007 by Jan Boonen 
  
15 What is difference bw cakephp 1.1 and cakephp 1.2 s ACL schema Question

I tried hard to investigate the differences between acl of cakephp 1.1 and cakephp 1.2 but not got any explanation for it  
. Kindly any one explain differences b/w the two db structure and purpose .For example model field in aro /aco table has added in acl 
1.2 and for what purpose is not define in this article (or i may have not noticed).  
 
All Your Kindness .

Posted Oct 24, 2007 by s a khan
  
16 regarding differences in 11 vs 12 Comment

Okay, so, apparently $aro­>create() is different in CakePHP 1.2. Yes? 
 
For example, a key difference in the code here versus the code in, say, this article: http://bakery.cakephp.org/articles/view/real­world­
access­control  
Is that $aro­>create() is used differently. 
 
Cake 1.1 
 
$aro­>create( 1, null, 'This is the Alias' );  

 
 
Cake 1.2 
 
$aro­>create();  
$aro­>save( array('foreign_key'=>1, 'parent_id'=>null, 'alias'=>'This is the Alias') );  

 
Is that right? Can anyone confirm this stuff? 
 
Thanks!

Posted Oct 24, 2007 by Jeffrey Silverman
  
17 regarding differences in 11 vs 12 Comment

here are some tidbits which I think are mostly correct: 
 
(1) The ACL page in the Cake Manual for Cake 1.1 is not applicable to Cake 1.2 ACLs 
 
(2) The multiple $aro­>create() calls in this article's examples are to instantiate a new ARO each time, and then the $aro­>save(array
(...)) bit saves the new ARO to the database. 
 
(3) The $aro = new Aro(); could have been skipped and the Aro Model that is in the Acl component been used instead, directly, like 
so: 
 
 
$this­>Acl­>Aro­>create();  
$this­>Acl­>Aro­>save(array(...data...));  

 
(4) The location of the data Array() in the create() and save() operations could have been transposed. That is to say, one create() 
operation and one save() operation is needed to save each new ARO, but the data array() could be placed in either the create() or the
save() method. 
 
Possibly more, but that's all for now. 
 
later...
Posted Oct 24, 2007 by Jeffrey Silverman
  
18 AclBehavior and overwrite on Allow and Deny method Question

How to set acl behavior to create both aco and aro? 
 
I have created a new behavior Acl2 that extends AclBehavior  
 
Model Class: <?php   
var $actsAs = array('Acl'=>'controlled','Acl2'=>'requester');  
?> 

 
It's right so? 
 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­  
 
Using allow and deny method as the following code, I notice that the last call (deny) overwrite the first (allow). 
 
Controller Class: <?php   
$this­>Acl­>allow($aroAlias, $acoAlias, '*');  
$this­>Acl­>deny($aroAlias, $acoAlias, 'read');  
?> 

 
the result in db is: 
CRUD: 0 ­1 0 0 
 
but the result attended for me is: 
CRUD: 1 ­1 1 1 
 
 
An other example: 
Controller Class: <?php   
$this­>Acl­>allow($aroAlias, $acoAlias, 'create');  
$this­>Acl­>allow($aroAlias, $acoAlias, 'read');  
?> 

 
the result in db is: 
CRUD: 0 1 0 0 
 
but the result attended for me is: 
CRUD: 1 1 0 0 
 
There is a way to call method allow and deny on single action CRUD without overwrite other action CRUD? 
 
 
Sorry for my english,  
I hope I have been clear. 
 
Thanks to all

Posted Dec 20, 2007 by Gallax
  
19 Can I have a good example for ACL Question

I have just learn ACL but i don't so understand. Help me

Posted Dec 21, 2007 by one cart
  
20 The console command Comment

Sorry, but for some reason I cannot find that console command. Therefore, I cannot create the database. It would have been really 
helpful if you'd provided the SQL create scripts.

Posted Jan 16, 2008 by Ben
  
21 Console command for ACL Comment
Sorry, but for some reason I cannot find that console command.

The command is located in the directory /cake/console. For Windows users it is cake.bat, for *NIX users it is just cake (don't forget 
to do "chmod a+x" on cake). 
 
The SQL is constructed in the file cake/console/libs/acl.php from line 317 onwards (in the latest beta version). 
 
Hope that helps you.

Posted Jan 17, 2008 by Jan Boonen 
  
22 Where are the automatic checks Question

I don't see any checks occuring for automatic record level access. I do see that ACO and ARO are created automatically, which is 
great, even the correct "aros_acos" entries are made (i.e. User:5 has CRUD permission on Post:2), However user::5 is unable to 
access "/posts/edit/5"  
 
My ARO's 
 |­ADMIN  
 |­USER  
   |­User::5  
 |­GUEST 

My ACO's 
ROOT  
 |­USERS  
   |­User::5  
 |­POSTS  
   |­Post::1  
   |­Post::2  
   |­Post::3 

Ok ... I just looked at mysql logs, I see that it is checking only for my POSTS and ROOT aco_id (aco_id's: POSTS=5, ROOT=1) 
...  
WHERE Permission.aro_id = 2 AND Permission.aco_id IN (5, 1)    
...  
WHERE Permission.aro_id = 4 AND Permission.aco_id IN (5, 1) 

Seems that it should also check for aco_id that matches the record I have chose to edit

Posted Jan 28, 2008 by leftdrive
  
23 SQL for ACL tables Comment

Hi, Can somebody please post the SQL to create the three ACL tables. Some of us do not have Console access because of a shared 
environment. For sometime in the future, a web based setup in addition to the console would be a nice feature for cake. 
 
EDIT: I found it finally. Look in app/config/sql/db_acl/sql 
 
Thanks for any help, David

Posted Feb 2, 2008 by David Dear
  
24 Double Entries Comment

Does anyone else get duplicate entries when running the init_acl setupACL function? For example, if I try to add Admin, User and 
Guest AROs (using the code above), I get two of each. It is like the function runs twice somehow. Any ideas?

Posted Feb 2, 2008 by David Dear
  
25 syntax error Question

Hi when i want to run the controller InitAclController that i've copied from your tutorial but then i'm getting this error: 
 
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in 
C:\wamp\www\cakephp\test\controllers\init_acl_controller.php on line 62 
 
Can you help me?

Posted Feb 7, 2008 by rory
  
26 Using XAMPP and Mac OS X Comment

Thanks to TommyO for pointing me in the right direction, if you are using XAMPP and Mac OS X, visit http://www.keitr.com/xampp. 
You will need to do the steps outlined there for "cake schema run create DbAcl" to work. 

Posted Feb 20, 2008 by Jason Vendryes
  
27 allow and deny overwrite other fields with 0 Bug

Gallax, I understand exactly the problem you're having. 
 
Unless I'm missing something, Cake's rewritten Acl is horribly broken, because you cannot do an Acl­>allow followed by an Acl­>deny 
(or vice versa) for the same Aro/Aco combination. Instead Cake will overwrite the previously allowed fields with 0 (i.e. inherited). 
 
This has provided a major headache as I was trying to update a project to Cake 1.2 and could not understand why the ACL stuff was
totally butchering things.

Posted Feb 20, 2008 by Brad Garrett
  
28 bug 4190 filed for this Comment

FYI I filed a bug for the allow/deny overwrite problem that Gallax and I encountered. 
 
https://trac.cakephp.org/ticket/4190  

Posted Feb 20, 2008 by Brad Garrett
  
29 aro aco not founds Question

and what about the aro and aco not found problem in the InitAclController?

Posted Feb 22, 2008 by rory
  
30 Using with the Auth component Comment

Just for your information, the method described above, when used along with the built­in AuthComponent : 
 
AppController.php : 
Controller Class: <?php var $components = array('Acl','Auth');?> 

 
You must specify the type of authorisation somewhere in the  
Controller Class: <?php function beforeFilter(){  
$this­>Auth­>authorize = 'crud';  
}?> 

 
In fact, using the auth component, you get different ways to check the authorisation. Method described here is 'crud'  
Don't do like me trying to make it work set to 'actions' ;) 
 
Indeed, I find it really more simple to use a 'crud' than an 'actions' based authorisation (I don't have to create acos for every actions).  
However, I'm still looking how to 'map' actions as C,R,U or D actions....

Posted Mar 5, 2008 by David Coll
  
31 User Aro Aco creation revisited Comment

Hello, after spending a little time on this issue, here's what I get to work efficiently.. If it can help some out there with that wild 
beast :P 
 
First, the Alias for the aCos, I needed to put them in their pluralize way else I was getting not defined node error, when the Acl was 
looking for a match­up. 
 
So, in every models/model.php I use this for parentNode: 
Model Class: <?php   
var $name = 'Tag';  
    var $actsAs = array('Acl'=>'controlled');  
    function parentNode()  
    {  
        return Inflector::pluralize($this­>name);  
    }  
?> 

 
I don't remember if I've written the alias by hand for the aCos. But I'm sure I had to write them first for the aRos of the groups. 
 
Here is the parentNode for the model/user.php 
Model Class: <?php   
    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']);  
        }  
    }  
?> 

taken from here : http://realm3.com/articles/setting_up_users_groups_withacl_and_auth_in_cake_1.2.php  
Note: the parentNode for the Group is the same as the ones for aCos. 
 
­­­­  
Then for the creation of your users aro, aco & aros_acos : 
Here's a simpler version of the one written in this article : 
Controller Class: <?php   
if ($this­>User­>save($this­>data)) {  
 
    //Set the alias to be used in Aco, Aro & acos_aros table  
    $alias = $this­>User­>name.'::'.$this­>User­>id;  
    //Only sets the alias of the already pointed Aro  
    $this­>Acl­>Aro­>save(array('alias'   => $alias));  
      
    //set the Aco $parent node aliased as the controllers (plural, ie. Users)  
    $parent = $this­>Acl­>Aco­>findByAlias($this­>name);  
    //create a Aco for our user  
    $this­>Acl­>Aco­>save(array(  
                    'model'       => $this­>User­>name,  
                    'foreign_key' => $this­>User­>id,  
                    'parent_id'   => $parent['Aco']['id'],  
                    'alias'       => $alias    ));  
      
    //Sets permissions  
    $this­>Acl­>allow(  
                    $alias,   
                    $alias,   
                    array('read','update'));  
      
    $this­>Session­>setFlash(__('The User has been saved', true));  
    $this­>redirect(array('action'=>'index'));  
} else {.......  
?> 

no need to call a new aro, aco stuff. And the best is that you'll add an alias to your aRo directly. 
 
Here's a little plus: as a requester, if you delete the user, it's aRo will also be deleted automatically. But the aCo will stay there. Use 
this in the delete function : 
Controller Class: <?php   
        //delete associated Aco  
        $aco = $this­>Acl­>Aco­>findByAlias($this­>User­>name.'::'.$this­>User­>id);  
        $this­>Acl­>Aco­>del($aco['Aco']['id']);  
          
        if ($this­>User­>del($id)) {              
            $this­>Session­>setFlash(__('User deleted', true));  
            $this­>redirect(array('action'=>'index'));  
        }  
?> 
That way, the aCo table doesn't get filled up with empty references. 
 
Cheers. (I'm soooooo happy to finally have made this work :P )

Posted Mar 6, 2008 by David Coll
  
32 Vague... Comment

In general, this whole cake thing is simply too vague. The documentation is terrible and I find that I'm spending more time trying to 
figure out how to do something than actually getting any useful programming done. There's Beta, and then there's unfinished 
software. 
 
Specifically regarding this "tutorial", again it is simply too vague. Being a trained designer, one of the first rules of any kind of good 
design is too make instructions as simple and straight­forward as possible, while still being as detailed as possible. In short, ANYONE 
should be able to read the instructions and at least get to a point where they have a basic working prototype. 
 
This "tutorial" leaves a lot to be desired, infered, and assumed, which leaves big windows for mistakes. Where is this "ketan" person 
starting? Where is the code added to? Why are there amateur mistakes like missing brackets, etc...? 
 
Furthermore, the console barely works in Mac OSX, and the 'cake acl initdb' has been deprecated for 'cake schema run create DbAcl' 
which doesn't actually work [on Mac OSX]. You get a MySQL connect error. But if you want to run it, the proper command is: 
./console/cake schema run create DbAcl 
 
Moreover, the correction to line 5 in the InitAclController class that Mike Green made above is incomplete. Because there is only a 
missing 's', it is difficult at first glance to know what he is correcting. So here's my correction of Mike's correction to line 5 in the 
InitAclController class: 
 
Line 5 is incorrect in that it defines the variable $component. This variable name MUST BE PLURAL, as in $components. So the correct
code should read: 
 
var $components = array('Acl'); 
 
Next, in the InitAclController class, where the $#@& does the following code go? It obviously doesn't go where "ketan" put it because
I get a parsing error. 
 
// Give admin full control over acos 'User' & 'Post'  
$this­>Acl­>allow('Admin', 'User', '*');  
$this­>Acl­>allow('Admin', 'Post', '*');  
 
// Give the user group only create & read access for 'Post'  
$this­>Acl­>allow('User', 'Post', array('create', 'read'));  
 
// Give the Guests only create access for 'User'  
$this­>Acl­>allow('Guest', 'User', 'create');  
 
My advice is to take this article down and do some serious revision. I feel like CakePHP is one big dis­information campaign designed 
for rapid frustration rather than rapid development. 
 
No offense to anyone, but this is a nightmare!!! This tutorial does absolutely nothing for me.

Posted Apr 15, 2008 by No Name
  
33 Durrr Comment

"Being a trained designer..." 
 
Well there's your problem.

Posted Apr 15, 2008 by Nate
  
34 Figures... Comment

This is just the type of response I would expect. Just proves that mediocrity is king! Didn't your parents teach you not to say 
anything if you don't have anything nice to say? 
 

"Being a trained designer..." 
 
Well there's your problem.
 

Posted Apr 15, 2008 by No Name
  
35 Coward Comment

You write a sack of bull with "No Name" and user acajaja ("here hehe" in spanish). That's the type of attitude I would expect from a 
coward. Come here, bring down years of work and tireless effort from a lot of people, that brought the biggest community for a PHP 
framework, lots of supporters, but hey... "No Name" has the absolute truth about what should be done and what needs changed. 
Give me a break. 
 
Go ahead and waste someone else's time. People here are too busy getting things done, and helping others.

Posted Apr 15, 2008 by Mariano Iglesias 
  
36 ACL and Auth Comment

You must specify the type of authorisation somewhere in the  
Controller Class: <?php function beforeFilter(){  
$this­>Auth­>authorize = 'crud';  
}?> 

 
In fact, using the auth component, you get different ways to check the authorisation. Method described here is 'crud'  
Don't do like me trying to make it work set to 'actions' ;) 
 
Indeed, I find it really more simple to use a 'crud' than an 'actions' based authorisation (I don't have to create acos for every 
actions). 
However, I'm still looking how to 'map' actions as C,R,U or D actions....

 
First off, THANK you for adding in the 'crud' method. I never came across that in all of my many nights exploring documentation.  
 
How do you get the Auth­> login/logout to work with the ACL? I can get the Auth component to work wonderfully using controller 
method. Also, when I use the CRUD method, as long as I have the Acos listed in the plural format, they work... except login and 
logout. Any ideas?

Posted Jun 20, 2008 by Wendy
  
37 Database Table Missing Comment

Hi, helpful guide :) 
 
I'm new to CakePHP and am halfway through creating my first proper application and have got to the point where I need ACL. I have 
followed the guide above upto the point where I try and and add ACOs/AROs to the database. I have tried the script above and doing
it in the console but both give me this error: 
 

Error: Database table aros for model Aro was not found. 

 
The table are definitely there as I can see aros, acos and aros_acos in my applications database (in phpmyadmin) along with my 
existing tables. I have tried the same thing on 2 servers now with no luck. 
 
I am hoping someone can help as I am out of ideas, searching for that error in quotes gives me 2 results on Google. 
 
Any help would be much appreciated :)

Posted Jul 10, 2008 by Adrian Harding
  
38 the above problem Comment

@Adrian 
 
did you set belongsTo in both models? aro and acl? 
 
var $hasAndBelongsToMany = array(...) 
using the console it does that automatically when creating the models 
 
 
I got another problem ­ and (like many others) don't get it to work properly 
database and its content is all set 
 
but it always throws n error like: 
Warning (512): DbAcl::allow() ­ Invalid node [CORE\cake\libs\controller\components\acl.php, line 367]  
while trying to allow something: 
$this­>Acl­>allow('groups', '/posts'); 
i tried like every tutorial around 
before this one, i had the "fellowship of the ring tut." 
with: 
$this­>Acl­>allow('Frodo', 'rings'); 
 
some problem... 
 
this is inside the testing() action in the tests_controller.php

Posted Jul 10, 2008 by Mark
  
39 Re the above problem Comment

Hi Mark 
 
I knew it had to be something silly I missed, thanks alot :) 
 

@Adrian 
 
did you set belongsTo in both models? aro and acl? 
 
var $hasAndBelongsToMany = array(...) 
using the console it does that automatically when creating the models 

Posted Jul 11, 2008 by Adrian Harding
  
40 check() to a specific Aco Comment

I don't see any checks occuring for automatic record level access. I do see that ACO and ARO are created automatically, which is 
great, even the correct "aros_acos" entries are made (i.e. User:5 has CRUD permission on Post:2), However user::5 is unable to 
access "/posts/edit/5"  
 
... 
Ok ... I just looked at mysql logs, I see that it is checking only for my POSTS and ROOT aco_id (aco_id's: POSTS=5, ROOT=1) 

 
I got the same problem. I set all Aro and Aco with Acl and Auth but it won't check the permission at the record level. Any suggestion 
to this?

Posted Jul 31, 2008 by KoPanda
  
41 How to fix code errors Question

I get an error that says: 
 
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /VolunteerCake/controllers/init_acl_controller.php on 
line 62 
 
Which appears to be this bit of code: 
 
   // Give admin full control over acos 'User' & 'Post'   
   $this­>Acl­>allow('Admin', 'User', '*');   
   $this­>Acl­>allow('Admin', 'Post', '*');   
 
   // Give the user group only create & read access for 'Post'    
   $this­>Acl­>allow('User', 'Post', array('create', 'read'));   
 
   // Give the Guests only create access for 'User'   
   $this­>Acl­>allow('Guest', 'User', 'create');   

 
Is there a missing function, or should these be moved inside the function in your example?
Posted Oct 20, 2008 by Rob Weaver
  
42 Syntax ERROR in example!!! Bug

Hey! 
 
"var $component = array('Acl');"  
 
instead 
 
"var $components = array('Acl');"  
 
C O M P O N E N T S  
 
aaaaaaaaa, shit!

Posted Feb 19, 2009 by Mark Drabant

  
Login To Submit A Comment 

Latest Articles Latest Code Latest News Latest Comments

LDAP Models in CakePHP    Caching ACL permissions  CakePHP Deutschland    pendant un séjour   


with CachedAclComponent   
Start to Finish: My Site  Release: 1.2.2.8120    How to show keys   
Designed using CakePHP    Efficient caching with 
Release: 1.2.1.8004    I don't know this is a bug or 
NamespaceFileEngine   
Twitter Datasource    The Gift of 1.2 final   not  

Building your first Twitter  HTML Cache Helper   echo echo echo   


RC4 ....Close  
mash­up   Serializing find("threaded")  Doesn't seem to be working.  
Captcha component with  data to XML  

Securimage   Wizard Component 1.2   

© 2006­2008 Cake Software Foundation