完成此操作后,我尝试激活 BasicAuth 而不是 FormAuth。
我在我的 UsersController 中重新实现了 login() 函数,如下所示:
public function login() {
if ($this->Auth->login()) {
return $this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash('Not able to login');
}
}
并将我的 AppController 中的 $components 变量更改为以下内容:
public $components = array(
'Acl',
'Auth' => array(
'authorize' => array(
'Actions' => array('actionPath' => 'controllers')
),
'authenticate' => array('Basic')
),
'DebugKit.Toolbar',
'Session'
);
BasicAuth“弹出窗口”按预期显示,但是当我尝试登录时,它会在无限循环中重新出现。完成本教程后,除了包含 DebugKit 外,我没有进行任何更改。
我错过了什么?我希望有人可以帮助我,因为我想用 CakePHP 编码我的下一个项目!
更新
应用控制器
public function beforeFilter() {
//Configure AuthComponent
$this->Auth->allow('display');
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
$this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
}
用户控制器
public function beforeFilter() {
parent::beforeFilter();
}
我正在尝试/users/
使用本教程中描述的 FormAuth 访问 eg ,它就像一个魅力,所以不会有权限问题。登录数据对于测试(管理员:管理员)非常简单,因此也应该没有问题。
更新 2
在我的 Apache 日志中,我得到以下信息,所以它说我没有被授权:
IP - - [16/Apr/2013:18:08:37 +0200] "GET /users/login HTTP/1.0" 401 5179 "-" "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:23.0)壁虎/20130414 火狐/23.0"
更新 3
出于某种原因,用户和密码似乎要么未发送,要么未保存在 PHP 中。如果我重写/lif/Cake/Controller/Auth/BasicAuthenticate
以下内容,它可以工作!
public function authenticate(CakeRequest $request, CakeResponse $response) {
$_SERVER['PHP_AUTH_USER'] = $_SERVER['PHP_AUTH_PW'] = "admin";
$result = $this->getUser($request);
if (empty($result)) {
$response->header($this->loginHeaders());
$response->statusCode(401);
$response->send();
return false;
}
return $result;
}
更新 4
不知道这是否有帮助,但服务器正在运行 Plesk 11,最新更新,没有特殊修改。
更新 5
好的,“thaJeztah”的答案很有用,但现在我遇到了更多可以细分的问题。
将模式从 fcgid 更改为 apache 模块
1.1。结果可以登录,但注销不起作用!重定向后,会话似乎被清除,但我仍然可以访问每个受限制的页面,直到我清除浏览器中的“活动登录”,因为它在 Firefox 中被调用。
var_dump($this->Session->read('Auth.User')); NULL
当我访问 /users/login 时,我会自动登录并重定向,而无需输入登录凭据。
print "<pre>"; print_r($this->Session->read('Auth.User')); print "</pre>"; Array ( [id] => 1 [username] => admin [group_id] => 1 [created] => 2013-04-12 12:54:26 [modified] => 2013-04-16 14:27:24 [is_active] => 1 [Group] => Array ( [id] => 1 [name] => Admin [created] => 2013-04-12 12:46:42 [modified] => 2013-04-12 12:46:42 ) )
使用基于 .htaccess 的解决方案也可以,它甚至看起来好像这是唯一需要的更改(我删除了 list() 代码,因为我从未进入它并且它也可以正常工作)。
2.1。与上述相同的问题,无法真正注销。
更新 6
可能是我最后一次或最后一次更新。:-) 现在我正在尝试通过将用户作为我创建的访客用户登录来进行“假注销”,该用户只能访问/users/login
和/pages/home
:http://guest:guest@my.domain/users/login
访问/users/logout
也可能有效,因为我在那里使用这段代码:
public function logout() {
$user = $this->User->find('first', array('conditions' => array('username' => 'guest')));
$this->Auth->login($user['User']['id']);
}
我简直不相信,这将是一致的,因为我相信会话数据将在一段时间内被删除,并且浏览器仍然获得活动的管理员登录并使用这些进行身份验证 - 我是对的吗?
之后,我可以再次使用http://admin:admin@my.domain/users/login
. 不完美,但至少适用于 Firefox。
所以基本上最后一个问题:关于如何在访问时强制使用 BasicAuth 的任何建议/users/login
?这样我就可以随时使用任何客户端轻松切换用户。
更新 7
我找到了一种方法来完全按照我接受的答案中的想法做到这一点。我希望我抓住了所有边缘情况,如果没有,请随时纠正我!
(Ps:当使用 ACL 和/或基本身份验证时,至少 AppController 中的 isAuthorized() 似乎被忽略了(它已被识别,但没有效果 - 当我在不更改 $components 的情况下删除该方法时,出现错误)导致对我来说,在不使用 isAuthorized() 的情况下实现这一点。)
应用控制器.php
public function beforeFilter($redirectlogin = true) {
//Configure AuthComponent
$this->Auth->allow('display', '/users/login');
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'home');
$this->Auth->loginRedirect = array('controller' => 'pages', 'action' => 'home');
$this->Auth->unauthorizedRedirect = array('controller' => 'HTTPCODE', 'action' => 'c403');
if($redirectlogin && $this->Session->read('Auth.needs_reauthenticate')) {
if(!($this->request->params['controller'] == $this->Auth->loginRedirect['controller'] && $this->request->params['pass'][0] == $this->Auth->loginRedirect['action'])) {
$this->redirect('/users/login');
}
}
}
用户控制器.php
public function beforeFilter() {
parent::beforeFilter(false);
}
public function login() {
$this->autoRender = false;
$this->Session->write('Auth.needs_reauthenticate', true);
if(!$this->Session->check('Auth.count')) {
$count = 1;
} else {
$count = $this->Session->read('Auth.count') + 1;
}
$this->Session->write('Auth.count', $count);
if($this->Session->read('Auth.needs_reauthenticate')) {
if((isset($_SERVER['HTTP_AUTHORIZATION']) && $this->Session->read('Auth.count') == 1) || (!isset($_SERVER['HTTP_AUTHORIZATION']) || empty($_SERVER['HTTP_AUTHORIZATION']) || !$this->Session->check('Auth.sent_header_step') || $this->Session->read('Auth.sent_header_step') < 1)) {
unset($_SERVER['HTTP_AUTHORIZATION']);
$this->Session->write('Auth.redirectTo', $this->Auth->redirect());
$this->response->header(sprintf('WWW-Authenticate: Basic realm="%s"', env('SERVER_NAME')));
$this->response->statusCode(401);
$this->response->send();
$this->Session->write('Auth.sent_header_step', 1);
}
if(isset($_SERVER['HTTP_AUTHORIZATION'])) {
$this->Session->write('Auth.sent_header_step', 0);
$base64string = base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6));
if(!(strlen($base64string) > 1 && substr($base64string, -1, 1) != ":")) {
$_SERVER['PHP_AUTH_USER'] = "";
$_SERVER['PHP_AUTH_PW'] = "";
}
$data = true;
}
$this->Auth->logout();
if(isset($data) && $this->Session->read('Auth.count') > 1) {
if($this->Auth->login()) {
$this->Session->write('Auth.needs_reauthenticate', false);
if($this->Session->check('Auth.redirectTo')) {
$redirectTo = $this->Session->read('Auth.redirectTo');
$this->Session->delete('Auth.redirectTo');
$this->Session->delete('Auth.count');
return $this->redirect($redirectTo);
} else {
return $this->redirect($this->Auth->redirect());
}
} else {
$this->response->statusCode(403);
// my 403 message
}
} else {
if(!isset($_SERVER['HTTP_AUTHORIZATION']) && $this->Session->read('Auth.count') > 1 && isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']) && trim($_SERVER['PHP_AUTH_USER']) != "" && trim($_SERVER['PHP_AUTH_PW']) != "") {
if($this->Auth->login()) {
$this->Session->write('Auth.needs_reauthenticate', false);
if($this->Session->check('Auth.redirectTo')) {
$redirectTo = $this->Session->read('Auth.redirectTo');
$this->Session->delete('Auth.redirectTo');
$this->Session->delete('Auth.count');
unset($_SERVER['HTTP_AUTHORIZATION']);
unset($_SERVER['PHP_AUTH_USER']);
unset($_SERVER['PHP_AUTH_PW']);
return $this->redirect($redirectTo);
} else {
return $this->redirect($this->Auth->redirect());
}
} else {
$this->response->statusCode(403);
// my 403 message
}
}
$this->response->statusCode(403);
// my 403 message
}
}
}
提前致谢
阿德里安