Что имеем:
- Приложение на CakePHP с организацией контроля доступа с помощью плагина Authake (CakePHP 2.8 Authake Authake plugin version 2.2.3) + Windows 2008 R2 + IIS сервер
- Настраиваем IIS: включаем в настройке сайта в иконке проверка подлинности опцию обычная проверка подлинности вместо анонимная проверка подлинности
- Изменяем контроллер UserController.php плагина Authake метод login ( ):
Что было
/** ******************************************************************
* Login functionality
*******************************************************************/
function login($Authake = null){
if(!isset($this->Authake))
{
$this->Authake = $Authake;
if ($this->Authake->isLogged())
{
if(!isset($this->request->data['requester']))
{
$this->Session->setFlash(__('You are already logged in!'), 'info', array('plugin' => 'Authake'));
$this->redirect(Configure::read('Authake.loggedAction'));
}
else
{
return __('You are already logged in!');
}
}
}
// для доменной авторизации без !
if (empty($this->request->data) )
// для обычной авторизации
//if (!empty($this->request->data) )
{
//$login = $this->request->data['User']['login'];
$login = iconv('Windows-1251', 'UTF-8', $_SERVER["AUTH_USER"]);
//$password = $this->request->data['User']['password'];
$password = iconv('Windows-1251', 'UTF-8', $_SERVER["AUTH_PASSWORD"]);
if (Configure::read('Authake.useEmailAsUsername') == false)
{
$user = $this->User->findByLogin($login);
}
else
{
$user = $this->User->findByEmail($login);
}
if (empty($user))
{
if(!isset($this->request->data['requester']))
{
$this->Session->setFlash(__('Invalid login or password!'), 'error', array('plugin' => 'Authake'));
return;
}
else
{
return __('Invalid login or password!');
}
}
// check for locked account
if ($user['User']['id'] != 1 and $user['User']['disable'])
{
if(!isset($this->request->data['requester']))
{
$this->Session->setFlash(__('Your account is disabled!'), 'error', array('plugin' => 'Authake'));
$this->redirect('/');
}
else
{
return __('Your account is disabled!');
}
}
// check for expired account
$exp = $user['User']['expire_account'];
if ($user['User']['id'] != 1 and $exp != '0000-00-00' and $exp != null and strtotime($exp) < time()) { if(!isset($this->request->data['requester']))
{
$this->Session->setFlash(__('Your account has expired!'), 'error', array('plugin' => 'Authake'));
$this->redirect('/');
}
else
{
return __('Your account has expired!');
}
}
// check for not confirmed email
if ($user['User']['emailcheckcode'] != '')
{
if(!isset($this->request->data['requester']))
{
$this->Session->setFlash(__('You registration has not been confirmed!'), 'warning', array('plugin' => 'Authake'));
$this->redirect(array('action'=>'verify'));
}
else
{
return __('You registration has not been confirmed!');
}
}
$userdata = $this->User->getLoginData($login, $password);
if (empty($userdata))
{
if(!isset($this->request->data['requester']))
{
$this->Session->setFlash(__('Invalid login or password!'), 'error', array('plugin' => 'Authake'));
return;
}
else
{
return __('Invalid login or password!');
}
}
else
{
if ($user['User']['passwordchangecode'] != '')
{//clear password change code (if there is any)
$this->User->unbindModel(array('hasAndBelongsToMany'=>array('Group')), false);
$user['User']['passwordchangecode'] = '';
$this->User->save($user);
}
$this->Authake->login($userdata['User']);
/* debug($userdata);
die(); */
// для доменной авторизации не работает проверить почему
//if(isset($this->request->data['requester']))
// для обычной авторизации
if(!isset($this->request->data['requester']))
{
/** *************************************************************************
* обрабатываем авторизацию для создания переменной сессии для ведения логов
** ************************************************************************/
$this->Session->setFlash(__('You are logged in as ').$userdata['User']['login'], 'success' , array('plugin'=>'authake'));
// ищем логин пользователя в базе так как в данной редакции authake логин передается зашифрованным
$username = $this->User->find('first', array('conditions' => array('User.id' => $userdata['User']['id'])));
$userlogin = $username['User']['login'];
// читаем к каким группам относится пользователь
$groups = $userdata['User']['group_names'];
$session_groups = '';
foreach ($groups as $group):
$session_groups .= $group.' ';
endforeach;
// создаем новую переменную сессии для ведения Userlog
$newUserlogsSettings = $userlogin.'|'.$session_groups;
$this->Session->write('UserlogsSettings', $newUserlogsSettings);
if (($next = $this->Authake->getPreviousUrl()) !== null)
{
$this->redirect($next);
}
else
{
$this->redirect(Configure::read('Authake.loggedAction'));
}
}
else
{
return true;
}
}
}
}