Использование компонента безопасности CakePHP с Дополнительным Авторизационным входом
У меня есть настройка REST API с CakePHP 1.3, которая использует компонент безопасности в сочетании с компонентом аутентификации для облегчения аутентификации HTTP для входа пользователя, например:
Пользовательский контроллер:
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('view', 'add');
if ( $this->params['url']['ext'] == 'json' && !$this->Auth->user() ) {
$this->Auth->allow('edit', 'add_friend');
$this->Security->loginOptions = array(
'type'=>'basic',
'login'=>'authenticate',
'realm'=>'MyRealm'
);
$this->Security->loginUsers = array();
$this->Security->requireLogin('edit', 'add_friend');
}
}
Контроллер приложения:
function authenticate($args) {
$data[ $this->Auth->fields['username'] ] = $args['username'];
$data[ $this->Auth->fields['password'] ] = $this->Auth->password($args['password']);
if ( $this->Auth->login($data) ) {
return true;
} else {
$this->Security->blackHole($this, 'login');
return false;
}
}
Все это работает нормально, но моя проблема в том, что у меня есть метод, который может дополнительно иметь аутентификацию или нет. Мне кажется, что компонент безопасности в CakePHP имеет метод requireLogin()
, который заставляет вас быть аутентифицированный.
Я попытался создать новый метод authenticate()
, который всегда возвращал значение true:
function optionalAuthenticate($args) {
$data[ $this->Auth->fields['username'] ] = $args['username'];
$data[ $this->Auth->fields['password'] ] = $this->Auth->password($args['password']);
$this->Auth->login($data);
return true;
}
Но, к сожалению, это не сработало.
Кто-нибудь знает, как с помощью компонента безопасности я могу выполнить какую-то дополнительную авторизацию?
1 answers
В итоге я добился этого, вообще не используя компонент безопасности, объявив метод optionalAuthenticate()
в app_controller.php :
function optionalAuthenticate() {
if(empty($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_PW']))
return false;
$data[ $this->Auth->fields['username'] ] = $_SERVER['PHP_AUTH_USER'];
$data[ $this->Auth->fields['password'] ] = $this->Auth->password($_SERVER['PHP_AUTH_PW']);
if($this->Auth->login($data))
return true;
else
return false;
}
А затем просто вызываю его из любых методов, которые я хочу попытаться аутентифицировать (например, в users_controller.php ):
function view($id = null) {
$this->optionalAuthenticate();
$user = $this->Auth->user();
if($user)
...