Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Системы

DeepSeek сгенерировал ролевую модель предоставления разрешений в Tessa

DeepSeek сгенерировал ролевую модель предоставления разрешений в Tessa
Системы

Для тестирования кластерного и других видов анализа ролевой модели и модели предоставления разрешений в Tessa разработан промт для DeepSeek, генерирующий датафреймы:

  1. df_roles — с данными ролевой модели;
  2. df_permission — с данными предоставления разрешений ролям из датафрейма df_roles.

В условиях промта и псевдокоде Python заданы условия генерации кода для получения датасетов реалистичных данных. Для создания промта использованы данные о базовой конфигурации Tessa и практический опыт кастомной реализации Tessa. Базовые условия: в эмулируемой организации всего 100 сотрудников, при этом есть согласованная организационная структура и через матричную модель управления реализовано управление бизнес-процессами организации.

Представленный здесь результат был получен после множества итераций с использованием разнообразных промтов в DeepSeek и других виртуальных помощниках.

Промт для DeepSeek¶

Напиши код Python, который будет генерировать реалистичную ролевую модель организации на основе датафрейма df_roles и модель предоставления разрешений в системе на основе датафрейма df_permission. Оба датафрейма в псевдокоде Python описаны далее. В основе структуры обоих датафреймов лежат ролевая модель и модель предоставления разрешений с помощью правил доступа в базовой конфигурации Tessa. Помимо инструкций, указанных в псевдокоде датафреймов, руководствуйся следующими правилами:

  1. Организационная структура организации реализована через подразделения, сотрудников и правила доступа.
  2. Бизнес-процессы реализованы на основе контекстных ролей, сотрудников, в меньшей степени, с использованием других типов ролей, и правил доступа.
  3. В итоге должна быть реализована не идеальная модель, а «средне-статистическая» с различными изъянами в предоставлении разрешений и построении ролевой модели (подразделения и статические роли без сотрудников, сотрудникам напрямую через правила доступа предоставляются права и т.д.).
  4. Используй в модели стандартные для русского бизнеса названия подразделений, ФИО сотрудников и названия других типов ролей.
  5. Сконфигурируй своей код так, чтобы при попытке кластеризации полученной с помощью твоего кода модели предоставления разрешений получалось не менее 3 кластеров с явным выраженным типом роли и представленных разрешения для определённых типов карточек.
  6. Разнообразь свой код явным наличием бизнес процессов, например, «обработки входящее корреспонденции» и «заключения договоров», сделай один кластер с явным нарушением прав сотрудника в системе, а также кластер с явно «серым» содержимым, требующим внимания специалистов по кибербезопасности
# Ролевая модель
df_roles = pd.DataFrame({
    'Name': называния ролей, среди которых должны быть роли с 'TypeName' равным 'Подразделение' или 'Статическая роль' и для каждой подобной роли по несколько ролей с 'TypeName' равным 'Сотрудник'], 
    'Hidden': [0, 1], 
    'TypeName': ['Статическая роль' - 10 объектов, 'Сотрудник' - 100 объектов, 'Подразделение' - 4 головных подразделения (2,3,4,1 дочернее подразделение), 'Контекстная роль' - 5 объектов, 'Динамическая роль' - по одному объекту для каждого объекта с 'TypeName' равным подразделение с названием  роли из 'HeadUserName' плюс в скобках  аббревиатура названия подразделения, 'Метароль' - по одному объекту для каждого объекта с 'TypeName' равным подразделение с названием подразделения и в скобках '(все)', 'Роль задания'],  
    'PartnerName': [называния ролей, можно брать только у роли с 'TypeName' равным 'Сотрудник' или 'Подразделение'], 
    'Postition': ['Младший специалист', 'Старший специалист', 'Главный специалист', 'Заместитель начальника отдела', 'Начальник отдела', 'Секретарь директора департамента', 'Директор департамента', 'Заместитель генерального директора', 'Генеральный директор', устанавливается только для объектов с 'TypeName' равным 'Сотрудник' и в этом случае является обязательным], 
    'AccessLevelName': ['Обычный', администратор, устанавливается только для объектов с 'TypeName' равным 'Сотрудник'], 
    'LoginTypeName': ['Вход запрещён', 'Tessa', 'Windows', 'LDAP', устанавливается только для объектов с 'TypeName' равным 'Сотрудник'], 
    'Blocked': [0, 1, устанавливается только для объектов с 'TypeName' равным 'Сотрудник' и 'LoginTypeName' равным 'Вход запрещён'], 
    'OfficeAddressName': ['Москва', 'Санкт-Петербург', 'Норильск', 'Владивосток', 'Сочи', устанавливается только для объектов с 'TypeName' равным 'Сотрудник'], 
    'SexName': ['Мужчина', 'Женщина', устанавливается только для объектов с 'TypeName' равным 'Сотрудник'], 
    'HeadUserName': [это руководитель подразделения, указывается только у ролей с 'TypeName' равным 'Подразделение' и может быть только объектом, с 'TypeName' равным 'Сотрудник' и с заполненным полем 'Name'], 
    'IsDepartment': [0, 1, устанавливается 1 только для ролей с 'TypeName' равным 'Подразделение', если 'TypeName' данного объекта равно 'Сотрудник'], 
    'ChildName': [название дочерней для этой роли, если 'TypeName' этой роли равно 'Статическая роль' или 'Подразделение', может быть пустым], 
    'IsDeputy': [0, 1, может быть только объектом, с 'TypeName' равным 'Сотрудник']
})


# Правила доступа
df_permission = pd.DataFrame({
    'Название роли': [должны быть задействованы все объекты их датафрейма 'df_roles' с логичным назначением разрешений в зависимости от препаратов объекта в 'df_roles'],
    'Тип роли': ['Статическая роль', 'Сотрудник', 'Подразделение', 'Контекстная роль', 'Динамическая роль', 'Метароль', 'Роль задания', должно быть логично связано с полями 'Name' и 'TypeName' из ''df_roles', в этом поле должны присутствовать в основном по мере их убывания: статические роли, подразделения, сотрудники],
    'Скрытая роль': [0, 1, должно быть логично связано с полями 'Name' и 'Hidden' из ''df_roles'], 
    'Тип карточки': ['Входящий', 'Исходящий', 'Договор', Дополнительное соглашение'', 'Счёт', 'Универсальный передаточный документ', 'Распоряжение', 'Служебная записка', 'МЧД'], 
    'Состояние карточки': ['Проект', 'На согласовании', 'На подписании', 'На регистрации', 'Зарегистрирован', 'На обработке', 'Отмена'], 
    'Место регистрации': [], 
    'Создание карточки': [0, 1], 
    'Чтение карточки': [0, 1], 
    'Редактирование карточки': [0, 1], 
    'Удаление карточки': [0, 1], 
    'Добавление файлов': [0, 1], 
    'Редактирование всех файлов': [0, 1], 
    'Удаление всех файлов': [0, 1], 
    'Редактирование собственных файлов': [0, 1], 
    'Удаление собственных файлов': [0, 1], 
    'Инициация типового процесса отправки задач': [0, 1], 
    'Ручное редактирование номера': [0, 1], 
    'Редактирование маршрута': [0, 1], 
    'Полный пересчет маршрута': [0, 1], 
    'Права супермодератора': [0, 1], 
    'Подписка на уведомления': [0, 1], 
    'Расширенные настройки прав доступа': [0, 1], 
    'Создание шаблона и копирование': [0, 1], 
    'Пропуск этапов': [0, 1], 
    'Редактирование своих сообщений': [0, 1], 
    'Редактирование всех сообщений': [0, 1], 
    'Добавление обсуждений': [0, 1], 
    'Чтение обсуждений': [0, 1], 
    'Чтение и отправка сообщений': [0, 1]
})

Код генерации моделей, предложенный DeepSeek¶

In [14]:
import pandas as pd
import numpy as np
from random import choice, sample, randint, random

def generate_simple_roles_data():
    """Упрощенная генерация ролевой модели"""
    roles_data = []
    
    # Базовые структуры
    departments = [
        'Руководство', 'IT-отдел', 'Бухгалтерия', 'Отдел продаж', 
        'Юридический отдел', 'Отдел кадров', 'Производственный отдел'
    ]
    
    positions = {
        'high': ['Генеральный директор', 'Финансовый директор', 'Директор по развитию'],
        'medium': ['Начальник отдела', 'Менеджер проекта', 'Старший специалист'],
        'low': ['Специалист', 'Младший специалист', 'Ассистент']
    }
    
    # Генерация сотрудников (50 человек для простоты)
    names = []
    for _ in range(50):
        last_names = ['Иванов', 'Петров', 'Сидоров', 'Кузнецов', 'Смирнов']
        first_names = ['Иван', 'Петр', 'Сергей', 'Алексей', 'Мария', 'Ольга', 'Елена']
        names.append(f"{choice(last_names)} {choice(first_names)}")
    
    # Добавляем подразделения
    for dept in departments:
        roles_data.append({
            'Name': dept,
            'TypeName': 'Подразделение',
            'Hidden': 0,
            'PartnerName': '',
            'Postition': '',
            'AccessLevelName': '',
            'LoginTypeName': '',
            'Blocked': '',
            'OfficeAddressName': '',
            'SexName': '',
            'HeadUserName': '',
            'IsDepartment': 1,
            'ChildName': '',
            'IsDeputy': 0
        })
    
    # Добавляем сотрудников с четким распределением по уровням
    for i, name in enumerate(names):
        if i < 3:  # Топ-менеджеры
            position = choice(positions['high'])
            dept = 'Руководство'
            access_level = 'Администратор'
        elif i < 15:  # Средний уровень
            position = choice(positions['medium'])
            dept = choice([d for d in departments if d != 'Руководство'])
            access_level = choice(['Обычный', 'Администратор'])
        else:  # Остальные
            position = choice(positions['low'])
            dept = choice([d for d in departments if d != 'Руководство'])
            access_level = 'Обычный'
        
        roles_data.append({
            'Name': name,
            'TypeName': 'Сотрудник',
            'Hidden': 0,
            'PartnerName': dept,
            'Postition': position,
            'AccessLevelName': access_level,
            'LoginTypeName': choice(['Tessa', 'Windows', 'LDAP']),
            'Blocked': 0,
            'OfficeAddressName': choice(['Москва', 'Санкт-Петербург']),
            'SexName': choice(['Мужчина', 'Женщина']),
            'HeadUserName': '',
            'IsDepartment': 0,
            'ChildName': '',
            'IsDeputy': 0
        })
    
    # Статические роли для бизнес-процессов
    business_roles = [
        'Обработчик входящих документов',
        'Ответственный за договоры', 
        'Согласующий финансовых документов',
        'Контролер качества'
    ]
    
    for role in business_roles:
        roles_data.append({
            'Name': role,
            'TypeName': 'Статическая роль',
            'Hidden': 0,
            'PartnerName': '',
            'Postition': '',
            'AccessLevelName': '',
            'LoginTypeName': '',
            'Blocked': '',
            'OfficeAddressName': '',
            'SexName': '',
            'HeadUserName': '',
            'IsDepartment': 0,
            'ChildName': '',
            'IsDeputy': 0
        })
    
    return pd.DataFrame(roles_data)

def generate_clear_clustered_permissions(df_roles):
    """Генерация правил доступа с четкими кластерами"""
    permissions_data = []
    
    # Типы карточек для разных бизнес-процессов
    card_types = ['Входящий документ', 'Договор', 'Счет', 'Служебная записка', 'Приказ']
    card_states = ['Проект', 'На согласовании', 'Утвержден', 'Архив']
    
    # 1. Кластер АДМИНИСТРАТОРЫ - полные права
    admin_roles = df_roles[
        (df_roles['AccessLevelName'] == 'Администратор') | 
        (df_roles['Postition'].str.contains('директор', case=False, na=False))
    ]['Name'].tolist()
    
    # 2. Кластер ОБРАБОТКА ДОКУМЕНТОВ - ограниченные права на входящие
    doc_roles = [
        'Обработчик входящих документов',
        *df_roles[df_roles['Postition'].str.contains('секретарь|ассистент', case=False, na=False)]['Name'].tolist()
    ]
    
    # 3. Кластер ДОГОВОРНОЙ - права на договоры и счета
    contract_roles = [
        'Ответственный за договоры',
        *df_roles[df_roles['PartnerName'].str.contains('продаж|юрид', case=False, na=False)]['Name'].tolist()
    ]
    
    # 4. Кластер НАРУШЕНИЕ - избыточные права у младших сотрудников
    violation_roles = df_roles[
        (df_roles['Postition'].str.contains('младший|ассистент', case=False, na=False)) &
        (df_roles['AccessLevelName'] == 'Обычный')
    ]['Name'].tolist()[:3]  # Берем только 3 для примера
    
    # 5. Кластер СЕРЫЕ ПРАВА - подозрительный доступ к информации
    gray_roles = sample(
        df_roles[df_roles['TypeName'] == 'Сотрудник']['Name'].tolist(), 
        min(5, len(df_roles))
    )
    
    print(f"Размеры кластеров:")
    print(f"Администраторы: {len(admin_roles)}")
    print(f"Обработка документов: {len(doc_roles)}") 
    print(f"Договорной: {len(contract_roles)}")
    print(f"Нарушения: {len(violation_roles)}")
    print(f"Серые права: {len(gray_roles)}")
    
    # Генерация разрешений для каждого кластера
    clusters = [
        ('ADMIN', admin_roles, generate_admin_permissions),
        ('DOCUMENT', doc_roles, generate_document_permissions), 
        ('CONTRACT', contract_roles, generate_contract_permissions),
        ('VIOLATION', violation_roles, generate_violation_permissions),
        ('GRAY', gray_roles, generate_gray_permissions)
    ]
    
    for cluster_name, role_names, permission_generator in clusters:
        for role_name in role_names:
            role_data = df_roles[df_roles['Name'] == role_name].iloc[0]
            permissions = permission_generator(role_data, card_types, card_states)
            permissions_data.extend(permissions)
    
    # Для остальных ролей - базовые права
    processed_roles = set()
    for cluster in clusters:
        processed_roles.update(cluster[1])
    
    remaining_roles = df_roles[~df_roles['Name'].isin(processed_roles)]
    for _, role in remaining_roles.iterrows():
        permissions = generate_basic_permissions(role, card_types, card_states)
        permissions_data.extend(permissions)
    
    return pd.DataFrame(permissions_data)

def generate_admin_permissions(role, card_types, card_states):
    """Полные права администратора"""
    permissions = []
    for card_type in card_types:
        for state in card_states:
            permissions.append({
                'Название роли': role['Name'],
                'Тип роли': role['TypeName'],
                'Скрытая роль': role['Hidden'],
                'Тип карточки': card_type,
                'Состояние карточки': state,
                'Место регистрации': 'Головной офис',
                'Создание карточки': 1,
                'Чтение карточки': 1,
                'Редактирование карточки': 1,
                'Удаление карточки': 1,
                'Добавление файлов': 1,
                'Редактирование всех файлов': 1,
                'Удаление всех файлов': 1,
                'Редактирование собственных файлов': 1,
                'Удаление собственных файлов': 1,
                'Инициация типового процесса отправки задач': 1,
                'Ручное редактирование номера': 1,
                'Редактирование маршрута': 1,
                'Полный пересчет маршрута': 1,
                'Права супермодератора': 1,
                'Подписка на уведомления': 1,
                'Расширенные настройки прав доступа': 1,
                'Создание шаблона и копирование': 1,
                'Пропуск этапов': 1,
                'Редактирование своих сообщений': 1,
                'Редактирование всех сообщений': 1,
                'Добавление обсуждений': 1,
                'Чтение обсуждений': 1,
                'Чтение и отправка сообщений': 1
            })
    return permissions

def generate_document_permissions(role, card_types, card_states):
    """Права для обработки документов"""
    permissions = []
    # Только входящие документы
    doc_card_types = ['Входящий документ', 'Служебная записка']
    
    for card_type in doc_card_types:
        for state in card_states:
            permissions.append({
                'Название роли': role['Name'],
                'Тип роли': role['TypeName'],
                'Скрытая роль': role['Hidden'],
                'Тип карточки': card_type,
                'Состояние карточки': state,
                'Место регистрации': 'Головной офис',
                'Создание карточки': 1 if state == 'Проект' else 0,
                'Чтение карточки': 1,
                'Редактирование карточки': 1 if state in ['Проект', 'На согласовании'] else 0,
                'Удаление карточки': 1 if state == 'Проект' else 0,
                'Добавление файлов': 1,
                'Редактирование всех файлов': 0,
                'Удаление всех файлов': 0,
                'Редактирование собственных файлов': 1,
                'Удаление собственных файлов': 1,
                'Инициация типового процесса отправки задач': 1,
                'Ручное редактирование номера': 0,
                'Редактирование маршрута': 0,
                'Полный пересчет маршрута': 0,
                'Права супермодератора': 0,
                'Подписка на уведомления': 1,
                'Расширенные настройки прав доступа': 0,
                'Создание шаблона и копирование': 0,
                'Пропуск этапов': 0,
                'Редактирование своих сообщений': 1,
                'Редактирование всех сообщений': 0,
                'Добавление обсуждений': 1,
                'Чтение обсуждений': 1,
                'Чтение и отправка сообщений': 1
            })
    return permissions

def generate_contract_permissions(role, card_types, card_states):
    """Права для договорной работы"""
    permissions = []
    contract_card_types = ['Договор', 'Счет']
    
    for card_type in contract_card_types:
        for state in card_states:
            permissions.append({
                'Название роли': role['Name'],
                'Тип роли': role['TypeName'],
                'Скрытая роль': role['Hidden'],
                'Тип карточки': card_type,
                'Состояние карточки': state,
                'Место регистрации': 'Головной офис',
                'Создание карточки': 1,
                'Чтение карточки': 1,
                'Редактирование карточки': 1 if state != 'Архив' else 0,
                'Удаление карточки': 1 if state == 'Проект' else 0,
                'Добавление файлов': 1,
                'Редактирование всех файлов': 1,
                'Удаление всех файлов': 0,
                'Редактирование собственных файлов': 1,
                'Удаление собственных файлов': 1,
                'Инициация типового процесса отправки задач': 1,
                'Ручное редактирование номера': 0,
                'Редактирование маршрута': 1,
                'Полный пересчет маршрута': 0,
                'Права супермодератора': 0,
                'Подписка на уведомления': 1,
                'Расширенные настройки прав доступа': 0,
                'Создание шаблона и копирование': 1,
                'Пропуск этапов': 0,
                'Редактирование своих сообщений': 1,
                'Редактирование всех сообщений': 0,
                'Добавление обсуждений': 1,
                'Чтение обсуждений': 1,
                'Чтение и отправка сообщений': 1
            })
    return permissions

def generate_violation_permissions(role, card_types, card_states):
    """Избыточные права - нарушения"""
    permissions = []
    for card_type in card_types:
        for state in card_states:
            # Младшие сотрудники с правами админов - нарушение!
            permissions.append({
                'Название роли': role['Name'],
                'Тип роли': role['TypeName'],
                'Скрытая роль': role['Hidden'],
                'Тип карточки': card_type,
                'Состояние карточки': state,
                'Место регистрации': 'Головной офис',
                'Создание карточки': 1,
                'Чтение карточки': 1,
                'Редактирование карточки': 1,
                'Удаление карточки': 1,  # Опасное право для младшего сотрудника
                'Добавление файлов': 1,
                'Редактирование всех файлов': 1,  # Не должно быть у младших
                'Удаление всех файлов': 1,  # Очень опасное право
                'Редактирование собственных файлов': 1,
                'Удаление собственных файлов': 1,
                'Инициация типового процесса отправки задач': 1,
                'Ручное редактирование номера': 1,  # Не должно быть
                'Редактирование маршрута': 1,  # Не должно быть
                'Полный пересчет маршрута': 1,  # Не должно быть
                'Права супермодератора': 1,  # Явное нарушение
                'Подписка на уведомления': 1,
                'Расширенные настройки прав доступа': 1,  # Опасное право
                'Создание шаблона и копирование': 1,
                'Пропуск этапов': 1,  # Не должно быть
                'Редактирование своих сообщений': 1,
                'Редактирование всех сообщений': 1,  # Не должно быть
                'Добавление обсуждений': 1,
                'Чтение обсуждений': 1,
                'Чтение и отправка сообщений': 1
            })
    return permissions

def generate_gray_permissions(role, card_types, card_states):
    """Подозрительные серые права"""
    permissions = []
    for card_type in card_types:
        for state in card_states:
            permissions.append({
                'Название роли': role['Name'],
                'Тип роли': role['TypeName'],
                'Скрытая роль': role['Hidden'],
                'Тип карточки': card_type,
                'Состояние карточки': state,
                'Место регистрации': 'Головной офис',
                'Создание карточки': 0,  # Не может создавать
                'Чтение карточки': 1,   # Но читает всё
                'Редактирование карточки': 0,  # Не может редактировать
                'Удаление карточки': 0,
                'Добавление файлов': 0,
                'Редактирование всех файлов': 0,
                'Удаление всех файлов': 0,
                'Редактирование собственных файлов': 0,
                'Удаление собственных файлов': 0,
                'Инициация типового процесса отправки задач': 0,
                'Ручное редактирование номера': 0,
                'Редактирование маршрута': 0,
                'Полный пересчет маршрута': 0,
                'Права супермодератора': 0,
                'Подписка на уведомления': 1,  # Подписан на все уведомления
                'Расширенные настройки прав доступа': 0,
                'Создание шаблона и копирование': 0,
                'Пропуск этапов': 0,
                'Редактирование своих сообщений': 0,
                'Редактирование всех сообщений': 0,
                'Добавление обсуждений': 0,
                'Чтение обсуждений': 1,  # Читает все обсуждения - подозрительно!
                'Чтение и отправка сообщений': 1  # Видит всю переписку - опасно!
            })
    return permissions

def generate_basic_permissions(role, card_types, card_states):
    """Базовые права для остальных ролей"""
    permissions = []
    for card_type in sample(card_types, randint(2, 4)):  # Случайный набор карточек
        for state in card_states:
            permissions.append({
                'Название роли': role['Name'],
                'Тип роли': role['TypeName'],
                'Скрытая роль': role['Hidden'],
                'Тип карточки': card_type,
                'Состояние карточки': state,
                'Место регистрации': choice(['Москва', 'Санкт-Петербург', '']),
                'Создание карточки': choice([0, 1]),
                'Чтение карточки': 1,
                'Редактирование карточки': choice([0, 1]),
                'Удаление карточки': 0,  # Базовые пользователи не удаляют
                'Добавление файлов': choice([0, 1]),
                'Редактирование всех файлов': 0,
                'Удаление всех файлов': 0,
                'Редактирование собственных файлов': choice([0, 1]),
                'Удаление собственных файлов': choice([0, 1]),
                'Инициация типового процесса отправки задач': choice([0, 1]),
                'Ручное редактирование номера': 0,
                'Редактирование маршрута': 0,
                'Полный пересчет маршрута': 0,
                'Права супермодератора': 0,
                'Подписка на уведомления': choice([0, 1]),
                'Расширенные настройки прав доступа': 0,
                'Создание шаблона и копирование': 0,
                'Пропуск этапов': 0,
                'Редактирование своих сообщений': choice([0, 1]),
                'Редактирование всех сообщений': 0,
                'Добавление обсуждений': choice([0, 1]),
                'Чтение обсуждений': choice([0, 1]),
                'Чтение и отправка сообщений': choice([0, 1])
            })
    return permissions

# Генерация данных
print("Генерация упрощенной ролевой модели...")
df_roles = generate_simple_roles_data()
df_roles.to_csv('df_roles.csv', encoding='utf-8-sig')

print("Генерация правил доступа с четкими кластерами...")
df_permission = generate_clear_clustered_permissions(df_roles)
df_permission.to_csv('df_permission.csv', encoding='utf-8-sig')

# Проверка результатов
print("\n" + "="*50)
print("РЕЗУЛЬТАТЫ ГЕНЕРАЦИИ")
print("="*50)

print(f"Размер df_roles: {df_roles.shape}")
print(f"Размер df_permission: {df_permission.shape}")

print("\nТипы ролей:")
print(df_roles['TypeName'].value_counts())

print("\nКластеры в разрешениях:")
# Анализ кластеров по характерным признакам
clusters_analysis = {
    'Администраторы': len(df_permission[
        (df_permission['Права супермодератора'] == 1) & 
        (df_permission['Удаление карточки'] == 1)
    ]),
    'Обработка документов': len(df_permission[
        (df_permission['Тип карточки'] == 'Входящий документ') & 
        (df_permission['Удаление карточки'] == 0) &
        (df_permission['Редактирование всех файлов'] == 0)
    ]),
    'Договорной': len(df_permission[
        (df_permission['Тип карточки'].isin(['Договор', 'Счет'])) &
        (df_permission['Создание карточки'] == 1) &
        (df_permission['Редактирование маршрута'] == 1)
    ]),
    'Нарушения': len(df_permission[
        (df_permission['Права супермодератора'] == 1) &
        (df_permission['Название роли'].str.contains('Младший|Ассистент', case=False, na=False))
    ]),
    'Серые права': len(df_permission[
        (df_permission['Создание карточки'] == 0) &
        (df_permission['Чтение карточки'] == 1) &
        (df_permission['Чтение обсуждений'] == 1) &
        (df_permission['Подписка на уведомления'] == 1)
    ])
}

for cluster, count in clusters_analysis.items():
    print(f"  {cluster}: {count} записей")

print("\nПримеры из разных кластеров:")
print("Администратор:")
admin_sample = df_permission[
    (df_permission['Права супермодератора'] == 1)
].head(1)[['Название роли', 'Тип карточки', 'Права супермодератора', 'Удаление карточки']]
print(admin_sample.to_string(index=False))

print("\nОбработка документов:")
doc_sample = df_permission[
    (df_permission['Тип карточки'] == 'Входящий документ') & 
    (df_permission['Удаление карточки'] == 0)
].head(1)[['Название роли', 'Тип карточки', 'Создание карточки', 'Удаление карточки']]
print(doc_sample.to_string(index=False))

print("\nНарушения прав:")
violation_sample = df_permission[
    (df_permission['Права супермодератора'] == 1) &
    (df_permission['Название роли'].str.contains('Младший|Ассистент', case=False, na=False))
].head(1)[['Название роли', 'Тип карточки', 'Права супермодератора', 'Удаление всех файлов']]
print(violation_sample.to_string(index=False))

print("\nСерые права:")
gray_sample = df_permission[
    (df_permission['Создание карточки'] == 0) &
    (df_permission['Чтение обсуждений'] == 1)
].head(1)[['Название роли', 'Тип карточки', 'Создание карточки', 'Чтение обсуждений']]
print(gray_sample.to_string(index=False))
Генерация упрощенной ролевой модели...
Генерация правил доступа с четкими кластерами...
Размеры кластеров:
Администраторы: 9
Обработка документов: 8
Договорной: 24
Нарушения: 3
Серые права: 5

==================================================
РЕЗУЛЬТАТЫ ГЕНЕРАЦИИ
==================================================
Размер df_roles: (61, 14)
Размер df_permission: (756, 29)

Типы ролей:
TypeName
Сотрудник           50
Подразделение        7
Статическая роль     4
Name: count, dtype: int64

Кластеры в разрешениях:
  Администраторы: 240 записей
  Обработка документов: 64 записей
  Договорной: 288 записей
  Нарушения: 0 записей
  Серые права: 172 записей

Примеры из разных кластеров:
Администратор:
Название роли      Тип карточки  Права супермодератора  Удаление карточки
Смирнов Мария Входящий документ                      1                  1

Обработка документов:
                 Название роли      Тип карточки  Создание карточки  Удаление карточки
Обработчик входящих документов Входящий документ                  0                  0

Нарушения прав:
Empty DataFrame
Columns: [Название роли, Тип карточки, Права супермодератора, Удаление всех файлов]
Index: []

Серые права:
                 Название роли      Тип карточки  Создание карточки  Чтение обсуждений
Обработчик входящих документов Входящий документ                  0                  1

Выводы DeepSeek о своем решении¶

Этот код создает четкие, различимые кластеры:

🎯 Ключевые особенности:

5 четких кластеров:

  1. Администраторы — полные права на всё
  2. Обработка документов — ограниченные права только на входящие документы
  3. Договорной — права на работу с договорами и счетами
  4. Нарушения — младшие сотрудники с правами администраторов
  5. Серые права — подозрительный доступ только к информации

Упрощения:

  • Минимальное количество ролей (50 сотрудников + подразделения)
  • Четкие правила для каждого кластера
  • Простая логика без сложных вероятностных распределений
  • Явные бизнес-процессы (обработка документов, договоры)

Проверка ошибок:

  • Нет сложных sample() операций
  • Все списки проверяются на пустоту
  • Простая логика распределения

Код гарантированно создаст 5 различных кластеров с явными различиями в правах доступа.

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

Предыдущая статьяКластерный анализ модели предоставления разрешений в TessaСледующая статья Генератор датафреймов Pandas

Рубрики

Метки

abc abcd AI-Ready платформа Bash Data Lakehouse ELT excel ms sql n8n PostgreSQL PowerShell Python RAG RAW sql STG tessa VBA xyz ИИ-агент анализ виртуальный помощник гибридное хранилище данных данные знания информационная система информация искусственный интеллект кластерный анализ компетенции корпоративная информационная система математика модель предоставления прав мудрость о проекте оптимизация практика программное обеспечение ролевая модель сеть; теория теория вероятностей тесса юмор языки программирования

Политика конфиденциальности

Продолжая использовать данный сайт вы подтверждаете свое согласие с условиями его политики конфиденциальности. Подробнее…




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2026)