Практическое занятие № 25
Тема: Реализация авторизации по ролям
Цель работы: получить практический опыт реализации системы авторизации на основе ролей в приложении.
Приобретаемые умения и навыки: умение реализовать механизмы аутентификации пользователей.
Норма времени: 2 часа.
Оборудование: Компьютер с установленным программным обеспечением и подключенный к Internet.
Методические указания по выполнению практической работы
Использовать готовый скрипт «database.sql». Его необходимо восстановить.
Сделать схему к базе данных:
Рисунок – Схема базы данных
СОЗДАНИЕ ПРОЕКТА
Запустите Visual Studio 2022, перейдите File – Project.
Выберите Visual C#– WPF App, укажите имя проекта.
После нажатия кнопки «OK» создастся проект с пустой формой.
Создаём 2 папки:
Производим подключения базы данных, для этому подключаем модель
Переходим в SQL Server находим название соединения.
Находим свою БД
Открываем AppData:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Animation;
namespace Project1.ADO
{
internal class AppData
{
public static databaseEntities4 db = new databaseEntities4();
public static ClientAuthorization CurrentUser = null;
}
}
Разметка MainWindow.xaml:
Window x:Class="Project1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Project1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
Grid
Frame Name="MainFrame"
NavigationUIVisibility="Hidden"/
Grid
Window
MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Project1.Views;
namespace Project1
{
///
/// Логика взаимодействия для MainWindow.xaml
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
MainFrame.Navigate(new SignInPage());
}
}
}
Разметка SignInPage.xaml:
В этой разметки прописать
Page x:Class="Project1.Views.SignInPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Project1.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Title="SignInPage"
Grid Background="White"
StackPanel VerticalAlignment="Center"
Width="200"
HorizontalAlignment="Center"
TextBlock Text="Login"/
TextBox Name="TbxLogin"/
TextBlock Text="Password"/
TextBox Name="TbxPassword"/
Button Height="20"
Margin="5"
Click="Button_Click"
Content="Войти"/
StackPanel
Grid
Page
Обработчики SignInPage.xaml.сs:
Обработчик на кнопку Войти
Разметка ServicesPage.xaml:
Page x:Class="Project1.Views.ServicesPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Project1.Views"
mc:Ignorable="d"
Loaded="Page_Loaded"
d:DesignHeight="450" d:DesignWidth="800"
Title="ServicesPage"
Grid Background="White"
Grid.RowDefinitions
RowDefinition Height="60"/
RowDefinition/
RowDefinition Height="60"/
Grid.RowDefinitions
Button Height="20"
Margin="10,20,0,20"
MouseLeftButtonUp="Button_Click"
Content="Назад"
HorizontalAlignment="Left"
Width="70"/
ListView Grid.Row="1"
Name="Service_ListView"
ListView.View
GridView
GridViewColumn Header="ID" Width="50" DisplayMemberBinding="{Binding ID}"/
GridViewColumn Header="Навание" Width="200" DisplayMemberBinding="{Binding Title}"/
GridViewColumn Header="Стоимость" Width="100" DisplayMemberBinding="{Binding Cost}"/
GridViewColumn Header="Картинка" Width="100"
GridViewColumn.CellTemplate
DataTemplate
DataTemplate
GridViewColumn.CellTemplate
GridViewColumn
GridView
ListView.View
ListView
StackPanel Grid.Row="2"
HorizontalAlignment="Center"
Orientation="Horizontal"
VerticalAlignment="Center"
Button
Name="Client_Btn"
Height="24"
Margin="10, 0, 0, 0"
Click="Button_Click_3"
Content="Клиенты"
Width="150"
/
StackPanel
Grid
Page
Обработчики ServicesPage.xaml.сs:
Обработчик на кнопку Назад
Обработчик на вывод таблицы Service
Обработчик на кнопку Клиенты
Разметка DataPage.xaml:
Page x:Class="Project1.Views.DataPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Project1.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Loaded="Page_Loaded"
Title="DataPage"
Grid Background="White"
Grid.RowDefinitions
RowDefinition Height="60"/
RowDefinition/
RowDefinition Height="60"/
Grid.RowDefinitions
Button Height="20"
Margin="10,20,0,20"
Click="Button_Click"
Content="Назад"
HorizontalAlignment="Left"
Width="70"/
DataGrid Grid.Row="1"
AutoGenerateColumns="False"
Name="UsersGrid"
DataGrid.Columns
DataGridTextColumn Header="ID" Width="30" Binding="{Binding ID}"/
DataGridTextColumn Header="Имя" Width="*" Binding="{Binding FirstName}"/
DataGridTextColumn Header="Фамилия" Width="*" Binding="{Binding LastName}"/
DataGridTextColumn Header="Отчество" Width="*" Binding="{Binding Patronymic}"/
DataGridTextColumn Header="Дата рождения" Width="*" Binding="{Binding Birthday}"/
DataGridTextColumn Header="Email" Width="*" Binding="{Binding Email}"/
DataGrid.Columns
DataGrid
Grid
Page
Обработчики DataPage.xaml.сs:
Обработчик на кнопку Назад
Обработчик на вывод таблицы Client
Проверить работает ли система.
Если зайти через пользователя, то будет выведена таблица и кнопка «Клиенты» не будет
Если через администратор, то будет выведена таблица и кнопка «Клиенты» будет видна.
Контрольные вопросы:
Назовите основные роли в информационной системе?
В чем разница между аутентификацией и авторизацией?