让我们一起爱米兰
站内搜搜:
移动设备
请扫描二维码
或访问
m.milan100.com
您所在的位置 -> 米兰百分百 -> CakePhp -> 一个希望会有用的 CakePHP Auth 组件的教程

一个希望会有用的 CakePHP Auth 组件的教程

点击数:1394 发表时间:2010-07-05 17:51:39 作者: 来源链接:http://www.littlehart.net/atthekeyboard/2007/09/11/a-hopefully-useful-tutorial-for-using-cakephps-au
分享到:
分享到微信

在深入学习CakePHP框架时,让我最感到头大的一部分就是Auth组件。现在的问题是没有够用的关于如何使用和配置它的信息。幸运的是,我能通过CakePHP核心团队的gwoo和Nate得到一些内部信息。除此之外还有一些在不同网站上的零散信息。So,这里我将尝试集中一下那些信息,并向你展示一些关于如何使用此组件的初级到中级的知识。注意,这些代码是针对1.2.x.x的,而且截止到此文发表时(2007-09-11),Auth 组件的API尚未声明它是100%稳定的。换句话说,如果这些在6个月后不能用了可别怪我。

So,为了使用这个组件,你需要把它添加到你要使用的控制器的组件列表中。由于我通常需要Auth在我所有的控制器中都可用,我更倾向于把这个添加到 app_controller.php 中。

var $components = array('Auth'); 


So, 现在我们要想使用它,我们突然有了很多可以且需要设置的选项。在这个例子里我使用了一个现存项目中的代码。你可以在你需要用到Auth的控制器的beforeFilter()方法中设置这些不同的Auth选项。

$this->Auth->fields = array('username' => 'email', 'password' => 'pasword'); 

默认情况下,Auth 期望你有一个叫做User的模型,模型中有一个 "username" 和 "password" 字段。尽管你可以重新指定这些。

$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 

你需要告诉Auth哪个 controller/action 对儿用于为用户提供登录表单。

$this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'index'); 

告诉Auth组件在验证通过后重定向到哪儿。

$this->Auth->logoutRedirect = '/'; 

... 还有当你登出的时候退到哪儿。

$this->Auth->loginError = 'Invalid e-mail / password combination.  Please try again'; 

你可以指定当验证失败时显示什么错误信息。

$this->Auth->autoRedirect = false; 

有时你不想将通过验证的用户重定向到$this->Auth->loginRedirect中指定的位置,因为你需要做一些用户通过验证后的事情。在这段代码中我用到了这个,它会检查我们是否有一个用于登录的包含用户验证信息的Cookie。

function login() {
        if ($this->Auth->user()) {
            if (!empty($this->data)) {
                if (empty($this->data['User']['remember_me'])) {
                    $this->Cookie->del('User');
                }
                else {
                    $cookie = array();
                    $cookie['email'] = $this->data['User']['email'];
                    $cookie['token'] = $this->data['User']['pasword'];
                    $this->Cookie->write('User', $cookie, true, '+2 weeks');
                }
 
                unset($this->data['User']['remember_me']);
            }
 
            $this->redirect($this->Auth->redirect());
        }
    } 
$this->Auth->authorize = 'controller'; 

这是Auth中新添加的,你可以指定一些关于Auth可以从哪儿获取更多信息的附加信息。通常,Auth会假设你已经使用Cake自己的ACL设置好了一些东西。我不需要任何像那样复杂的东西,所以我看到我可以绕过它时我感到很高兴。当你设置 $this->Auth->authorize 为"controler" 时,你就告诉了Auth组件从一个叫做“isAuthorized”的动作中获取用户是否已通过验证的更多信息。这里有一个简单的:

function isAuthorized() {
        if (isset($this->params[Configure::read('Routing.admin')])) {
            if ($this->Auth->user('admin') == 0) {
                return false;
            }
        }
        
        return true;
   } 


我假定那个例子是可以自解释的。现在,如果你设置 $this->Auth->authorize 为"model",你就可以在模型中创建一个类似事情的特殊的方法。多谢 AcidMax 在此文中想向你展示如果你用"model"作为 $this->Auth->authorize 的值时该做些什么。这里也有一个 $this->Auth->authorize 的 'crud' 选项,但我自己还没用过。你可以使用 $this->Auth->mapActions 来告诉Auth什么动作映射到了不同的CURD动作上:

$this->Auth->mapActions(array('read'=> array('display'))); 

像我所说,我没有傻乐吧唧的围绕着它。一旦我做了,我会更新这个帖子对它做更多分析。

$this->Auth->allow('add', 'view'); 

你需要告诉Auth什么动作是可以不经过身份验证即可访问的。经常困扰初学者的一个问题就是"login"和"logout"已经是Auth知道不需要验证的动作了。如果你把"login"和"logout"放在那儿,Auth会变得很古怪并且会完全地绕过身份验证。所以,不要那样做。

现在,这儿还有其他一些对使用Auth的人有用的特性:

function logout() {
        $this->Session->setFlash("You've successfully logged out.");
        $this->redirect($this->Auth->logout());
    } 

$this->Auth->logout 将会返回你告诉Auth的那个你想让人们在他们登出后被送往的URL。

$userId = $this->Auth->user('id'); 


用户验证通过后你可以从User模型中提取用户信息。User模型中的任何字段你都可以得到。像这样做不是很好吗:

if ($this->Auth->user('admin') == true) {
     $this->Session->setFlash('You are an admin');
} 



~。这是很多在你使用Auth构建应用时需要尝试和记在你脑袋中的东西。但还不止这些。Auth组件会自动加密你放在"password"表单域中的值。它会在你登录和……当你在User模型中创建一条新记录时都这样做。所以你需要确保你表中保存密码的字段有足够的长度可以接受加密后的密码。如果你需要在密码保存之前做一些事情,你可以通过使用$this->Auth->password("要保存的密码");来获得需要保持的值。

无论怎样,我肯定我漏掉了一些其他的深层的东西,但我希望我已经在想你展示Auth组件是多么容易上做的不错了, 当你懂得它实际是怎样工作的时候。



--------------
OMG,终于翻译完了,可能很多地方不通顺,不知道是不是被我搞得这篇文章中国人和老外都看不懂了。

0
很 好
0
一 般
2
差 劲
热门新闻
相关文章
上一篇:
下一篇: CakePHP: Assigning The Return Value of New By Refe
评论区
匿名

返回首页 | 收藏本页 | 回到顶部
Copyright 2010. 米兰百分百 Powered By Bridge.
京ICP备15050557号