- •Введение
- •Анализ предметной области
- •Структура комитета государственной безопасности Республики Беларусь
- •Обзор существующих аналогов
- •Аналитический обзор
- •Язык программирования php
- •Архитектура клиент-сервер
- •Rest-сервис
- •Системное проектирование
- •Функциональное проектирование
- •Классы, реализующие непосредственно логику работы веб-приложения
- •Класс AccountController
- •Класс ConvictionsController
- •Класс DefendantsController
- •Класс ExcelController
- •Класс IndexController
- •Класс NoticesController
- •Класс PlacesWorkController
- •Класс PreventivesController
- •Класс PrivateCasesController
- •Класс UrlController
- •Класс UsersController
- •Класс RelativesController
- •Класс ChangePinaltiesController
- •Класс ViolationsController
- •Класс AmnistiesController
- •Класс PartnersController
- •Класс PaymentsController
- •Класс TreatmentsController
- •Структура таблиц базы данных
- •Классы работы с базой данных и доступа к данным
- •Класс ModelManager
- •Класс DynamicModel
- •Разработка программных модулей
- •Авторизация
- •Заведение дела
- •Программа и методика испытаний
- •Определение вида тестирования
- •Объект тестирования
- •Выход из системы
- •Добавить сотрудника
- •Просмотреть список сотрудников
- •Редактировать сотрудника
- •Изменить пароль сотрудника
- •Удалить сотрудника
- •Добавить правонарушителя
- •Просмотреть список правонарушителей
- •Просмотреть правонарушителя
- •Редактировать правонарушителя
- •Удалить правонарушителя
- •Добавить место работы правонарушителя
- •Просмотреть место работы правонарушителя
- •Редактировать место работы правонарушителя
- •Удалить место работы правонарушителя
- •Добавить родственника
- •Просмотреть список родственников
- •Просмотреть родственника
- •Редактировать родственника
- •Удалить родственника
- •Добавить дело
- •Просмотреть список дел
- •Просмотреть дело
- •Редактировать дело
- •Удалить дело
- •Добавить осуждение
- •Просмотреть список осуждений
- •Просмотреть осуждение
- •Редактировать осуждение
- •Удалить осуждение
- •Добавить нарушение
- •Просмотреть список нарушений
- •Просмотреть нарушение
- •Редактировать нарушение
- •Удалить нарушение
- •Добавить отчет профучета
- •Просмотреть список отчетов профучета
- •Просмотреть отчет профучета
- •Редактировать отчет профучета
- •Удалить отчет профучета
- •Руководство пользователя
- •Назначение веб-приложения для автоматизации учета правонарушений
- •Условия выполнения
- •Функциональные возможности
- •Авторизация сотрудников
- •Ведение базы сотрудников
- •Ведение базы правонарушений
- •Ведение базы личных дел правонарушителей
- •Технико-экономическое обоснование проекта веб-приложения для автоматизации учета правонарушений
- •Характеристика программного продукта
- •Расчет затрат и отпускной цены веб-приложения для автоматизации учета правонарушений
- •Основная заработная плата исполнителей проекта определяется по формуле (7.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, где происходит завершающая стадия авторизации. Из ответа определяются общая информация о пользователе, которая была установлена ему в момент регистрации в базе данных. Эти данные сохраняются в сессии и могут быть использованы в дальнейшем для отображения их на сайте, а также для управления доступного ему функционала.
