Создание системы регистрации в программе - C#

Узнай цену своей работы

Формулировка задачи:

Захотелось мне написать/дополнить статью про создание системы авторизации в программе при помощи xml файла. Если статья написана не в том разделе прошу перенести. Делать мы всё будем на одной форме для простоты обучения. (Самостоятельно вы сможете разделить регистрацию и вход по разным формам). Или же сделать например скрытие одних элементов и появление других черед Panel. 1) Для начала создадим новый проект "Приложение Windows Forms". 2) На данную нам Form1 добавим следующие элементы: На форме расположены:
  1. Текстовые поля loginenbox и passenbox для входа
  2. Текстовые поля loginregbox и passregbox для регистрации.
  3. Так же для понятности 4 label (логин и пароль)x2.
  4. Кнопки enterbutton и registerbutton для входа и регистрации соответственно.
3) Щелкнем два раза по конструктору формы откроется файл кода программы и отправит нас в событие Form1_Load. 4) Но пока мы оставим его и перейдём в начало файла и после:
using System;
Добавим пространства имён:
using System.IO;
using System.Xml;
Для того что бы просто было использовать функции Xml и системы файлов. 5) Так же добавим "публичную" переменную defpath для простоты изменения пути к Xml файлу в дальнейшем.
public string defpath = "users.xml";
Как видно ей присвоено значение имени файла, но вы можете прописать путь например "C:/users.xml" для того чтобы данный файл создавался в нужной вам папке, а не рядом с программой. 6) Создадим событие создания xml файла:
private void CreateXMLDocument(string filepath) //создание xml файла
{
    XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32); 
    xtw.WriteStartDocument();
    xtw.WriteStartElement("users");
    xtw.WriteEndDocument();
    xtw.Close();
}
7) В Form1_load который мы попадали ранее, (для того что бы создать xml файл если его ещё нет) добавим:
private void Form1_Load(object sender, EventArgs e)
{
     if (!File.Exists(defpath)) CreateXMLDocument(defpath);
}
8) Теперь нам необходимо добавить событие для нахождения свободного ID пользователя. Расскажу о нём чуть позже:
private string MaxID(string filepath) //вычисление max id
{
    List<int> idList = new List<int>();
    int id;
    XmlDocument xd = new XmlDocument();
    FileStream fs = new FileStream(filepath, FileMode.Open);
    xd.Load(fs);
    XmlNodeList list = xd.GetElementsByTagName("user");
    if (list.Count > 0)
    {
        for (int i = 0; i < list.Count; i++)
        {
            XmlElement user = (XmlElement)xd.GetElementsByTagName("user")[i];
            id = Convert.ToInt32(user.GetAttribute("id"));
            idList.Add(id);
        }                
        int result = 0;
        foreach (int j in idList)
            if (j > result)
                result = j;
        result++; 
        fs.Close();
        return result.ToString();
    }
    else
    {
        fs.Close();
        return "1"; 
    }
}
9) Раз уж мы теперь можем вычислить ID нового пользователя то можно добавить событие регистрации нового пользователя:
        private void WriteToXMLDocument(string filepath, string name, string pwd) //добавление записи
        {
            if (!File.Exists(defpath)) CreateXMLDocument(defpath);
            string id = MaxID(filepath);
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
 
            XmlElement user = xd.CreateElement("user");
            user.SetAttribute("id", id);
 
            XmlElement login = xd.CreateElement("login");
            XmlElement pass = xd.CreateElement("password");
 
            XmlText tLogin = xd.CreateTextNode(name);
            XmlText tPassword = xd.CreateTextNode(pwd);
 
            login.AppendChild(tLogin);
            pass.AppendChild(tPassword);
 
            user.AppendChild(login);
            user.AppendChild(pass);
 
            xd.DocumentElement.AppendChild(user);
 
            fs.Close();
            xd.Save(filepath);
        }
О нём я расскажу немного подробнее. Мы снова проверяем есть ли xml файл (простое избегание ошибок - вдруг файл был удалён во время работы программы). В xml добавляем нового пользователя с номером (номер мы получаем из события созданного ранее). 10) Далее вернёмся в конструктор и добавим событие для кнопки регистрации (двойной щелчок по ней в конструкторе):
        private void registerbutton_Click(object sender, EventArgs e)
        {
            if (!(loginregbox.Text == "") & !(passregbox.Text == ""))
                WriteToXMLDocument(defpath, loginregbox.Text, passregbox.Text);
            else MessageBox.Show("Введите имя пользователя и пароль");         
        }
Тут мы на всякий случай проверяем не пусты ли текстовые поля с логином и паролем. Можно попробовать запустить программу и протестировать запись xml файла, он должен получится таким (я вводил сначала пользователя yura097 с паролем 12345, а затем пользователя admin с паролем parol):
<?xml version="1.0" encoding="utf-32"?>
<users>
  <user id="1">
    <login>yura097</login>
    <password>12345</password>
  </user>
  <user id="2">
    <login>admin</login>
    <password>parol</password>
  </user>
</users>
Как мы видим программа создала 2 записи с разными ID и записала в них наши данные. 11) Если у вас всё получилось то можно приступить к созданию события входа:
        private void ReadXMLDocument(string filepath, string loget, string passget)
        {
            string name, pwd;
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
            XmlNodeList list = xd.GetElementsByTagName("user");
            for (int i = 0; i < list.Count; i++)
            {
                XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i];
                XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i];
                name = user.InnerText;
                pwd = pass.InnerText;
                if ((loget == name) & (passget == pwd))
                {
                    MessageBox.Show("Успешный вход");
                    break;
                }
                else if (i == list.Count - 1) MessageBox.Show("Неверный логин или пароль");
            }
            fs.Close(); 
        }
В данном событии мы сравниваем наши сточки из полей логина и пароля с входа со всеми пользователями в нашем xml файле. Если пользователь найдет то будет выведено сообщение "Успешный вход". Если же пользователь не найден и список пользователей закончен то будет выведено сообщение "Неверный логин и пароль". Конечно же вместо сообщения "Успешный вход" можно открывать другую форму и так далее. 12) Конечно же нужно не забыть вернуться в конструктор и создать событие для кнопки входа:
private void enterbutton_Click(object sender, EventArgs e)
{
    if (!(loginenbox.Text == "") & !(passenbox.Text == ""))
    {
        ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text);
    }
}
Собственно всё. На самом "простом уровне" наша система для входа в программу готова. Вот на всякий случай полный код программы:
using System;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public string defpath = "users.xml";
 
        private void Form1_Load(object sender, EventArgs e)
        {
            if (!File.Exists(defpath))
                CreateXMLDocument(defpath);
        }
 
        private void CreateXMLDocument(string filepath) //создание xml при запуске
        {
            XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32);
            xtw.WriteStartDocument();
            xtw.WriteStartElement("users");
            xtw.WriteEndDocument();
            xtw.Close();
        }
 
        private string MaxID(string filepath) //вычисление max id
        {
            List<int> idList = new List<int>();
            int id;
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
            XmlNodeList list = xd.GetElementsByTagName("user");
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    XmlElement user = (XmlElement)xd.GetElementsByTagName("user")[i];
                    id = Convert.ToInt32(user.GetAttribute("id"));
                    idList.Add(id);
                }
                int result = 0;
                foreach (int j in idList)
                    if (j > result)
                        result = j;
                result++;
                fs.Close();
                return result.ToString();
            }
            else
            {
                fs.Close();
                return "1";
            }
        }
 
        private void WriteToXMLDocument(string filepath, string name, string pwd) //добавление записи
        {
            if (!File.Exists(defpath))
                CreateXMLDocument(defpath);
            string id = MaxID(filepath);
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
 
            XmlElement user = xd.CreateElement("user");
            user.SetAttribute("id", id);
 
            XmlElement login = xd.CreateElement("login");
            XmlElement pass = xd.CreateElement("password");
 
            XmlText tLogin = xd.CreateTextNode(name);
            XmlText tPassword = xd.CreateTextNode(pwd);
 
            login.AppendChild(tLogin);
            pass.AppendChild(tPassword);
 
            user.AppendChild(login);
            user.AppendChild(pass);
 
            xd.DocumentElement.AppendChild(user);
 
            fs.Close();
            xd.Save(filepath);
        }
 
        private void registerbutton_Click(object sender, EventArgs e)
        {
            if (!(loginregbox.Text == "") & !(passregbox.Text == ""))
                WriteToXMLDocument(defpath, loginregbox.Text, passregbox.Text);
            else MessageBox.Show("Введите имя пользователя и пароль");         
        }
 
        private void ReadXMLDocument(string filepath, string loget, string passget)
        {
            string name, pwd;
            XmlDocument xd = new XmlDocument();
            FileStream fs = new FileStream(filepath, FileMode.Open);
            xd.Load(fs);
            XmlNodeList list = xd.GetElementsByTagName("user");
            for (int i = 0; i < list.Count; i++)
            {
                XmlElement user = (XmlElement)xd.GetElementsByTagName("login")[i];
                XmlElement pass = (XmlElement)xd.GetElementsByTagName("password")[i];
                name = user.InnerText;
                pwd = pass.InnerText;
                if ((loget == name) & (passget == pwd))
                {
                    MessageBox.Show("Успешный вход");
                    break;
                }
                else if (i == list.Count - 1) MessageBox.Show("Неверный логин или пароль");
            }
            fs.Close();
        }
 
        private void enterbutton_Click(object sender, EventArgs e)
        {
            if (!(loginenbox.Text == "") & !(passenbox.Text == ""))
            {
                ReadXMLDocument(defpath, loginenbox.Text, passenbox.Text);
            }
        }
    }
}
Конечно же тут нет например "запоминания пароля" или "удаления пользователя". Так же отсутствует какое либо шифрование. Но возможно я расскажу вам об этом в дальнейшем. Да и в принципе вы сможете сделать всё это сами. Для определённой красоты можно элементы входа и регистрации поместить на панели и сделать дополнительно кнопку "регистрации", а на панели с регистрацией "отмена" и "ок". Ну в общем это всё ваша фантазия. Вы можете для красоты в текстовых полях пароля включить свойство UseSystemPasswordChar для скрытия пароля при вводе. Вообщем пора остановиться ибо "добавлять" можно бесконечно. Спасибо за прочтение, об ошибках конечно же сообщайте. Так же возможно о способах оптимизации.

Решение задачи: «Создание системы регистрации в программе»

textual
Листинг программы
<TextBox Name="PasswordTb" Margin="5" HorizontalAlignment="Center" MinWidth="200"/>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы