日期:2014-05-17  浏览次数:20453 次

cakephp中acl和auth详解

自学习cakephp 以来,一直没有完成搞懂acl,也查过了很多资料,但对它的用法也是一知半解,acl应该是cakephp中一个比较难懂的地方,这几天又重新看了下手册,发现acl没有相信中的难,但比我想象中的好用.欢迎大家转载和访问我的网站http://www.batterylaptops.co.uk
下面让我说说它的具体用法已经使用过程中应该注意到问题
准备前工作:
最好是能配置好bake,使bake命名有效,虽然这个不是必须的,不过有这个命令行工具以后我们会方便很多
在你的数据库 中导入下面的sql语句

  1. CREATE TABLE users (
  2. ? ? id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. ? ?? ???username VARCHAR(255) NOT NULL UNIQUE,
  4. ? ? password CHAR(40) NOT NULL,
  5. ? ? group_id INT(11) NOT NULL,
  6. ? ? created DATETIME,
  7. ? ? modified DATETIME
  8. );


  9. CREATE TABLE groups (
  10. ? ? id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  11. ? ? name VARCHAR(100) NOT NULL,
  12. ? ? created DATETIME,
  13. ? ? modified DATETIME
  14. );


  15. CREATE TABLE posts (
  16. ? ? id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  17. ? ? user_id INT(11) NOT NULL,
  18. ? ? title VARCHAR(255) NOT NULL,
  19. ? ? body TEXT,
  20. ? ? created DATETIME,
  21. ? ? modified DATETIME
  22. );

  23. CREATE TABLE widgets (
  24. ? ? id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  25. ? ? name VARCHAR(100) NOT NULL,
  26. ? ? part_no VARCHAR(12),
  27. ? ? quantity INT(11)
  28. );

在这里我们使用cake bake all命令工具快速生成models, controllers, 和 views(在这里我就详细介绍怎么使用cakephp中的bake命令了)


下一步,准备使用auth组件认证
首先我们打开users_controller.php在UsersController类中增加登录登出动作

  1. function login() {
  2. ? ? //Auth Magic
  3. }

  4. function logout() {
  5. ? ? //Leave empty for now.
  6. }
  7. 然后创建视图文件 app/views/users/login.ctp
  8. <?php
  9. $session->flash('auth');
  10. echo $form->create('User', array('action' => 'login'));
  11. echo $form->inputs(array(
  12. ? ?? ???'legend' => __('Login', true),
  13. ? ?? ???'username',
  14. ? ?? ???'password'
  15. ));
  16. echo $form->end('Login');

  17. ?>

下一步我们需要修改AppController(/app/app_controller.php),如果你的app目录下面没有app_controller.php文件的话,你可以自己创建一个

  1. <?php
  2. class AppController extends Controller {
  3. ? ? var $components = array('Acl', 'Auth');

  4. ? ? function beforeFilter() {
  5. ? ?? ???//Configure AuthComponent
  6. ? ?? ???$this->Auth->authorize = 'actions';
  7. ? ?? ???$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
  8. ? ?? ???$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
  9. ? ?? ???$this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
  10. ? ? }
  11. }
  12. ?>

接下来我们需要修改GroupsController和UsersController,这两个文件的目录大家应该都知道在哪里吧..
在这两个控制器中分别添加以下代码

  1. function beforeFilter() {
  2. ? ? parent::beforeFilter();
  3. ? ? $this->Auth->allowedActions = array('*');
  4. }

其实这段代码的意思是允许用户访问所有user和group下的action,当然这个后面是要改回来的

接下来我们要初始化acl表
因为现在我们的数据 库中就只有四个表,还没有导入acl表
我们用下面语句导入acl表到数据库中
在命令行中输入cake schema run create DbAcl

我们根据提示导入表

接下来我们需要修改user和group模型
首先我们打开model目录下的user.php增加以下代码(事实上你可以用下面代码替换)