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

Рубрики

Метки

abc abcd excel ms sql Python sql tessa VBA xyz Комбинаторика Математика Теория вероятностей анализ виртуальный помощник данные знания информационная система информация искусственный интеллект кластерный анализ компетенции корпоративная информационная система маркетинг мудрость о проекте оптимизация ошибка практика программное обеспечение пэст ролевая модель теория тесса юмор языки программирования

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

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




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


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