Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
3.15 Mб
Скачать
  1. Разработка программных модулей

      1. Авторизация

Работа с приложением начинается после того, как пользователь перешел по адресу http://ao.by. Перейдя по этому адресу, пользователь попадает на страницу авторизации.

Авторизация является важной частью системы. Она осуществляет идентификацию пользователя и предоставляет ему доступ к сайту и его данным. В тоже время, авторизация предотвращает несанкционированный доступ к данным, пользователя не зарегистрированными в система. В Вэб-приложении со стороны веб-сервера за это отвечает метод login контроллера AccountController.

При входе пользователя на сайт в первую очередь проверяется авторизован ли он. Это проверка происходит в методе beforeAction родительского класса BaseController, от которого наследуются все контроллеры.

public function beforeAction()

{

$actionWithoutAuthorization = array(

'clearData',

);

if(!in_array($this->action, $actionWithoutAuthorization)) {

$this->authorized = Acc::isAuthed();

if(!$this->authorized) {

RedirectManager::redirect('/login');

} else {

if(!$this->security->checkAccess($this->action)) {

if($this->request->isAjax()) {

JsonResponse::error('error', 0, $this->errorMessages['denied_access']);

} else {

RedirectManager::redirect404();

}

}

if(!in_array($this->action, $this->getNotRememberMethods())) {

$this->setSessionHistory();

}

}

$this->changePageEvent();

$this->transferToView();

$this->dataCleaning();

}

}

Метод beforeAction вызывается каждый раз при загрузке страницы и проверяет авторизован ли пользователь, который пытается попасть на страницу. Проверка прохождения пользователем авторизации осуществляется в следующем условии:

if(!$this->authorized) {

RedirectManager::redirect('/login');

}

Если пользователь не прошел авторизацию $this->authorized свойство будет иметь ложное значение и в этом случае пользователю будет предложено авторизовать, путем возврата его на страницу авторизации, представленной на рисунке 4.1.

Рисунок 4.1 – Форма авторизации

Это свойство примет истинное значение только в том случае, кода пользователь пройдет аутентификацию и авторизуется в базе данных, сервер приложений и веб-сервера.

Процесс аутентификации начинается с того, что пользователь пришедший на сайт вводит свои данные в виде логина и пароля в форме, представленной на рисунке 4.1. При нажатии на кнопку «Войти» осуществляется отправка данных POST-запросом на веб-сервер.

На веб-сервере данные принимаются методом login класса AccountController, листинг данного метода приведен ниже.

public function login()

{

/**

* @var AccountService $accountService

**/

$this->layout = 'account';

if($this->authorized) {

/*

* В случае если пользователь уже осуществил авторизцию, переадресовываем его на главную для него страницу

* или на страницу изменения пароля, в случае если действие его пароля истек.

*/

$this->redirectAuthUserPage(Acc::getAccountInfo());

}

if($this->request->isPost()) {

$accountService = ServiceFactory::getByName('account', $this, $this->request('login', array()));

$response = $accountService->login();

if(!$accountService->handleRequestError()) {

if($accountService->hasWarning()) {

Flash::set(ResponseStatuses::RESPONSE_WARNING, $accountService->getWarning());

}

$this->redirectAuthUserPage($response);

} else {

$error = $accountService->getError();

}

}

$this->addToJsData(

array(

'getKeyUrl' => LinkHelper::getUrl('getEncryptionKeyForElectronicKey')

)

);

$this->view->distributionPath = $this->siteCfg['distribution_path'] . $this->siteCfg['distribution_name'];

$this->view->error = !empty($error) ? $error : '';

}

В нем принимается решение повторить ли авторизацию или пропустить пользователя и задействовать его права на выполнение функций. Это метод вызывает метод login своего сервиса AccountService. В этом методе и находится основная логика, осуществляющая проверку данных полученных из

формы авторизации, отправку запроса и анализ результата работы метода.

public function login()

{

/**

* @var AdditionalEmployeesManager $additionalEmployeesManager

**/

$convertedData = $this->_fieldTypes->getConvertedFields($this->getAction(), $this->getData());

$this->validate($convertedData);

if(!$this->checkValidateStatus()) {

$this->setError($this->getValidateError());

} else {

$additionalEmployeesManager = ModelManagerFactory::getByName('additionalEmployees');

$employee = $additionalEmployeesManager->getEmployeesByLoginAndPassword(

$convertedData['login'],

$this->getSecurity()->getPasswordHash($convertedData['password'])

);

if(!empty($employee)) {

$response = $this->processedLoginResponse($employee);

} else {

$this->setError($this->getErrorMessage('auth_absent_account'));

}

}

return !empty($response) ? $response : array();

}

В данном методе данные пришедшие с клиентской части приводятся к нужному типу, что позволяет предотвратить внедрение постороннего кода и иных причин способных привести к некорректной работе.

$convertedData = $this->_fieldTypes->getConvertedFields($this->getAction(), $this->getData());

После этого осуществляется проверка логина и пароля на соответствие правилам для этих данных.

$this->validate($convertedData);

Если будет определено, что данные не прошли проверку, сообщение об этом будет отображено пользователю на странице авторизации. В ином случае, будет создан объект менеджера модели данных. После чего осуществляется попытка получения пользователя по логину и паролю, прошедшего шифрование алгоритмом sha512 используя соль, путем вызова метода getEmployeesByLoginAndPassword менеджера модели данных AdditionalEmployeesManager.

$additionalEmployeesManager = ModelManagerFactory::getByName('additionalEmployees');

$employee = $additionalEmployeesManager->getEmployeesByLoginAndPassword(

$convertedData['login'],

$this->getSecurity()->getPasswordHash($convertedData['password'])

);

В данном методе осуществляется построение запроса. Для этого используется класс Orm.

public function getEmployeesByLoginAndPassword($login, $password)

{

$data = $this->orm_model->select()->where(' login = ? AND password = ? ', $login, $password)->fetchOne();

return (count($data)) ? $this->initOne($data) : array();

}

Если по полученному логину и паролю будет найден пользователь, в таком случае считается что авторизация выполнена успешно.

Ответ на корректно обработанный запрос передается в метод login сервиса AccountService, где происходит завершающая стадия авторизации. Из ответа определяются общая информация о пользователе, которая была установлена ему в момент регистрации в базе данных. Эти данные сохраняются в сессии и могут быть использованы в дальнейшем для отображения их на сайте, а также для управления доступного ему функционала.