PHPEye开源社区 » Zend Framework 使用讨论 » Zend_Auth使用示例
《Programming PHP》第二版上市
2007-7-3 01:25 番茄红了
Zend_Auth使用示例

以下是我在项目中使用Zend_Auth的代码,个人感觉在一开始未理解时会比较困难,所以节选出来供大家参考一下
有鸡蛋的请别扔石头~~:lol :lol
[code]
    protected $_auth;
    protected $_userId;
    protected $_userName;

    public function init()
    {
        $this->_auth = Zend_Auth::getInstance()
             ->setStorage(new Zend_Auth_Storage_Session('authNameSpace');
    }

    public function indexAction()
    {
        if ($this->_auth->hasIdentity()) {
                $this->_userId = this->_auth->getStorage()->read()->USER_ID;
                $this->_userName = $this->_auth->getStorage()->read()->USER_NAME;
            echo '登陆成功';
        } else {
            $this->_forward('login');
        }
    }

    protected function _logout()
    {
        $this->_auth->clearIdentity();
        Zend_Session::forgetMe();
    }

    public function loginAction()
    {
        if ($this->isPost()) {
            $f = new Zend_Filter_StripTags();
            $username = $f->filter($this->getPost('username'));
            $password = $f->filter($this->getPost('password'));

            //建立认证适配器 (DB适配器名/表名/用户名字段/密码字段)
            $authAdapter = new Zend_Auth_Adapter_DbTable($this->_db);
            $authAdapter->setTableName('USER')
                        ->setIdentityColumn('USER_NAME')
                        ->setCredentialColumn('USER_PASSWORD')
                        ->setIdentity($username)
                        ->setCredential(md5($password));
            $result = $this->_auth->authenticate($authAdapter);

            //建立持久连接
            if ($result && $result->isValid()) {
                if ($this->getPost('rememberMe')) { //记住密码
                    Zend_Session::rememberMe('315360000');
                } else {
                    Zend_Session::forgetMe();
                }
                $this->_auth->getStorage()->write($authAdapter->getResultRowObject(array('USER_ID', 'USER_NAME')));
                $this->_forward('index');
            } else {
                echo '登陆失败';
            }
        }
    }

[/code]

PS:汗一个,居然不支持PHP高亮

[[i] 本帖最后由 番茄红了 于 2007-7-3 01:27 编辑 [/i]]

2007-7-3 02:09 番茄红了
另外如果 Zend_Session::rememberMe(); 不起作用,请记得找个合适的地方添加 Zend_Session::start(); ,例如在入口文件中

2007-7-4 01:30 Haohappy
[quote]原帖由 [i]番茄红了[/i] 于 2007-7-3 01:25 发表 [url=http://www.phpeye.com/bbs/redirect.php?goto=findpost&pid=365&ptid=86][img]http://www.phpeye.com/bbs/images/common/back.gif[/img][/url]
PS:汗一个,居然不支持PHP高亮
... [/quote]

呵呵,不知道Discuz论坛的代码高亮功能怎么添加。。如果有谁知道麻烦指教一下,先谢谢了!

2007-7-4 09:44 wanghaozi
test
[code]
<?phpinfo()?>
[/code]
[php]
<?phpinfo()?>
[/php]

2007-7-8 09:27 xgwork
回复 #4 wanghaozi 的帖子

[php]

545454

[/php]

2008-1-10 18:40 huangam
回复 #1 番茄红了 的帖子

Zend_Session::rememberMe

是不是对所有会话数据都会持久记住,

可不可以只对某个命名空间下的数据持久记住,而其他命名空间下的不记住呢??

谢谢!

2008-3-14 17:58 布老虎
[php]
<?phpinfo()?>
[/php]

2008-3-26 16:20 Freebear
[quote]原帖由 [i]番茄红了[/i] 于 2007-7-3 02:09 发表 [url=http://www.phpeye.com/bbs/redirect.php?goto=findpost&pid=366&ptid=86][img]http://www.phpeye.com/bbs/images/common/back.gif[/img][/url]
另外如果 Zend_Session::rememberMe(); 不起作用,请记得找个合适的地方添加 Zend_Session::start(); ,例如在入口文件中 [/quote]

在zend_session的高级使用中有开启zend_session的方法,其中有两种是错误用法,你的是第三种,虽然正确,但对服务器而言:(以下是官方文档中的内容)

[color=Green]
3:
正确的:使用Zend_Session::start()开启会话。如果你想让每个页面请求都开启会话,那么应该在ZF应用程序的引导文件(index.php)中尽早的调用这个函数。[color=Red]开启会话有些额外的开销,如果只有部分页面请求需要开启会话,那么就:[/color]

    *

      在引导文件中,使用Zend_Session::setOptions()无条件地设置strict选项为true。
    *

      在任何Zend_Session_Namespace()对象初始化之前对需要使用会话的请求只调用Zend_Session::start()。
    *

      象往常一样,在需要会话的地方,使用"new Zend_Session_Namespace()",但必须确认先前已经调用过Zend_Session::start()了。

strict 选项防止 new Zend_Session_Namespace() 自动调用 Zend_Session::start()。 这样,这个选项有利于应用程序的开发者强制执行一个设计原则以避免在某些页面请求中使用会话, 因为在调用 Zend_Session::start() 之前,实例化 Zend_Session_Namespace 时,会抛出一个异常。开发者需小心地考虑使用 Zend_Session::setOptions() 所引起的冲突,由于它们对应于基本的ext/session这些具有全局作用选项。

4:

正确的:只要有需要使用会话的地方,就初始化new Zend_Session_Namespace(),并且基本的PHP会话将自动开启。这个极端简单的用法能在大多数的情形下很好地工作。然而,如果你使用地是默认的基于cookie的会话(强烈推荐使用这种方式),你必须确保在第一次调用new Zend_Session_Namespace()在任何PHP发向向客户端输出(例如,HTTP headers)之前。参见 第 35.4.2 节 “错误:Headers Already Sent” 有更多的信息。 [/color]

[[i] 本帖最后由 Freebear 于 2008-3-26 16:22 编辑 [/i]]

页: [1]
查看完整版本: Zend_Auth使用示例


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.