语境:
我的问题涉及一个我正在开发的论坛,就像SO一样:
我希望此ACL在站点范围内应用,默认情况下拒绝所有资源.
我阅读了使用Zend_Acl的基础知识 - 您基本上创建角色(访客,成员,管理员),并拒绝或允许这些角色的资源(控制器,方法).关于如何在应用程序中实际实现acl代码的文档并不是非常具体,所以我继续关注SO ..
来自marek的一个非常有用的stackoverflow 答案揭示了这个问题,但由于我的不熟悉,我仍然不能完全理解如何正确地实现这一点,并考虑到最佳实践.
海报configAcl.php
在应用程序根目录中有一个静态文件,用于初始化acl对象,添加角色,从每个控制器创建资源,提供admin
对所有内容的normal
访问,访问除管理员之外的所有内容,并将acl对象存储在注册表中以供以后使用.
$acl = new Zend_Acl();
$roles = array('admin', 'normal');
// Controller script names. You have to add all of them if credential check
// is global to your application.
$controllers = array('auth', 'index', 'news', 'admin');
foreach ($roles as $role) {
$acl->addRole(new Zend_Acl_Role($role));
}
foreach ($controllers as $controller) {
$acl->add(new Zend_Acl_Resource($controller));
}
// Here comes credential definiton for admin user.
$acl->allow('admin'); …
Run Code Online (Sandbox Code Playgroud) 我正在使用Zend_Auth(除其他外)使用Zend_Auth进行新的应用程序,但无论出于何种原因,此错误消息在任何位置完全随机出现(或者它接缝)
Zend_Session::start()
- /home/hannes/workspace/develop/library/Zend/Session.php(Line:480):错误#8session_start()
[function.session-start]:ps_files_cleanup_dir:opendir(/ var/lib/php5)失败:权限被拒绝( 13)阵列
我正在尝试更改Zend_Auth的会话后端.但无法成功.在我的bootstrap.php;
$oBackend = new Zend_Cache_Backend_Libmemcached(
array(
'servers' => $servers,
'compression' => false
) );
// configure caching frontend strategy
$oFrontend = new Zend_Cache_Core(
array(
'caching' => true,
'automatic_serialization' => true
) );
// build a caching object
$cache = Zend_Cache::factory( $oFrontend, $oBackend );
$saveHandler = new \Application\Auth\Adapter\Memcached();
$saveHandler->setCacher($cache);
\Zend_Session::setSaveHandler($saveHandler);
Run Code Online (Sandbox Code Playgroud)
它成功地保存了值memcache没有问题.我测试一下;
$namespace = new Zend_Session_Namespace();
$namespace->name = "Fatih";
Run Code Online (Sandbox Code Playgroud)
在其他控制器;
$ns = new Zend_Session_Namespace();
var_dump($ns->name);
Run Code Online (Sandbox Code Playgroud)
没关系,但我在memcache中看不到Zend_Auth值.但是如果var_dump($_SESSION)
我能看到它就像;
["Zend_Auth"]=> array(1) { ["storage"]=> object(Application_Security_Auth_Storage)#66 (1) { ["_user":protected]=> object(Application_Security_Auth_User)#84 (4) { ["id":protected]=> object(MongoId)#87 (1) …
Run Code Online (Sandbox Code Playgroud) 尝试加载Zend Framework应用程序时出现此错误:
致命错误:在/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php:462中,带有消息'session'的未捕获异常'Zend_Session_Exception'已由session.auto-start或session_start()启动
堆栈跟踪:
#0 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session/Namespace.php(143):Zend_Session :: start(true)
#1 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth/Storage/Session.php(87):Zend_Session_Namespace - > __ construct('Zend_Auth')
#2 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(91):Zend_Auth_Storage_Session - > __ construct()
#3 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Auth.php(141):Zend_Auth-> getStorage()
#4 /www/htdocs/w00a1ed7/autospin/redaktion/application/layouts/scripts/layout.phtml(31):Zend_Auth-> hasIdentity()
#5 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View.php(108):include('/ www/htdocs/w00 ...')
#6 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/View/Abstract.php(831):Zend_View - > _ run('/ www/htdocs/w00 ...')
#7/www/htdocs/w00a1ed在第462行/www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.php
我Zend_Auth
在我的本地服务器上使用它并且运行良好,但在生产服务器上我得到了前面的错误,但不是每次都有.
我检查了文件中session.autostart
设置0
的.htaccess
内容.
我该如何解决这个错误?
感谢您的回答,但我没有在任何地方使用session_start().仅适用于ZF.
我只在共享服务器上有这个问题,在我的本地服务器脚本上工作得很好.
我在这段代码中使用INIT函数:
protected $ user;
public function init()
{
if(!Zend_Auth::getInstance()->hasIdentity())
{
$this->_redirect('auth/login');
}else
{
$this->user = Zend_Auth::getInstance()->getIdentity();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试仅在indexAction中设置tis代码,以便其他操作不必查看Auth ...但仍然有问题.
我有没有办法设置一个Action不要检查会话或这样的想法?
Beste问候
我有一个登录后面的应用程序,并使用zend_acl和zend_auth.
在预分派期间,我有一个ACL插件,可以为ACL创建所有规则.我还有一个Auth插件,用于检查您是否已登录,如果可以,则根据ACL访问所请求的资源.
由于应用程序完全在登录后面,因此只有在您登录时才会创建ACL.
单元测试这似乎是不可能的,或者更可能是我错过了一些明显的东西.
在我的单元测试设置方法中,我模拟了一个返回zend_auth实例的成功登录.通过的测试表明此登录成功.
但是,如果我然后通过测试尝试分派到另一个位置,或者评估登录用户是否可以访问给定资源,则它总是被插件拒绝,因为它们仍然没有登录.我不知道为什么这是,有人可以提供建议吗?
例如,这传递:
public function testLoggedIn()
{
$this->assertTrue( Zend_Auth::getInstance()->hasIdentity() );
}
Run Code Online (Sandbox Code Playgroud)
这失败了,因为它被插件拒绝了:
public function testUserAccess()
{
$this->dispatch('/home');
$this->assertResponseCode(200);
$this->assertQueryContentContains('#nav_side');
$this->resetRequest()
->resetResponse();
}
Run Code Online (Sandbox Code Playgroud)
这个,我发现似乎仍然会重定向回登录页面,因为插件不知道用户已登录.
任何帮助非常感谢.
我的应用程序基于Zend Framework.我正在使用Zend_Auth
身份验证,但我不确定是否Zend_Acl
会对我有用,因为坦率地说,我看到的例子对我的需求来说太简单了或者让我困惑.
我正在考虑将我的应用程序中的元素作为资源,这些资源可以拥有权限.包含资源权限的角色是动态定义的,分配给用户.我将这些信息存储在规范化表格中.
角色实际上只是资源权限的集合,没有层次结构.资源的一个例子是'Page'.每个人都可以查看页面,但经过身份验证的用户需要"添加","编辑"或"删除"权限才能对页面执行任何其他操作.
这与Zend ACL相匹配吗?我是否会以一种会给我带来问题的方式思考ACL?
我的解决方案
Typeonerror获得了荣誉,但这是我的具体解决方案.
我扩展了Zend_Acl
以简化我的使用,因为我只加载当前用户的角色:
class My_Acl extends Zend_Acl
{
protected $_role_id;
public function setRole($role_id)
{
$this->_role_id = $role_id;
return $this->addRole($role_id);
}
public function getRole()
{
return $this->_role_id;
}
public function deny($resource, $privilege)
{
return parent::deny($this->_role_id, $resource, $privilege);
}
public function allow($resource, $privilege)
{
return parent::allow($this->_role_id, $resource, $privilege);
}
public function isAllowed($resource, $privilege)
{
return parent::isAllowed($this->_role_id, $resource, $privilege);
}
}
Run Code Online (Sandbox Code Playgroud)
要填充的ACL我执行一个查询返回resource
,privilege
和role_id
列.该 …
我Zend_Auth
用于在门户网站中进行身份验证.
一个正常的mySQL"users"表与a login
和password
列被查询,并且用户登录.
但是,我还有两组我想要进行身份验证的用户.所有这三个用户组都在其他表中拥有登录数据.他们的数据来自外部来源,因此不希望将这些登录帐户合并为一个.
因此,用户可能是来自三个组中的任何一个的经过身份验证的用户,甚至是所有三个组,同时也是这三个组中的任何一个.
三个登录组中的每一个都有自己的登录表单和注销按钮.
目前,我有一个单一,直接的Zend_Auth
登录,取自一些教程并稍加修改,看起来大致如下:
function login($user, $password)
{
$auth = Zend_Auth::getInstance();
$storage = new Zend_Auth_Storage_Session();
$auth->setStorage($storage);
$adapter = new Zend_Auth_Adapter_DbTable(....);
$adapter->setIdentity($username)->setCredential($password);
$result = $auth->authenticate($adapter);
if ($result->isValid())
......... success!
else
.... fail!
Run Code Online (Sandbox Code Playgroud)
我将在哪里开始提供此服务并解决三个组的单独"登录"状态?我的想法是,我想分享会话,并分别管理身份验证.
这可能吗?也许有一个简单的前缀使这很容易?这个问题上是否存在任何教程或资源?
我是Zend Framework的新手.
我正在使用Zend_Auth
它setCredentialTreatment
来设置哈希方法和盐.我看到所有的例子都是这样的,其中salt
似乎是作为文本插入的.
- > setCredentialTreatment('SHA1(CONCAT(盐))?
但我的盐存储在数据库中.我可以先检索它然后使用它setCredentialTreatment
但是有没有办法可以直接将它定义为字段名称,所以setCredentialTreatment
会知道从那个字段中获取它吗?有点像我们为用户名或密码定义字段名称的方式
->setCredentialColumn('password')
Run Code Online (Sandbox Code Playgroud)
我遇到的另一个问题是我想使用SHA512而不是SHA1.这可能还是不可用?我看到的所有示例都使用SHA1.
我应该说我是一个相当新的zend并且正在移植一个现有的应用程序,所以请轻松地告诉我答案.
我使用Zend_Auth作为我的一个项目,但到目前为止还没有弄清楚如何设置会话的生命周期,或者如何扩展它(假设它应该运行5分钟并且应该在用户做出动作时重置为),这是我的初始化代码:
$authAdapter = new Zend_Auth_Adapter_DbTable($this->_model->pdo);
$authAdapter->setTableName('normal_folks')
->setIdentityColumn('username')
->setCredentialColumn('password');
$post = $this->_request->getPost();
$authAdapter->setIdentity($post['username'])
->setCredential($post['password']);
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
if($result->isValid())
{
$userInfo = $authAdapter->getResultRowObject(null, 'password');
$authStorage = $auth->getStorage();
$authStorage->write($userInfo);
if(strlen($post['refferer']) > 1){
header("Location: ".$post['refferer']);
}elseif(strlen($this->_request->getParam('ref_action')) > 1){
Zend_Controller_Action::_forward($this->_request->getParam('ref_action'),"admin",null,null);
}else{
Zend_Controller_Action::_forward("index","admin",null,null);
}
}
Run Code Online (Sandbox Code Playgroud)
蚂蚁这个我如何检查用户是否登录:
if(Zend_Auth::getInstance()->hasIdentity()){
echo "Woho!";
}else{
die("invalid-identity");
}
Run Code Online (Sandbox Code Playgroud)
它可能就在我面前,但我无法理解,帮助?请?好吗?:d
我在寻找身份验证的教程与Zend 2和学说2.特别是创建控制器和适配器.
官方文档过于全球化对我没有帮助.
谢谢
编辑:
我使用"Doctrine Entity"(名称空间User\Entity;)
实体在module.config.php文件中注册:
'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
)
)
),
)
Run Code Online (Sandbox Code Playgroud)
但是现在,我如何将我的identityClass键指向我的适配器?控制器:
use Zend\Mvc\Controller\AbstractActionController,
Zend\View\Model\ViewModel,
Zend\Authentication\AuthenticationService,
Doctrine\ORM\EntityManager,
DoctrineModule\Authentication\Adapter\ObjectRepository as DoctrineAdapter,
User\Entity\User,
User\Form\UserForm;
class UserController extends AbstractActionController
{
protected $em;
public function setEntityManager(EntityManager $em)
{
$this->em = $em;
}
public …
Run Code Online (Sandbox Code Playgroud) zend-auth ×10
php ×9
zend-acl ×3
session ×2
zend-session ×2
.htaccess ×1
doctrine-orm ×1
hash ×1
lifetime ×1
phpunit ×1
security ×1
unit-testing ×1