Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
 Аватар для Kyra90
232 / 153 / 85
Регистрация: 06.10.2020
Сообщений: 468

Хранить строку в приложении

14.01.2022, 12:58. Показов 11044. Ответов 209
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Помогите, пожалуйста с курсовой.
Значит задача: Создать приложение с пользовательским доступом (логин/пароль, пользователь может быть пользователем, может быть админом). Значит я делаю следующим образом: В программу уже вшит пользователь "Администратор", при первом запуске предлагается создать ему пароль. Как только пароль создан рядом с приложением создается папка "Users" (по ее наличию, собственно, и проверяется первый запуск), где в файлах в зашифрованном виде хранится информация о пользователе.

Препод говорит, что это не совсем правильное решение, и файла с данными "Администратор" в папке с пользователями быть не должно, так как (цитирую дословно) "Я скопирую пользователей в другое место, прибью папку Users, запущу программу и получу доступ к Администратору, снова введя пароль, потом верну пользователей назад"

Можно ли как то хранить строковую переменную внутри приложения? Или может еще где-то. Или может какой-то другой метод хранения данных о пользователях есть? Буду очень благодарна за советы. Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2022, 12:58
Ответы с готовыми решениями:

Как и в каком виде хранить файлы в приложении
Добрый вечер! Помогите, пожалуйста, со след. заданием.:( Требуется в имеющуюся формочку добавлять материал (то есть загружать файл с...

Как можно хранить файлы, загружаемые пользователем в приложении?
Есть приложение C# .NET 5.0, связанное с MS SQL. Пользователь должен загружать файлы (изображения) прямо в приложении и они должны...

Как правильно хранить и использовать константы в WPF приложении
Сабж в теме. Использую такой способ: имеется статический класс (вернее несколько, отдельно для числовых, строковых и прочих констант) в...

209
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
24.01.2022, 12:54
Студворк — интернет-сервис помощи студентам
Kyra90, в приложении готовая библа для шифр/расшифр. подключите к своему проекту.
Там только два доступных метода:
EncryptString
DecryptString

В проекте сделайте
C#
1
using CryptoAES;
Пользоваться так:
C#
1
2
3
4
5
6
7
8
9
            string text = "Catrine Demew:1:a3151796b504e735a4c3234386c4e436832616a72784a457874505569453d";
            //Console.WriteLine( text );
            string SharedSecret = "vvKJF8943KJK";
 
            string encrypt = CryptoManager.EncryptString( text, SharedSecret );
            Console.WriteLine( encrypt );
 
            string decrypt = CryptoManager.DecryptString( encrypt, SharedSecret );
            Console.WriteLine( decrypt );
Зашифрованный текст получаете в HEX-формате.
Вложения
Тип файла: rar CryptoAES.rar (4.2 Кб, 4 просмотров)
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
24.01.2022, 13:33
Чуть-чуть хотел бы дополнить.

Хеширование от криптографии отличается тем, что хеширование работает только в одну сторону.
Это нужно для уникализации. Хеширование и криптография тесно связаны. Для криптографии используются ключи, например слово "дятел".
Но "дятел" слишком легко раскриптовать. Поэтому слово "дятел" хешуруют, чтобы получить уникальный ключ и вот уже этот ключ используют для криптографии. "Респечатать" SHA256, который Вы указали выше, на данный момент — невозможно.
В некоторых случаях хеши используют без криптографии. Например пароли пользователей только хешируются — то есть даже сервер не знает о том, что пользователь ввёл "qwerty12345", он лишь получает набор кракозябр, которые сохраняет в б.д.
Каждый раз, когда пользова отправляет серверу "qwerty12345" — программа хеширует пароль и отправляет уже хеш на сервер.
Поэтому не важно откуда Вы пишите пароль: на сайте, или в приложении; хеш будет один и тот же.
3
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
24.01.2022, 15:38
Цитата Сообщение от limeniye Посмотреть сообщение
Поэтому слово "дятел" хешуруют, чтобы получить уникальный ключ
Вариантов на самом деле масса. Касательно этой задачи ТСа, настолько усложнять, думаю не стоит.
Цитата Сообщение от wizard41 Посмотреть сообщение
Зашифрованный текст получаете в HEX-формате
Сперва я задумал шифровать только сведения о пользователе, а хеш пароля оставлять в натурном виде (хекс). Так сказать, для слияния, чтобы общий фон шифрованного файла выглядел однородно.
Но по итогу завел туда же и хеш - он тоже прокручивается через механизм AES и становится видоизмененным.
В рамках данной задачи этого предостаточно. Препод загрустит )
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
24.01.2022, 15:42
Цитата Сообщение от wizard41 Посмотреть сообщение
настолько усложнять, думаю не стоит
Я не вникал в тему, но думаю всегда стоит, как минимум в рамках обучения.
Если всегда учиться коду, который берут "с низов" -- дальше низов не продвинешься.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
24.01.2022, 15:46
Цитата Сообщение от limeniye Посмотреть сообщение
но думаю всегда стоит, как минимум в рамках обучения.
Тут может возникнуть обратный эффект - от такого кол-ва единовременно внедренных "фишек" у обучающегося может возникнуть отторжение, т.к. он ничерта не понимает.
А так то да, конечно лучше всегда изучать что-то новое.
P.S. У меня лично такое было с LINQ.. Сперва я подумал, что это вообще не про меня. А сейчас думаю - как я столько времени без него жил.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
24.01.2022, 15:57
wizard41, я начал учить WPF, не зная ООП вообще.

От тебя что-то просят на форуме, мол "сделайте сами вот этот вот участочек кода". А я просто-напросто не въезжаю в сам вопрос. Вся проблема в том, что я не знаю как это должно выглядить в конечном результате.

Меня просят типо "сделайте модель для иммутабельного типа с иммутабельной коллекцией", а в моей голове это звучит примерно так:
рассчитайте массу частицы атома протонной звезды, имея параметр полёта баллиститеской кривой в синусоидной плоскости без расчёта угла искажения преламляющегося отражения от рефрактора гиперболы
Однажды Элд Хасп написал мне решение в пару классов, которое я разбирал следующие 3 месяца.
Видя конечный результат мне было легче изучать код: гуглишь тип, читаешь о нём, читаешь его примеры, разбираешься. А главным примером служит код, который и так есть "на руках".

Так что я очень сильно ЗА сложные примеры.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
24.01.2022, 16:03
Цитата Сообщение от limeniye Посмотреть сообщение
Так что я очень сильно ЗА сложные примеры.
Я тоже за. Но, привожу свои примеры решений сообразно примерно-представляемому уровню знаний вопрошающего пользователя, во избежание "лишних вопросов" не по существу задачи.
Цитата Сообщение от limeniye Посмотреть сообщение
рассчитайте массу частицы атома протонной звезды...
Хорошая задача, надо попробовать рассчитать
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
24.01.2022, 16:05
Цитата Сообщение от wizard41 Посмотреть сообщение
во избежание "лишних вопросов" не по существу задачи.
ай-ай-ай, кому-то лень объяснять код?

Добавлено через 43 секунды
Цитата Сообщение от wizard41 Посмотреть сообщение
Хорошая задача, надо попробовать рассчитать
Попробуйте, если что, разрешено считать в уме.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
24.01.2022, 16:11
Цитата Сообщение от limeniye Посмотреть сообщение
кому-то лень объяснять код?
бывает и такое. Да и не все можно объяснить двумя предложениями.
Цитата Сообщение от limeniye Посмотреть сообщение
Попробуйте, если что, разрешено считать в уме.
В уме могу только до 15-го знака после запятой. Сойдет?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
24.01.2022, 16:14
Цитата Сообщение от wizard41 Посмотреть сообщение
В уме могу только до 15-го знака после запятой. Сойдет?
Ну, голубчик, куда ж нам такие большие погрешности. Халтуру мы не принимаем.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
24.01.2022, 23:30
Цитата Сообщение от Wolfdp Посмотреть сообщение
Но лепить в классе статику -- такое.
Короче, мне эта фраза не давала покоя Ну Wolfdp... Всю затею сломал )
В общем так, я переосмыслил, передумал, перечеркнул, переделал.
Концепция слегка поменялась. Некоторые вещи упростил. И некоторые выкрутасы добавил.
Kyra90, вы на каком фрейме? 4.х или 5 и выше? У меня под 5.0 библа пишется. К вин-формам 4.х она не подключится. Ну, на всякий случай.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
26.01.2022, 17:29
Тоже каша, но лучше чем было:
class User
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    /// <summary>
    /// The Base class of Users
    /// </summary>
    public class User : IComparable
    {
        public string Name { get; private set; }
        public string Hash { get; private set; }
        public string Role { get => GetType().Name; }
 
 
        public User( string name, string password )
        {
            Name = name;
            Hash = UserManager.Hash.GetHash( password );
        }
 
 
 
        /// <summary>
        /// Get Users by Role User
        /// User type will receive only himself
        /// </summary>
        public virtual List<User> GetUserListByRole( List<User> l ) =>
            l.Where( x => x.Name == this.Name ).ToList();
 
 
 
        public int CompareTo( object? o )
        {
            if ( o is User user ) return Name.CompareTo( user.Name );
            else throw new ArgumentException( "Invalid parameter!" );
        }
 
 
        /// <summary>
        /// For Console...
        /// </summary>
        /// <returns></returns>
        public override string ToString() =>
            $"Name: {Name}\tRole: {Role}";
    }
 
 
    /// <summary>
    /// User with administrative rights
    /// </summary>
    public class Moderator : User
    {
        public Moderator( string name, string password ) : base( name, password ) { }
 
 
        /// <summary>
        /// Get Users by Role Moderator
        /// Only types User and Moderator will be returned
        /// </summary>
        public override List<User> GetUserListByRole( List<User> l ) =>
            l.Where( x => x.GetType().Name != "Administrator" ).ToList();
    }
 
 
    /// <summary>
    /// Well, it's clear here, right?
    /// </summary>
    public class Administrator : User
    {
        public Administrator( string name, string password ) : base( name, password ) { }
 
 
        /// <summary>
        /// Get Users by Role Administrator
        /// All users are visible
        /// </summary>
        public override List<User> GetUserListByRole( List<User> l ) => l;
    }

class UManager
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
    /// <summary>
    /// The main class for user management
    /// </summary>
    public class UManager
    {
        /// <summary>
        /// Users List
        /// </summary>
        internal List<User> ListOfUsers = new();
 
 
        /// <summary>
        /// Add a new User to List
        /// </summary>
        /// <param name="u">new User</param>
        /// <returns>
        /// TRUE - Successful addition
        /// FALSE - Refusal to add
        /// </returns>
        public bool AddUser( User u )
        {
            if ( string.IsNullOrEmpty( u.Name ) || string.IsNullOrEmpty( u.Hash ) )
                return false;
            
            if ( !ListOfUsers.Any( v => v.Name == u.Name ) )
            {
                ListOfUsers.Add( u );
                return true;
            }
            return false;
        }
 
 
 
        /// <summary>
        /// Add a new User Range to List
        /// </summary>
        /// <param name="u">new User[]</param>
        /// <returns>
        /// int - Count of successfuly adding Users
        /// </returns>
        public int AddUserRange( User[] u )
        {
            if ( u == null || u.Length == 0 )
                return -1;
 
            int count = 0;
            for ( int i = 0; i < u.Length; i++ )
            {
                if ( !ListOfUsers.Any( v => v.Name == u[ i ].Name ) )
                {
                    ListOfUsers.Add( u[ i ] );
                    count++;
                }
            }
            return count;
        }
 
 
 
 
        /// <summary>
        /// Select User by index in User List
        /// </summary>
        /// <param name="i">index</param>
        /// <returns>Type User</returns>
        public User SelectUser( int i )
        {
            if ( i < 0 || i >= ListOfUsers.Count ) return null;
            return ListOfUsers[ i ];
        }
 
 
 
 
        /// <summary>
        /// Select User by Name in User List
        /// </summary>
        /// <param name="i">index</param>
        /// <returns>Type User</returns>
        public User SelectUser( string name )
        {
            return ListOfUsers.Where( x => x.Name == name ).FirstOrDefault();
        }
 
 
 
 
        /// <summary>
        /// Remove a User from List
        /// </summary>
        /// <param name="u">Type User to be deleted</param>
        public void RemoveUser( User u ) => ListOfUsers.Remove( u );
 
 
 
        /// <summary>
        /// Get Users List
        /// </summary>
        /// <returns>List<User></returns>
        public List<User> UserList() => ListOfUsers;
    }

class Program
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
static void Main()
        {
            UManager mng = new();
 
            User[] users = new User[]
            {
                new User( "Bob", "passw1" ),
                new User( "Peter", "passw2" ),
                new Moderator( "Victor", "passw3" ),
                new Moderator( "Ivan", "passw4" ),
                new Administrator( "Alice", "passw5" ),
                new Administrator( "Alice", "passw6" ), // Will not be added to the list!
            };
 
            int cnt = mng.AddUserRange( users );
            Console.WriteLine( $"{cnt} Users add in list" );    // 5 Users add in list
 
            User current = mng.SelectUser( "Alice" );   // Get user by Name
            Console.WriteLine( $"Current user: {current}" );    // Current user: Name: Alice       Role: Administrator
 
            List<User> list = current.GetUserListByRole( mng.UserList() );
 
            // All users are visible
            Console.WriteLine( string.Join( "\n", list ) );
 
            /*
             *  Name: Bob       Role: User
             *  Name: Peter     Role: User
             *  Name: Victor    Role: Moderator
             *  Name: Ivan      Role: Moderator
             *  Name: Alice     Role: Administrator
            */
 
 
 
            current = mng.SelectUser( "Peter" );    // Get user by Name
            Console.WriteLine( $"Current user: {current}" );    // Current user: Name: Peter       Role: User
            list = current.GetUserListByRole( mng.UserList() );
 
            // A user of the User type will receive only himself
            Console.WriteLine( string.Join( "\n", list ) );
 
            /* Name: Peter     Role: User */
 
 
            current = mng.SelectUser( 2 );  // Get user by index
            Console.WriteLine( $"Current user: {current}" );    // Current user: Name: Victor      Role: Moderator
            list = current.GetUserListByRole( mng.UserList() );
 
            // Only types User and Moderator will be returned
            Console.WriteLine( string.Join( "\n", list ) );
 
            /*
             *  Name: Bob       Role: User
             *  Name: Peter     Role: User
             *  Name: Victor    Role: Moderator
             *  Name: Ivan      Role: Moderator
             */
 
 
            Console.WriteLine( "\n---Delete user Bob from List---" );
            current = mng.SelectUser( "Bob" );  // Get user by Name 'Bob'
 
            // Delete user Bob from List
            mng.RemoveUser( current );
            Console.WriteLine( "\n---Current List without Bob---" );
            Console.WriteLine( string.Join( "\n", mng.UserList() ) );
 
            /*
             *  ---Current List without Bob---
             *  Name: Peter     Role: User
             *  Name: Victor    Role: Moderator
             *  Name: Ivan      Role: Moderator
             *  Name: Alice     Role: Administrator
             */
 
 
            // To be continue...
 
 
            Console.ReadKey();
        }
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
26.01.2022, 17:53
Жду финальную версию , без каши.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
26.01.2022, 18:01
Цитата Сообщение от limeniye Посмотреть сообщение
Жду финальную версию
Релиз запланирован на февраль
1
26.01.2022, 18:20

Не по теме:

*Поставил звёздочку на "Watch"*

0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
27.01.2022, 00:49
Такс, совсем забыл про то, что нужно иметь возможность менять роли пользователей.
В представленных выше классах User, Moderator, и Administrator это можно было бы сделать, путем глубокого копирования с приведением типов, НО! Столкнулся с проблемой при создании новых экземпляров объектов типа User: он содержит конструктор, и потому требует в аргументы Имя и Пароль. А пароля нет - есть только хеш. Можно было бы предварительно сохранять эти значения и потом присваивать созданным (преобразованным) объектам, но не хочется делать эти поля доступными для изменения извне.

В общем, откатился к прежнему виду класса User, немного видоизменив его:
class User
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/// <summary>
    /// The Base class of Users
    /// </summary>
    public class User : IComparable
    {
        public string Name { get; private set; }
        public string Hash { get; private set; }
        public UserType Role { get; private set; }
 
 
        public User( string name, string password, UserType type )
        {
            Name = name;
            Hash = UserManager.Hash.GetHash( password );
            Role = type;
        }
 
 
 
        /// <summary>
        /// Set Role
        /// </summary>
        /// <param name="r">UserType Role</param>
        public void SetRole( UserType r ) => Role = r;
 
 
 
        /// <summary>
        /// Get Users by Role
        /// </summary>
        public List<User> GetUserListByRole( List<User> list )
        {
            switch ( Role )
            {
                case UserType.Administrator: return list;
                case UserType.Moderator: return list
                        .Where( x => x.Role == UserType.Moderator || x.Role == UserType.User )
                        .ToList();
                default: return list.Where( x => x.Name == Name ).ToList();
            }
        }
 
 
 
        public int CompareTo( object? o )
        {
            if ( o is User user ) return Name.CompareTo( user.Name );
            else throw new ArgumentException( "Invalid parameter!" );
        }
 
 
        /// <summary>
        /// For Console...
        /// </summary>
        /// <returns></returns>
        public override string ToString() =>
            $"Name: {Name}\tRole: {Role}";
    }

Теперь изменений ролей пользователей выглядит просто:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        /// <summary>
        /// Change Privelegy for Users
        /// </summary>
        /// <param name="user">User to be change</param>
        /// <param name="type">New Role</param>
        public void ChangePrivelegy( User user, UserType type )
        {
            int index = ListOfUsers
                        .Select( ( s, index ) => new { s, index } )
                        .Where( x => x.s == user )
                        .Select( x => x.index )
                        .FirstOrDefault();
 
            ListOfUsers[index].SetRole( type );
        }
где ListOfUsers - это список зарегистрированных пользователей.
Защиты от изменения роли самому себе пока нет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            UManager mng = new();
 
            User[] users = new User[]
            {
                new User( "Bob", "passw1", UserType.User ),
                new User( "Peter", "passw2", UserType.User ),
                new User( "Victor", "passw3", UserType.Moderator ),
                new User( "Ivan", "passw4", UserType.Moderator ),
                new User( "Alice", "passw5", UserType.Administrator ),
            };
 
            mng.AddUserRange( users );
            Console.WriteLine( string.Join( "\n", mng.UserList() ) );
            Console.WriteLine( "---------" );
 
            User select = mng.SelectUser( "Peter" );
            mng.ChangePrivelegy( select, UserType.Administrator );
 
            Console.WriteLine( string.Join( "\n", mng.UserList() ) );
Теперь Peter стал админом:
Code
1
2
3
4
5
6
7
8
9
10
11
Name: Bob       Role: User
Name: Peter     Role: User
Name: Victor    Role: Moderator
Name: Ivan      Role: Moderator
Name: Alice     Role: Administrator
---------
Name: Bob       Role: User
Name: Peter     Role: Administrator
Name: Victor    Role: Moderator
Name: Ivan      Role: Moderator
Name: Alice     Role: Administrator
Доступные полномочия по смене ролей пользователей пока отдаю "наверх" во фронтэнд.
Получение списка пользователей согласно правам текущего - сделано внутри класса User.

Добавлено через 2 минуты
Да, конечно же
C#
1
.Where( x => x.Role == UserType.Moderator || x.Role == UserType.User )
можно сделать попроще:
C#
1
.Where( x => x.Role != UserType.Administrator )
2
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
28.01.2022, 00:18
Издание 3-е, переработанное и дополненное (под ред. wizard41)

Изменения:
• класс User полностью скрыт от использования во внешней среде
• для обмена пользователями между приложением и библой предоставлена публичная структура StructUser
• методы класса UManager работают только с залогиненным пользователем (невозможно управлять
системой не пройдя процедуру аутентификации)
• тихим сапом приближаемся к DI...

ConsoleTest:
class Program
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
static class Program
    {
        static void Main()
        {
            UManager mng = new();
                        
 
            StructUser[] users = new StructUser[]
            {
                new StructUser( "UserOne", "pasw1", UserType.User ),
                new StructUser( "UserTwo", "pasw2", UserType.User ),
                new StructUser( "ModerOne", "pasw3", UserType.Moderator ),
                new StructUser( "ModerTwo", "pasw4", UserType.Moderator ),
                new StructUser( "AdminOne", "pasw5", UserType.Administrator ),
                new StructUser( "AdminOne", "pasw6", UserType.Administrator ),  // Not add!
            };
 
            // Добавляем пользователей
            Console.WriteLine( $"{mng.AddUserRange( users )} users added"  );   // 0 Пользователей добавлено
 
            // 0 users added
 
 
            // Логинимся админом
            bool result = mng.LogIn( "_Admin", "" );
            Console.WriteLine( $"Login _Admin result: {result}" );
 
            // Login result: True
 
 
            // Добавляем пользователей
            Console.WriteLine( $"{mng.AddUserRange( users )} users added" );   // 5 Пользователей добавлено
 
            // 5 users added
 
 
            // Выводим список согласно текущей роли (Админ = весь список)
            PrintUsers( mng.GetUserListByRole() );
 
 
            // Name: _Admin     Role: Administrator
            // Name: UserOne    Role: User
            // Name: UserTwo    Role: User
            // Name: ModerOne   Role: Moderator
            // Name: ModerTwo   Role: Moderator
            // Name: AdminOne   Role: Administrator
 
 
            // Попытка залогинится другому юзеру, пока залогинен другой
            result = mng.LogIn( "_User", "" );
            Console.WriteLine( $"Login _User result: {result}" );
 
            // Login result: False
 
 
            // Выходим
            mng.LogOut();
            Console.WriteLine( "<--- LogOut --->" );
 
            // <--- LogOut --->
 
            // Попытка получить список пользователей
            PrintUsers( mng.GetUserListByRole() );
 
            //
            // Ничего не выводится, список пуст!
 
 
            // Снова логинится _User
            result = mng.LogIn( "_User", "" );
            Console.WriteLine( $"Login _User result: {result}" );
 
            // Login result: True
 
 
            // Получаем список пользователей
            PrintUsers( mng.GetUserListByRole() );
 
            // Name: _User     Role: User
 
            // Пользователь с правами User получает только самого себя
 
 
            Console.ReadKey();
        }
 
 
 
        static void PrintUsers( List<StructUser> u ) =>
            Console.WriteLine( string.Join( "\n", u ) );
    }


Добавлено через 1 минуту
Для тестов временно добавлены два пользователя по умолчанию в список зарегистрированных пользователей
C#
1
2
3
4
5
        internal static List<User> ListOfUsers = new()
        {
            new User ( "_Admin", "", UserType.Administrator ),      // for test only!
            new User( "_User", "", UserType.User ),                 // for test only! 
        };
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
28.01.2022, 10:24
wizard41, а события где?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
28.01.2022, 12:56
Цитата Сообщение от limeniye Посмотреть сообщение
а события где?
Какие?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
28.01.2022, 13:26
Я считаю, что подобные записи -- лишают код гибкости
C#
1
2
result = mng.LogIn( "_User", "" );
Console.WriteLine( $"Login _User result: {result}" );
Альтернатива:
C#
1
public delegate void AuthorizationChangeEventArgs(object sender, LoginState newLoginState);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2022, 13:26

Где хранить информацию в WPF приложении чтобы её можно было переносить с приложением на любой компьютер?
Народ, привет. У меня есть приложение с БД ( SQL Server ) созданной в Visual Studio 2012. Но эта БД работает не у всех пользователей,...

Где лучше хранить строку подключения к sql?
Форумчане не подскажете где лучше хранить строку подключения к sql? хочу написать универсальный кдасс для получения соединения

Как хранить переменную в приложении
Здравствуйте! Приложение хранится на сервере, в приложении нужно хранить переменную с адресом e-mail сервера, менять эту переменную могут...

Где лучше хранить рисунки в приложении?
Доброго дня. В моём приложении будет пакет рисунков. Куда их лучше положить, в res\drawable или в assets, с прицелом в дальнейшем на то...

Как хранить в приложении большой объем текста
как вставить текст в Visual Basic?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru