文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>ZendFramework之Acl+Auth+Dispatcher数据库表认证..

ZendFramework之Acl+Auth+Dispatcher数据库表认证..

时间:2010-04-21  来源:admin126com

ZF 的版本跟新实在太快了,一个多月前开始用1.84做自己的项目,就自己一个人专研的,实在是学的太慢,网上最新版本实例几乎没有,遇到问题,google 翻烂都找不到方法,都说英文资料比较丰富,但这一个月google下来感觉也不咋样啊,特别是1.8x新版的。没办法,就只有分析源码来理解喽。。。

如果只是针对 Acl + Auth 的话,网上找的资料也能拼凑出个大概来,虽然都是老版本的,但也知道是怎么回事的,关键是这个Dispatcher,1.8x在哪里,怎样注册这个
My_Plugin_Auth 完全不明白,实在是把我弄晕了,研究了三天,今天终于成功了,赶紧趁热打铁,把整个过程写在这儿,跟大家分享下,我也好巩固下思路,当然不足之处肯定是很多的,也希望大家能不吝赐教,谢谢!

Dispatcher 中的 preDispatch 是分发前被调用的方法,通过重载这个方法,实现对行为的过滤,个人理解也就是在这儿监视用户当前行为是否被授权并进行相应调控吧。
另外,preDispatch 授权的验证应该是只能是在 frontController 里面重载这个方法才行,我之前稀里糊涂的,在controller_action里面重载这个方法,一直死循环,郁闷的要死!
今天上午看了一个 dispatch 的模型图,才恍然大悟的。大家也可以看看这个pdf,我在国外网站上找到的,结构非常清晰了,大家看看就知道了
下载地址:zendframeworkdispatchworkflow-090508180623-phpapp02.pdf 223KB

Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initControllers()
{
$this->bootstrap(‘FrontController’);
//print_r(get_class_methods($this->frontController));
//exit;
require_once realpath(APPLICATION_CURR . ‘/acl/Acl.php’);
require_once realpath(APPLICATION_CURR . ‘/acl/Auth.php’);

$acl = new MyAcl;
$auth = Zend_Auth::getInstance();
$this->frontController->registerPlugin(new My_Plugin_Auth($auth, $acl));
}

Acl.php

class MyAcl extends Zend_Acl
{
public function __construct()
{
$this->add(new Zend_Acl_Resource(‘System_Category’));
$this->add(new Zend_Acl_Resource(‘System_Global’));
$this->add(new Zend_Acl_Resource(‘Article_Category’));
$this->add(new Zend_Acl_Resource(‘Article_Page’));
$this->add(new Zend_Acl_Resource(‘index’));
$this->add(new Zend_Acl_Resource(‘login’));
$this->add(new Zend_Acl_Resource(‘error’));

$this->addRole(new Zend_Acl_Role(‘guest’));
$this->addRole(new Zend_Acl_Role(‘administrator’));

$this->allow(‘guest’, ‘login’, null);
$this->allow(‘administrator’, null, null);
}
}

Auth.php

class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{
private $_auth;
private $_acl;

// 认证没有通过(没有登陆)转向登录页面
private $_noauth = array(
‘module’ => ‘default’,
‘controller’ => ‘login’,
‘action’ => ‘index’);

// 没有权限转向错误页面
private $_noacl = array(
‘module’ => ‘default’,
‘controller’ => ‘error’,
‘action’ => ‘index’);

public function __construct($auth, $acl)
{
$this->_auth = $auth;
$this->_acl = $acl;
}

// 重载 preDispatch() 方法,认证用户
public function preDispatch($request)
{
if ($this->_auth->hasIdentity()) {
// 获取当前用户角色
$role = $this->_auth->getIdentity()->roleName;
}
else {
$role = ‘guest’;
}

$controller = $request->controller;
$action = $request->action;
$module = $request->module;
$resource = $controller;

if (!$this->_acl->has($resource)) {
$resource = null;
}

// Acl 配置该角色不能执行 $resource $action 的行为时
if (!$this->_acl->isAllowed($role, $resource, $action)) {
// 用户是由于没有通过认证 则 跳转到登录页面
if (!$this->_auth->hasIdentity()) {
$module = $this->_noauth['module'];
$controller = $this->_noauth['controller'];
$action = $this->_noauth['action'];
}
else {
// 用户没有权限,提示错误
$module = $this->_noacl['module'];
$controller = $this->_noacl['controller'];
$action = $this->_noacl['action'];
}
}

// 设置转向参数
$request->setModuleName($module);
$request->setControllerName($controller);
$request->setActionName($action);
}
}

LoginController.php

class LoginController extends Abstract_Controller
{
public function indexAction()
{
if ($this->_auth->hasIdentity()) {
// Already authenticated? Navigate away
$this->_redirect->myRedirect(‘/app/admin/index’);
}
$this->_view->display(‘login.html’);
}

public function checkAction()
{
if($this->_request->isPost()) {
// 过滤用户输入
$filter = new Zend_Filter_Striptags();
$username = trim($filter->filter($this->_request->getPost(‘account’)));
$password = trim($filter->filter($this->_request->getPost(‘password’)));

$bootstrap = $this->getInvokeArg(‘bootstrap’);
$db = $bootstrap->getResource(‘db’);
// 数据库表认证
$authAdapter = new Zend_Auth_Adapter_DbTable($db, ‘blog_system_user’, ‘account’, ‘password’);
$authAdapter->setIdentity($username)->setCredential(md5($password));
$result = $this->_auth->authenticate($authAdapter);

if($result->isValid()) {
// 将当前用户于 user 表中的记录除去 password 字段内容,其他的字段数据全部取出来
$data = $authAdapter->getResultRowObject(null, ‘password’);
// 这里添加当前用户的角色信息,由于 $data->roleID , 只记录了 id ,需要在 role 表里面查询 roleName
// 添加当前用户的角色名
$data->roleName = ‘administrator’;

// 将当前用户信息存入 Zend_Session
$this->_auth->getStorage()->write($data);
//$this->_redirect->myRedirect(‘/app/admin/index’);
echo $result->getCode();
}
else {
//$this->_view->assign(‘message’, $result->getMessages());
//print_r($result->getMessages());
//$this->_redirect->myRedirect(‘/app/admin/login’);
// 我用的 Ajax 判断登陆的所以直接 echo
echo $result->getCode();
}
}
}
}

上面就是4个文件的代码就是整个 认证+授权+分发 所涉及到的,都是最基础的,比较简单了,没想到用了三天才理解,这部分做完,我的整个项目也差不多完成了 嘿嘿!
大家看到有不足,或者有问题的地方 还麻烦你给指出来哦 谢谢啊!
欢迎转载,但请注明出生地哦!http://www.163fly.com/node/313

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载