Аутентификация и авторизация пользователей в ERP-системе

Автор: Иван Петрович • 15 ноября 2023

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

Основные компоненты системы

Аутентификация

Процесс проверки подлинности пользователя с использованием учетных данных (логин/пароль)

Авторизация

Определение прав доступа пользователей к различным функциям системы

Управление ролями

Система ролей и разрешений для контроля доступа к функциям ERP

Создание таблиц базы данных

SQL-скрипт создания таблиц

-- Создание таблицы пользователей
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    is_active BOOLEAN DEFAULT TRUE
);

-- Создание таблицы ролей
CREATE TABLE roles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) UNIQUE NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Создание таблицы связей пользователей и ролей
CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);

-- Создание таблицы разрешений
CREATE TABLE permissions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) UNIQUE NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Создание таблицы связей ролей и разрешений
CREATE TABLE role_permissions (
    role_id INT,
    permission_id INT,
    PRIMARY KEY (role_id, permission_id),
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
                

Реализация моделей Kohana

Модель пользователя

class Model_User extends Model_Auth {
    public function create_user($username, $password, $email) {
        return DB::insert('users', array(
            'username' => $username,
            'password' => Hash::make($password),
            'email' => $email
        ))->execute();
    }
    
    public function get_user_by_username($username) {
        return DB::select('*')
            ->from('users')
            ->where('username', '=', $username)
            ->execute()
            ->current();
    }
}

Модель роли

class Model_Role extends Model {
    public function get_role_by_name($name) {
        return DB::select('*')
            ->from('roles')
            ->where('name', '=', $name)
            ->execute()
            ->current();
    }
    
    public function assign_role_to_user($user_id, $role_id) {
        return DB::insert('user_roles', array(
            'user_id' => $user_id,
            'role_id' => $role_id
        ))->execute();
    }
}

Контроллеры для управления пользователями

Контроллер регистрации и входа

class Controller_Auth extends Controller {
    public function action_register() {
        if ($this->request->method() === Request::POST) {
            $username = $this->request->post('username');
            $password = $this->request->post('password');
            $email = $this->request->post('email');
            
            // Создание пользователя
            $user = Model::factory('User')->create_user($username, $password, $email);
            
            // Перенаправление на страницу входа
            $this->response->redirect('/auth/login');
        }
        
        $this->response->body(View::factory('auth/register'));
    }
    
    public function action_login() {
        if ($this->request->method() === Request::POST) {
            $username = $this->request->post('username');
            $password = $this->request->post('password');
            
            // Проверка аутентификации
            if (Auth::instance()->login($username, $password)) {
                $this->response->redirect('/dashboard');
            }
        }
        
        $this->response->body(View::factory('auth/login'));
    }
    
    public function action_logout() {
        Auth::instance()->logout();
        $this->response->redirect('/auth/login');
    }
}

Система ролей и разрешений

Пример ролей системы

  • Администратор: Полный доступ ко всем функциям
  • Менеджер: Доступ к отчетам и управлению пользователями
  • Сотрудник: Ограниченный доступ к основным функциям

Проверка разрешений

// Проверка прав доступа в контроллере
public function before() {
    parent::before();
    
    // Проверка, имеет ли пользователь право на доступ к этой функции
    if (!Auth::instance()->logged_in('admin')) {
        throw new HTTP_Exception_403('Доступ запрещен');
    }
}

Представления для форм

Форма регистрации

Форма входа

Форма выхода

Вы вошли как: admin

Заключение

Реализация системы аутентификации и авторизации в ERP-системе является ключевым элементом обеспечения безопасности данных. Использование библиотеки Auth Kohana позволяет создать надежную и гибкую систему управления доступом, которая может быть легко расширена для удовлетворения специфических требований бизнеса. Правильная реализация ролей и разрешений обеспечивает защиту информации и поддерживает эффективное управление ресурсами предприятия.

Сравнение подходов к аутентификации

Метод Описание Преимущества Недостатки
Классическая аутентификация Использование логина/пароля для проверки подлинности Простота реализации, широкое распространение Низкий уровень безопасности при слабых паролях
Аутентификация через OAuth Использование сторонних провайдеров (Google, Facebook) Удобство для пользователей, высокий уровень безопасности Зависимость от сторонних сервисов
Двухфакторная аутентификация Добавление дополнительного уровня проверки Повышенная безопасность, защита от взлома Увеличение сложности для пользователей

Рекомендации по безопасности

Хранение паролей

Используйте хеширование паролей с солью и алгоритмы типа bcrypt или Argon2

Проверка прав доступа

Всегда проверяйте права доступа на серверной стороне, не полагайтесь только на клиентскую проверку

Сессии

Используйте безопасные сессии с регулярной переодической генерацией токенов

Мониторинг

Реализуйте систему мониторинга аутентификации для выявления подозрительной активности