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

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

14.01.2022, 12:58. Показов 11066. Ответов 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
17.01.2022, 14:29
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HF Посмотреть сообщение
И она будет писать в юзерконфиг зашифрованные данные вашей либой.
Да да, примерно так.
Цитата Сообщение от Kyra90 Посмотреть сообщение
покажи код библиотеки
Это пока даже не Release Candidate Я вчера вечером начал, пока есть только функции определения/создания файла, вычисление хеша, шифровки имени и роли.
Название: Безымянный.png
Просмотров: 138

Размер: 5.6 Кб
Начало такое:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    /// <summary>
    /// Main Class of User Management
    /// </summary>
    public class UManager
    {
        public string LastErrorMessage { get; private set; }
 
 
        public UManager( string fpath = null, string fname = null )
        {
            FileManager.Path = fpath ?? AppDomain.CurrentDomain.BaseDirectory;
            FileManager.FileName = fname ?? "Users.txt";
        }
........
Создание экземпляра UManager без параметров - создает файл по умолчанию рядом с exe. Но можно указать конкретный путь и имя файла, тогда он создаться в нужном месте и с нужным именем...
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
17.01.2022, 19:35
Цитата Сообщение от Kyra90 Посмотреть сообщение
Я просто ответила на вопрос
Аа.. вон к чему этот вопрос был )

Добавлено через 3 минуты
Я еще даже не продумал сущности, как хранить и обрабатывать юзеров. Не то это будет массив структур, не то список строк...

Добавлено через 45 минут
Цитата Сообщение от Kyra90 Посмотреть сообщение
покажи код библиотеки
Цитата Сообщение от HF Посмотреть сообщение
Это не ко мне.
Вот и ответ преподу

Добавлено через 4 часа 14 минут
Kyra90, такс.. что пока (условно) готово у меня:
Так пока выглядит "главный управляющий" библой UManager:
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
using System;
using System.Collections.Generic;
 
namespace UsrMngmt
{
    /// <summary>
    /// Main Class of User Management
    /// </summary>
    public class UManager
    {
        public string LastErrorMessage { get; private set; }
 
 
        public UManager( string fpath = null, string fname = null )
        {
            FileManager.Path = fpath ?? AppDomain.CurrentDomain.BaseDirectory;
            FileManager.FileName = fname ?? "Users.txt";
            int result = FileManager.FileLoad();
 
        }
 
 
        public static List<string> GetLog() => LoggerSrv.GetLog();
 
    }
}

Для "наружного применения" доступен только этот класс из библиотеки. В нем будут сосредоточены все вызовы необходимых функций.
Функция хеширования, ну тут все просто:
Hash
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
using System.Security.Cryptography;
using System.Text;
 
namespace UsrMngmt
{
    internal class Hash
    {
        /// <summary>
        /// Generate a Hash code from byte[] values
        /// </summary>
        public static string GetHash( string s )
        {
            byte[] hashValue;
            string result = "";
 
            using ( SHA256 hash256 = SHA256.Create() )
                hashValue = hash256.ComputeHash( Encoding.Default.GetBytes( s ) );
 
            for ( int i = 0; i < hashValue.Length; i++ )
                result += $"{hashValue[ i ]:x2}";
            return result;
        }
    }
}

Файловый менеджер:
FileManager
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
using System;
using System.IO;
using System.Text;
 
namespace UsrMngmt
{
    internal static class FileManager
    {
        public static string Path { get; set; }
        public static string FileName { get; set; }
 
 
 
        public static bool IsFileExist
        {
            get => File.Exists( System.IO.Path.Combine( Path, FileName ) );
        }
 
 
 
        public static int FileLoad()
        {
            // Check if the file exist ...
            // If not, create it.
            if ( !IsFileExist )
            {
                try
                {
                    if ( !Directory.Exists( Path ) )
                        Directory.CreateDirectory( Path );
                    FileStream fs = new( System.IO.Path.Combine( Path, FileName ), FileMode.OpenOrCreate, FileAccess.Write );
                    fs.Dispose();
 
                    LoggerSrv.Write( $"File {FileName} not found!" );
                    LoggerSrv.Write( $"File {FileName} created!" );
                }
                catch ( Exception ex ) { LoggerSrv.Write( $"Exception: {ex}" ); }
            }
 
            try
            {
                string[] lines = File.ReadAllLines( System.IO.Path.Combine( Path, FileName ), Encoding.Default );
                if ( lines.Length == 0 )
                    LoggerSrv.Write( "Are no lines in the file!" );
                else
                {
                    LoggerSrv.Write( $"A {lines.Length} lines have been read" );
 
                    /*
                     * Вот здесь надо передавать полученный массив строк string[] lines
                     * в какую-то структуру или класс... Для дальнейшей обработки, так как
                     * эта задача уже не Файлового менеджера.
                     * Разрезать на составляющие (Имя/Роль/Пароль), дешифрование, редактирование,
                     * шифрование, упаковка... etc..
                     */
 
                    return lines.Length;
                }    
            }
 
            // It looks like it will never happen ))
            catch ( Exception ex ) { LoggerSrv.Write( $"Exception: {ex}" ); }
            return 0;
        }
 
 
 
        public static void FileWrite( string text )
        {
            using StreamWriter sw = new( System.IO.Path.Combine( Path, FileName ), false, Encoding.Default );
            sw.WriteLineAsync( text );
        }
    }
}

FileManager - только читает и записывает файл. Если файла нет - создает. Что читает и записывает ему должно быть пофигу.
В коде виден некий LoggerSrv, вот он:
LoggerSrv
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
 
 
namespace UsrMngmt
{
    internal class LoggerSrv
    {
        private static List<string> Log = new List<string>()
        {
            "[--------------- Logger Servise ---------------]",
        };
 
        public static void Write( string _in ) => Log.Add( $"{DateTime.Now} --> " + _in );
 
        public static List<string> GetLog() => Log;
    }
}

Дважды два - все просто. Можно вызывать в нужные моменты лог и смотреть что творится..
В главной программе пока тестирование..
C#
1
2
3
4
5
6
        static void Main()
        {
            UManager umng = new();
            Console.WriteLine( string.Join( '\n', UManager.GetLog() ) );
            Console.ReadKey();
        }
Логгер выдает следующее:
Code
1
2
3
4
[--------------- Logger Servise ---------------]
17.01.2022 19:24:42 --> File Users.txt not found!
17.01.2022 19:24:42 --> File Users.txt created!
17.01.2022 19:24:42 --> Are no lines in the file!
Добавим несколько строк в файл..
Code
1
2
[--------------- Logger Servise ---------------]
17.01.2022 19:25:34 --> A 5 lines have been read
Кроме самого "управляющего" класса UManager все остальные полностью статические, т.к. это просто инструменты для основного и создание их экземпляров вроде бы не требуется.
Да и сам UManager пока под вопросом. Сейчас используется разве что его конструктор для присвоения путей к файлу..
Ну ладно.

Предложения:
1. Использовать не *.txt файлы, а, например *.bin или *.dat, ну или вообще какой-нибудь оригинальный, типа *.usrdhpxx ) Да и вообще, для пущего негодования препода - записывать файлы в двоичном виде.
2. Действительно использовать Properties.Settings для учетки админа, но записывать туда не сам пароль, а его хеш, как и в файле с пользователями.
3. НЕ использовать Properties.Settings и хранить админа вместе со всеми
2
 Аватар для Kyra90
232 / 153 / 85
Регистрация: 06.10.2020
Сообщений: 468
17.01.2022, 19:40  [ТС]
wizard41, Офигеть... буду разбираться. Спасибо Вам огромное.

Цитата Сообщение от wizard41 Посмотреть сообщение
Использовать не *.txt файлы, а, например *.bin или *.dat,
Я вообще пишу в файл без расширения))
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
18.01.2022, 00:04
Update:
Исправленный и дополненный FileManager:
FileManager
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
    internal static class FileManager
    {
        public static string Path { get; set; }
        public static string FileName { get; set; }
 
 
 
        private static bool IsFileExist
        {
            get => File.Exists( System.IO.Path.Combine( Path, FileName ) );
        }
 
 
 
        public static int FileLoad()
        {
            // Check if the file exist ...
            // If not, create it.
            if ( !IsFileExist )
            {
                LoggerSrv.Write( $"File {FileName} not found!" );
 
                try
                {
                    if ( !Directory.Exists( Path ) )
                        Directory.CreateDirectory( Path );
                    FileStream fs = new( System.IO.Path.Combine( Path, FileName ), FileMode.OpenOrCreate, FileAccess.Write );
                    fs.Dispose();     
                    LoggerSrv.Write( $"File {FileName} created!" );
                }
                catch ( Exception ex ) { LoggerSrv.Write( $"Exception: {ex}" ); }
            }
 
            try
            {
                string[] lines = File.ReadAllLines( System.IO.Path.Combine( Path, FileName ), Encoding.Default );
                if ( lines.Length == 0 )
                    LoggerSrv.Write( "Are no lines in the file!" );
                else
                {
                    LoggerSrv.Write( "<-------- Reading Lines Result --------->" );
                    LoggerSrv.Write( $"A {lines.Length} lines have been read" );
                    LoggerSrv.Write( "Decrypt proccessing started....." );
                    Decrypt.Proccessing( lines );
                    return lines.Length;
                }    
            }
 
            // It looks like it will never happen ))
            catch ( Exception ex ) { LoggerSrv.Write( $"Exception: {ex}" ); }
            return 0;
        }
 
 
 
        public static void FileWrite( string text )
        {
            using StreamWriter sw = new( System.IO.Path.Combine( Path, FileName ), false, Encoding.Default );
            sw.WriteLineAsync( text );
        }
    }

Структура пользователя User:
struct User
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace UsrMngmt
{
    /// <summary>
    /// The structure of the one each User
    /// </summary>
    struct User
    {
        public string Name { get; set; }
        public int Role { get; set; }
        public string Hash { get; set; }
        public User( string n, int r, string h )
        {
            Name = n;
            Role = r;
            Hash = h;
        }
 
        public override string ToString() =>
            $"Name:\t{Name}\nRole:\t{Enum.GetName( typeof( UserType ), Role )}\nHash:\t{Hash}\n";
    }
}

Класс Decrypt:
Decrypt
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
    internal static class Decrypt
    {
        /// <summary>
        /// Array with decrypted data
        /// </summary>
        public static User[] DecriptedUsers { get; private set; }
 
 
        /// <summary>
        /// Decryption process
        /// </summary>
        /// <param name="_in">Array of raw data strings</param>
        public static void Proccessing( string[] _in )
        {
            DecriptedUsers = new User[ _in.Length ];
 
 
            /*
             * TODO:
             * There will be methods for decrypting strings, depending
             * on the algorithm used.
             * The specifics of the method can be pre-agreed and taken 
             * into account in the terms of reference.
             */
 
 
            // Number of successful decryption operations
            int count = 0;
 
            for ( int i = 0; i < _in.Length; i++ )
            {
                string name = _in[ i ].Split( ':' )[ 0 ];
                string hash = _in[ i ].Split( ':' )[ 2 ];
 
                if ( name != string.Empty && hash != string.Empty && int.TryParse( _in[ i ].Split( ':' )[ 1 ], out int role ) )
                {
                    DecriptedUsers[ i ] = new User( name, role, hash );
                    count++;
                }
                // otherwise the line is ignored.  
            }
            LoggerSrv.Write( "<---------- Decryption Result ---------->" );
            LoggerSrv.Write( $"--> {count} lines have been decrypted" );
        }
    }

UManager пока такой:
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
namespace UsrMngmt
{
    /// <summary>
    /// Main Class of User Management
    /// </summary>
    public class UManager
    {
        public string LastErrorMessage { get; private set; }
 
 
        public UManager( string fpath = null, string fname = null )
        {
            FileManager.Path = fpath ?? AppDomain.CurrentDomain.BaseDirectory;
            FileManager.FileName = fname ?? "Users.txt";
            int result = FileManager.FileLoad();
 
        }
 
 
        public static List<string> PrintUsers()
        {
            List<string> users = new() { "<----- User List ----->" };
            if ( Decrypt.DecriptedUsers != null && Decrypt.DecriptedUsers.Length > 0 )
                foreach ( User u in Decrypt.DecriptedUsers )
                    users.Add( u.ToString() );
            return users;
        }
 
        public static List<string> GetLog() => LoggerSrv.GetLog();
 
 
    }
}

Допустим, что файл сейчас такой:
Code
1
2
3
4
Eva:1:67a35e553619de96e2d2ffa469381785614055209c0e1fa44a914d0dc06bd082
Bob:2:762d8b7bf69d37f904b5d961c82b658043474123e35576d4abd040bca01e7892
Alice:3:23861b6496475af48a1a20674473077e9282d721f632ec5149645756f386c849
Victor:3:2938d66dc1b40a1e34101d0f51ac5b1b6fc0022ba9c2e2a77fcc76e5ef41e70d
Пока без всяких шифрований.
Теперь, если сделать что-то такое:
C#
1
2
3
4
5
6
7
        static void Main()
        {
            UManager umng = new();
            Console.WriteLine( string.Join( '\n', UManager.PrintUsers() ) );
            Console.WriteLine( string.Join( '\n', UManager.GetLog() ) );
            Console.ReadKey();
        }
То получим вывод:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<----- User List ----->
Name:   Eva
Role:   Administrator
Hash:   67a35e553619de96e2d2ffa469381785614055209c0e1fa44a914d0dc06bd082
 
Name:   Bob
Role:   SuperUser
Hash:   762d8b7bf69d37f904b5d961c82b658043474123e35576d4abd040bca01e7892
 
Name:   Alice
Role:   User
Hash:   23861b6496475af48a1a20674473077e9282d721f632ec5149645756f386c849
 
Name:   Victor
Role:   User
Hash:   2938d66dc1b40a1e34101d0f51ac5b1b6fc0022ba9c2e2a77fcc76e5ef41e70d
 
[--------------- Logger Servise ---------------]
18.01.2022 0:02:15 --> <-------- Reading Lines Result --------->
18.01.2022 0:02:15 --> A 4 lines have been read
18.01.2022 0:02:15 --> Decrypt proccessing started.....
18.01.2022 0:02:15 --> <---------- Decryption Result ---------->
18.01.2022 0:02:15 --> --> 4 lines have been decrypted
Пока все. Пиво пенное, голова туманная
Понятно, что требуется хороший код-ревью, оптимизации, доработки и пр.
We'll continue later!
2
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
18.01.2022, 13:08
Цитата Сообщение от wizard41 Посмотреть сообщение
LoggerSrv.Write
1. Почему не через DI?
2. Вы уверены что библиотека должна принудительно "логировать" все ошибки?
0
HF
 Аватар для HF
1344 / 928 / 202
Регистрация: 09.09.2011
Сообщений: 2,757
Записей в блоге: 2
18.01.2022, 13:29
Цитата Сообщение от Wolfdp Посмотреть сообщение
Почему не через DI?
HelloWorld с интерфейсами, DI, генериками и рефлексией.

P.S. Придумал другой вариант требования задачи, но решил не писать. Во-первых, уже выбран вариант. Во-вторых, всё-таки цель - автору самому придумывать такое. Иначе зачем всё это.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
18.01.2022, 13:31
Цитата Сообщение от HF Посмотреть сообщение
HelloWorld с интерфейсами, DI
Интерфейсы не обязательно, можно и просто через конструктор передавать нужное. Но лепить в классе статику -- такое.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
18.01.2022, 13:56
Цитата Сообщение от Wolfdp Посмотреть сообщение
Почему не через DI?
А зачем оно в такой-то задаче?
Да и вообще - логгер этот, это так, баловство )
Цитата Сообщение от Wolfdp Посмотреть сообщение
Вы уверены что библиотека должна принудительно "логировать" все ошибки?
Не уверен.
Изначально он задуман для того, чтобы видеть что происходит в закрытых классах, т.к. доступ к ним извне я не открываю.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Но лепить в классе статику -- такое.
Отчасти согласен. Однако в данном применении в создании объектов не вижу смысла.

Добавлено через 13 минут
Единственно сомневаюсь в классе UManager - его конструктор присваивает пути к файлу. Если сделать его статическим, то придется лепить свойства по умолчанию для путей и метод для присвоения путей извне.
Ну и другие его методы тоже тогда нет смысла делать static...
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
18.01.2022, 23:18
wizard41, пора репу на гитхабе создавать
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
19.01.2022, 02:02
Цитата Сообщение от aenye Посмотреть сообщение
пора репу на гитхабе создавать
Есть уже. И пиво было немецкое

Добавлено через 17 минут
Прислушался я к ответу Wolfdp, да, логирование лучше делать по требованию.
Kyra90, я понемногу продвигаюсь, тут уже вам и класс User предоставляется и готовые типы учеток UserRole...
Запись/чтение файлов вообще без вас делается, ну понятно, да.
Еще немного допилить + вклеить логику делегирования прав разным пользователям, и можно считать, что бизнес-модель вашей курсовой готова.
Форма будет только отображать и редактировать данные ядра (модели).

P.S. Тот проект, что на гифке показывал с винформой - случайно уDELил, новый форм рисовать лень. Отрабатываю в консоли библу.
P.S.S. В какой форме (коллекции) удобнее получать сведения о зарегистрированных пользователях для вывода в элементы управления? Пока я возвращаю массив типа User.

Добавлено через 2 часа 4 минуты
Upd:
Класс пользователей:
Class Users
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
    /// <summary>
    /// Generic abstract class of User
    /// </summary>
    public abstract class Users
    {
        public string Name { get; set; }
        public UserRole Role { get; set; }
 
        public Users( string name, UserRole role )
        {
            Name = name;
            Role = role;
        }
 
        public override string ToString() =>
            $"Name: {Name}\tRights: {Enum.GetName( typeof( UserRole ), Role )}";
    }
 
 
 
    /// <summary>
    /// Derived class of User for internal use
    /// </summary>
    internal class RegisteredUser : Users
    {
        public string Hash { get; private set; }
        public RegisteredUser( string n, UserRole r, string h ) : base( n, r ) { Hash = h; }
    }
 
 
 
    /// <summary>
    /// User class for external use (?)
    /// </summary>
    public class User : Users
    {
        public User( string n, UserRole r ) : base( n, r ) { }
    }

Но я не даю вам полномочий бесконтрольно плодить пользователей с помощью, например, User u = new User(); в обход процедуры регистрации:
Authorization
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    internal class Authorization
    {
        /// <summary>
        /// Registered Users
        /// </summary>
        public static List<RegisteredUser> RegisteredUsers = new();
 
 
        /// <summary>
        /// Registering new User
        /// </summary>
        public static void SignUp( User u, string passw ) =>
            RegisteredUsers.Add( new RegisteredUser( u.Name, u.Role, Hash.GetHash( passw ) ) );

Открытый класс User всего лишь для возврата коллекции зарегистрированных пользователей во внешнюю среду.

Добавлено через 7 минут
Да, и максимальное абстрагирование от формальных паролей: введенный пароль остается в форточке, взяли с него хеш, записали в базу и до свидания. В памяти (библиотеки) фактических паролей нет.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
19.01.2022, 14:35
Kyra90, зарегистрированных пользователей я возвращаю:
C#
1
2
3
4
5
6
7
        public User[] GetUsers()
        {
            User[] users = new User[ Authorization.RegisteredUsers.Count ];
            for ( int i = 0; i < Authorization.RegisteredUsers.Count; i++ )
                users[ i ] = new User( Authorization.RegisteredUsers[ i ].Name, Authorization.RegisteredUsers[ i ].Role );
            return users;   
        }
В консоли:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
        static void Main()
        {
            UManager umng = new();
            User[] users = umng.GetUsers();
            foreach ( User user in users )
                Console.WriteLine( user );


И в формах:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public Form1()
        {
            InitializeComponent();
            UManager umng = new();
            User[] users = umng.GetUsers();
 
            lv1.Columns.Add( "Name" );
            lv1.Columns.Add( "Role" );
 
            foreach ( User u in users )
            {
                ListViewItem item = new ListViewItem { Text = u.Name };
                item.SubItems.Add( u.Role.ToString() );
                lv1.Items.Add( item );
            } 
        }

1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
19.01.2022, 20:07
Kyra90, у нас возникает одна неопределенность: юзвери у нас имеют только два значимых атрибута - это Имя и Пароль. Следовательно, можно невзначай создать пользователя с одинаковым именем и паролем, что явно не входит в задуманное.
От сюда, можно либо запрещать регистрировать пользователя с одинаковым именем и хешем пароля (что далеко от действительности), либо ввести еще одно поле-идентификатор, например адрес эл. почты. Или номер телефона..
Цитата Сообщение от HF Посмотреть сообщение
Придумал другой вариант требования задачи, но решил не писать.
Интересно было бы выслушать ваш вариант... Может он даст некий толчок к правильной реализации ))
0
 Аватар для Kyra90
232 / 153 / 85
Регистрация: 06.10.2020
Сообщений: 468
19.01.2022, 22:03  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
у нас возникает одна неопределенность:
Ага... я на основе Ваших наработок понемногу двигаюсь вперед и проверку на дублирование пользователей сделала

Цитата Сообщение от wizard41 Посмотреть сообщение
можно либо запрещать регистрировать пользователя с одинаковым именем и хешем пароля
Да ну не смейтесь))) пароли уж точно пусть любые будут... а то будет как в приколе,(видела в инете, но не смогла найти) когда человек ввел пароль при регистрации, а ему всплыло окно "Этот пароль занят пользователем таким-то"
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
19.01.2022, 22:34
Цитата Сообщение от Kyra90 Посмотреть сообщение
и проверку на дублирование пользователей сделала
Цитата Сообщение от Kyra90 Посмотреть сообщение
пароли уж точно пусть любые будут...
Ну я к тому и клоню, ведь согласитесь, может быть два условно "Алексея" с одинаковыми паролями и это не повод отклонять второго из-за того, что у них одинаковые пароли.
А если зарегать их обоих, то будет непонятно при выборке, какого именно Алексея мы имеем в виду.
0
 Аватар для Kyra90
232 / 153 / 85
Регистрация: 06.10.2020
Сообщений: 468
19.01.2022, 22:59  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Ну я к тому и клоню, ведь согласитесь, может быть два условно "Алексея"
"Пользователь с таким именем существует" - спасательная фраза
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
19.01.2022, 23:55
Цитата Сообщение от Kyra90 Посмотреть сообщение
спасательная фраза
Ну, по факту это ведь не правильно. Регистрировать пользователей только с уникальными именами.
Но если вы настаиваете на этом, то учту в своем решении. Пока исхожу из этого.

Добавлено через 10 минут
C#
1
2
3
4
            umng.SignNewUser( new User( "Igor", UserRole.Administrator ), "qwerty7799" );
            users = umng.GetUsers();
            foreach ( User user in users )
                Console.WriteLine( user );
Code
1
2
3
4
5
Name: Eva       Rights: Administrator
Name: Bob       Rights: SuperUser
Name: Alice     Rights: User
Name: Victor    Rights: User
Name: Igor      Rights: Administrator
Еще компаратор неплохо бы написать, для сортировки юзверей по полям..

Добавлено через 2 минуты
Юзеры до Igor были прочитаны из файла. Igor добавили уже в ходе работы приложения. При закрытии, он допишется в файл. Вернее, перепишется весь список.
Проверки и компаратор позже сделаю.

Добавлено через 39 минут
C#
1
2
3
4
5
6
7
8
9
10
11
        public bool SignNewUser( User user, string passw )
        {
            /*
             * Здесь необходимые проверки для успешной
             * регистрации пользователя
             */
            
            AR.SignUp( user, passw );
 
            return true;    // temp
        }
Эти проверки можно отдать вам на верхний уровень front-end'а, или же реализовать здесь.
Метод SignUp от вас скрыт (реализация).
Да, и AR тут - псевдоним:
C#
1
using AR = UsrMngmt.Authorization;
1
 Аватар для Kyra90
232 / 153 / 85
Регистрация: 06.10.2020
Сообщений: 468
20.01.2022, 10:28  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Юзеры до Igor были прочитаны из файла. Igor добавили уже в ходе работы приложения.
Это у меня тоже уже реализовано. Если я правильно поняла. У меня есть метод Refresh, который перечитывает данные из файла. Он выполняется, например, когда включается форма, для того, чтоб зарегистрированные пользователи попали в список combobox. При добавлении, удалении, изменении пароля или роли пользователя (после добавления/изменения и записи файла) метод Refresh обновит данные о пользователях, и ими можно будет пользоваться.

Добавлено через 9 минут
Цитата Сообщение от wizard41 Посмотреть сообщение
Ну, по факту это ведь не правильно
Ну, даже не знаю, что сказать. Логином для программы является фамилия+имя, поэтому даже парится по этому поводу не стоит. Уникальность логина - для меня аксиома (по крайней мере до момента, пока я не начну писать какую-нибудь социальную сеть))) )

Добавлено через 3 минуты
Цитата Сообщение от wizard41 Посмотреть сообщение
При закрытии, он допишется в файл.
Реализовано с помощью кнопки "Сохранить". Добавленная/исправленная информация дописывается в файл при нажатии (ну, естественно при соблюдении всех условий: пользователя не существует, пароли совпадают), после срабатывает метод Refresh (как я уже выше писала) и пользователь полноценно попадает в программу
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
20.01.2022, 10:45
Цитата Сообщение от Kyra90 Посмотреть сообщение
Уникальность логина - для меня аксиома
Поддерживаю "двумя руками", например, в качестве логина в соц. сетях выступает номер телефона или e-mail, и это уникальные идентификаторы, если что.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
20.01.2022, 10:53
Kyra90, ashsvis, кхм.... Ладно. Пусть будет по вашему. Но все равно вы меня немного не поняли, наверное. Не важно.
Kyra90, так, значит у вас комбоксы, ага... Я понял.
Цитата Сообщение от Kyra90 Посмотреть сообщение
У меня есть метод Refresh, который перечитывает данные из файла.
А это вот зря. По идее, содержимое файла считывается при открытии приложения, далее работаем с памятью, ну и или принудительно сохраняем в файл при нажатии кнопки или при выходе из приложения. Незачем при всяком случае обращаться к файлу. Ну это мое мнение.
Цитата Сообщение от Kyra90 Посмотреть сообщение
и пользователь полноценно попадает в программу
... Ай-яй. С проработкой логики надо быть аккуратнее )
0
 Аватар для Kyra90
232 / 153 / 85
Регистрация: 06.10.2020
Сообщений: 468
20.01.2022, 10:57  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
По идее, содержимое файла считывается при открытии приложения, далее работаем с памятью,
В данном случае считаю это не целесообразным. так как создание/изменение пользователя в мой программе это единоразовая операция, и не является ключевой в программе. Нет смысла хранить в памяти созданного пользователя всю сессию. К тому же, что случится с пользователем, если, допустим, программа выпадет по ошибке, зависнет комп или пропадет свет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.01.2022, 10:57

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
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