gpt4 book ai didi

php - 使用 Zend_Auth 保护所有 Controller

转载 作者:可可西里 更新时间:2023-11-01 13:09:46 26 4
gpt4 key购买 nike

我将如何全局保护我的所有 Controller (我的登录 Controller 除外)以确保我的应用程序在所有点都是安全的(没有隐藏的 ajax 调用后门等)。我想我可以把它放在我的 Bootstrap 文件中,但这感觉不对吗?我试图避免向每个 Controller 添加任何代码。

建议?

最佳答案

编辑:这是对@singles 回复的补充。

您必须了解有两种不同的情况。 AuthAcl。 Auth 告诉您谁是用户,例如,您可以将没有 Auth 的用户重定向到您的登录 Controller ,并在登录后设置 auth 身份。然后 Acl 系统根据 Auth 数据(可以是用户 ID 或角色,存储在 Auth 存储中)做出是/否决定。

一个不错的解决方案是拥有 2 个 Controller 插件(在 Bootstrap 上以良好的顺序注册,Auth 然后 Acl)。如果您不使用 Controller 插件,则必须在需要时在每个 Controller 中调用 Acl 检查。如果您总是需要它,请使用插件。

在你的 Auth 插件 中实现 preDispatch() 来设置一个匿名身份,如果你没有从 Zend_Auth 返回身份的话。这是一个真实的代码片段:

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
// set a default anonymous identity
$auth->getStorage()->write(array('name' => 'anonymous','role' => 1,));
}
(...)

对于 Acl Controller 插件,任务也在 preDispatch() 中。您可以为每个请求的 url 启动 acl 检查(因此对于每个用户请求,甚至是 ajax)。这是部分片段,因此这只是您如何处理事情的示例:

public function preDispatch(Zend_Controller_Request_Abstract $request) {
$controller = $request->controller;
$module = $request->module;
$action = $request->action;
// here you should code something nice retrieving you Zend_Acl object
// with some caching options maybe, building roles, ressources, etc
$this->_acl = $this->getAcl();
if (!$this->_acl->isCurrentUserAllowed($module,'see')) {
$auth = Zend_Auth::getInstance();
$identity = $auth->hasIdentity('identity')? $auth->getIdentity() : null;
if(isset($identity)) {
if($identity['name'] == 'anonymous') {
// WARNING: avoid infinite redirect loops on login page
if (!($request->getControllerName() == 'login'
&& $request->getActionName()=='login'
&& $request->getModuleName() == 'default')) {
$request->setControllerName('login')
->setActionName('login')
->setModuleName('default');
return;
(...)

在这个系统中,最后一个重要的部分是 LoginController,在成功登录的情况下,您应该启动身份记录:

(...)
$auth = Zend_Auth::getInstance();
Zend_Session::regenerateId();
$storage = $auth->getStorage();
$rowobject = $authAdapter->getResultRowObject(null,'passwd');
$storage->write((array)$rowobject);
(...)

关于php - 使用 Zend_Auth 保护所有 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4943940/

26 4 0
文章推荐: java - 是否有 OAuth 2 服务器端 PHP 或 Java 实现?
文章推荐: html - 如何在滚动的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com