| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using Npgsql;
- namespace practiceApplicaiton;
- /// <summary>
- /// Роли приложения (совпадают с ролями PostgreSQL)
- /// </summary>
- public enum AppRole { Admin, Manager }
- /// <summary>
- /// Менеджер подключения к БД.
- /// Строка подключения формируется по роли — каждая роль имеет
- /// отдельного пользователя PostgreSQL с ограниченными правами.
- /// </summary>
- public static class Database
- {
- // Текущая роль сессии
- public static AppRole CurrentRole { get; private set; }
- public static string CurrentUserName { get; private set; } = "";
- private static string _connectionString = "";
- private static readonly Dictionary<AppRole, string> AppPasswords = new()
- {
- { AppRole.Admin, "admin" },
- { AppRole.Manager, "manager" },
- };
- /// <summary>
- /// Инициализирует подключение с проверкой логина/пароля через PostgreSQL.
- /// Возвращает true если успешно.
- /// </summary>
- public static async Task<bool> ConnectAsync(AppRole role, string password)
- {
- // Простая проверка пароля на уровне приложения (дополнительный слой)
- if (password != AppPasswords[role])
- return false;
- var cs = new NpgsqlConnectionStringBuilder
- {
- Host = "edu-pg.itiscaf.ru",
- Port = 5432,
- Database = "dbwork",
- Username = "zakharov_pi",
- Password = "z4HpEB87TGS",
- SslMode = SslMode.Prefer,
- };
- _connectionString = cs.ConnectionString;
- CurrentRole = role;
- // Проверяем реальное подключение
- try
- {
- await using var conn = new NpgsqlConnection(_connectionString);
- await conn.OpenAsync();
- return true;
- }
- catch
- {
- _connectionString = "";
- return false;
- }
- }
- public static NpgsqlConnection GetConnection()
- {
- if (string.IsNullOrEmpty(_connectionString))
- throw new InvalidOperationException("Нет подключения к БД");
- return new NpgsqlConnection(_connectionString);
- }
- public static bool IsConnected => !string.IsNullOrEmpty(_connectionString);
- public static bool IsAdmin => CurrentRole == AppRole.Admin;
- }
|