Создание системы регистрации в программе - C#
Формулировка задачи:
Захотелось мне написать/дополнить статью про создание системы авторизации в программе при помощи xml файла. Если статья написана не в том разделе прошу перенести.
Делать мы всё будем на одной форме для простоты обучения. (Самостоятельно вы сможете разделить регистрацию и вход по разным формам). Или же сделать например скрытие одних элементов и появление других черед Panel.
1) Для начала создадим новый проект "Приложение Windows Forms".
2) На данную нам Form1 добавим следующие элементы:
На форме расположены:Добавим пространства имён:
Для того что бы просто было использовать функции Xml и системы файлов.
5) Так же добавим "публичную" переменную defpath для простоты изменения пути к Xml файлу в дальнейшем.
Как видно ей присвоено значение имени файла, но вы можете прописать путь например "C:/users.xml" для того чтобы данный файл создавался в нужной вам папке, а не рядом с программой.
6) Создадим событие создания xml файла:
7) В Form1_load который мы попадали ранее, (для того что бы создать xml файл если его ещё нет) добавим:
8) Теперь нам необходимо добавить событие для нахождения свободного ID пользователя. Расскажу о нём чуть позже:
9) Раз уж мы теперь можем вычислить ID нового пользователя то можно добавить событие регистрации нового пользователя:
О нём я расскажу немного подробнее. Мы снова проверяем есть ли xml файл (простое избегание ошибок - вдруг файл был удалён во время работы программы). В xml добавляем нового пользователя с номером (номер мы получаем из события созданного ранее).
10) Далее вернёмся в конструктор и добавим событие для кнопки регистрации (двойной щелчок по ней в конструкторе):
Тут мы на всякий случай проверяем не пусты ли текстовые поля с логином и паролем.
Можно попробовать запустить программу и протестировать запись xml файла, он должен получится таким (я вводил сначала пользователя yura097 с паролем 12345, а затем пользователя admin с паролем parol):
Как мы видим программа создала 2 записи с разными ID и записала в них наши данные.
11) Если у вас всё получилось то можно приступить к созданию события входа:
В данном событии мы сравниваем наши сточки из полей логина и пароля с входа со всеми пользователями в нашем xml файле. Если пользователь найдет то будет выведено сообщение "Успешный вход". Если же пользователь не найден и список пользователей закончен то будет выведено сообщение "Неверный логин и пароль". Конечно же вместо сообщения "Успешный вход" можно открывать другую форму и так далее.
12) Конечно же нужно не забыть вернуться в конструктор и создать событие для кнопки входа:
Собственно всё. На самом "простом уровне" наша система для входа в программу готова.
Вот на всякий случай полный код программы:
Конечно же тут нет например "запоминания пароля" или "удаления пользователя". Так же отсутствует какое либо шифрование. Но возможно я расскажу вам об этом в дальнейшем. Да и в принципе вы сможете сделать всё это сами.
Для определённой красоты можно элементы входа и регистрации поместить на панели и сделать дополнительно кнопку "регистрации", а на панели с регистрацией "отмена" и "ок". Ну в общем это всё ваша фантазия.
Вы можете для красоты в текстовых полях пароля включить свойство UseSystemPasswordChar для скрытия пароля при вводе.
Вообщем пора остановиться ибо "добавлять" можно бесконечно.
Спасибо за прочтение, об ошибках конечно же сообщайте. Так же возможно о способах оптимизации.
- Текстовые поля loginenbox и passenbox для входа
- Текстовые поля loginregbox и passregbox для регистрации.
- Так же для понятности 4 label (логин и пароль)x2.
- Кнопки enterbutton и registerbutton для входа и регистрации соответственно.
using System;
using System.IO; using System.Xml;
public string defpath = "users.xml";
private void CreateXMLDocument(string filepath) //создание xml файла
{
XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF32);
xtw.WriteStartDocument();
xtw.WriteStartElement("users");
xtw.WriteEndDocument();
xtw.Close();
}private void Form1_Load(object sender, EventArgs e)
{
if (!File.Exists(defpath)) CreateXMLDocument(defpath);
}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("Введите имя пользователя и пароль");
}<?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>
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);
}
}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);
}
}
}
}Решение задачи: «Создание системы регистрации в программе»
textual
Листинг программы
<TextBox Name="PasswordTb" Margin="5" HorizontalAlignment="Center" MinWidth="200"/>