Консультация № 189792
18.09.2016, 21:36
0.00 руб.
19.09.2016, 15:25
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом: На Pascal ABC.Net
Как сделать в этом коде, что бы на каждом пользователе задавался разный пароль при входе?
[code lang=pascal h=200]program Bezopasnost';
uses crt;
type TRights=set of (RRead,RWrite,RGrant); { Виды прав }
const FullRights: TRights=[RRead,RWrite,RGrant]; { Полные права }
MaxObj=5; { Число объектов }
MaxUsers=6; { Число пользователей }
MaxPass=32;{сам пароль}
var Users: array [1..MaxUsers] of string[20]; { Имена пользователей }
UserRights: array [1..MaxObj,1..6] of TRights; { Права пользователей }
i,j,CurrUser: byte; { Счетчики, номер текущего пользователя }
SCommand: string[20]; { Текущая команда или имя пользователя }
tmpRight: TRights; { Временное хранилище типа передаваемых прав }

begin
clrscr;
{ Инициализируем пользователей }
Users[1]:='Оксана';
Users[2]:='Женя';
Users[3]:='Игорь';
Users[4]:='Настя';
Users[5]:='Гость1';
Users[6]:='Гость2';
{ Инициализируем права - первый пользователь - админ }
randomize;
for i:=1 to MaxObj do begin
UserRights[i,1]:=FullRights;
for j:=2 to MaxUsers do begin
UserRights[i,j]:=[];
if random(2)=1 then UserRights[i,j]:=UserRights[i,j]+[RRead];
if random(2)=1 then UserRights[i,j]:=UserRights[i,j]+[RWrite];
if random(2)=1 then UserRights[i,j]:=UserRights[i,j]+[RGrant];
end;
end;
{ Главный цикл - по пользователям }
CurrUser:=0;
repeat
write('Имя пользователя: ');
readln(SCommand);

end;
{ Проверяем выход}
if SCommand='выход' then break;
{ Проверяем вход пользователя }
for i:=1 to MaxUsers do
if Users[i]=SCommand then begin
CurrUser:=i;
break;
end;
if CurrUser=0 then
writeln('Неправильное имя пользователя!')
else begin { Успешный вход }
{ Выводим права }
for i:=1 to MaxObj do begin
write('Объект ',i,': ');
if UserRights[i,CurrUser]=[] then { Нет прав }
write('Запрет')
else if UserRights[i,CurrUser]=FullRights then { Полные права }
write('Полные права')
else begin
if RRead in UserRights[i,CurrUser] then write('Чтение, ');
if RWrite in UserRights[i,CurrUser] then write('Запись, ');
if RGrant in UserRights[i,CurrUser] then write('Передача, ');
GotoXY(WhereX-2,WhereY);
write(' ');
end;
writeln;
end;
{ Цикл по командам пользователя }
repeat
write('Жду ваших указаний >');
readln(SCommand);
{ Проверяем команды }
if SCommand='выход' then break { Выход }
else if (SCommand='чтение') or (SCommand='запись') or (SCommand='передача') then begin
write('Над каким объектом производится операция? ');
readln(j);
{ Проверим диапазон }
if j>MaxObj then writeln('Нет такого объекта') else
begin
{ Команда read }
if SCommand='чтение' then
if RRead in UserRights[j,CurrUser] then
writeln('Операция прошла успешно') else writeln('Отказ. Нет прав');
{ Команда write }
if SCommand='запись' then
if RWrite in UserRights[j,CurrUser] then
writeln('Операция прошла успешно') else writeln('Отказ. Нет прав');
{ Команда grant }
if SCommand='передача' then
if RGrant in UserRights[j,CurrUser] then begin
write('Какое право передается? ');
readln(SCommand);
{ Проверим команды }
if (SCommand='чтение') or (SCommand='запись') or (SCommand='передача') then begin
{ Запомним передаваемое право }
if SCommand='чтение' then tmpRight:=[RRead] else
if SCommand='запись' then tmpRight:=[RWrite] else tmpRight:=[RGrant];
write('Какому пользователю передается право? ');
readln(SCommand);
{ Найдем пользователя }
i:=1;
while i<=MaxUsers do begin
if Users[i]=SCommand then break;
inc(i);
end;
{ Если пользователь не найден выведем сообщение }
if i>MaxUsers then
writeln('Неправильное имя пользователя!')
else begin{ Иначе передадим права }
UserRights[j,i]:=UserRights[j,i]+tmpRight;
end;
end else
writeln('Неправильно задан вид прав');
end else writeln('Отказ. Нет прав');
end;
end else
writeln('Неверная команда');
until false;
CurrUser:=0;
end;
until false;
{ Завершение работы }
writeln('Пока!');
end.[/code]

Обсуждение

давно
Старший Модератор
31795
6196
20.09.2016, 14:13
общий
Адресаты:
Я бы "капельку" изменил подход к написанию кода:
0)пароли должны вводится пользователем и остальное вытекает отсюда.
Возможно система будет генерировать стандартный пароль и предлагать пользователю его изменить, как обычно:
введите старый пароль, введите новый, подтвердите новый.
1)использовал типизированные файлы:
[code lang=pascal h=50]TUser=record
name:string[20];
pass:string[20];{задача шифрования пароля пока не актуальна}
rigth:TRights;{тут использовал бы строку, для каждого права доступа свое словосочитание}
end;[/code]
Лень вводить каждый раз одно и тоже.

2)использовал списки и динамическую память, с контролем изменялся ли элемент в памяти(новый юзер или пароль и т.д.), если хоть один элемент изменился, записывать в файл.
3)админ нарезает права пользователям самостоятельно.
4)соответсвенно структура кода будет такая:
загрузить файл пользователей
главный цикл команд:
-новый пользователь;
-сменить пароль;
-доступ к каким либо данным;
-утановить права пользователю(для админа);
-выход и запись данных пользователей в файл.
Каждая команда реализуется ввиде подпрограммы. Это позволит разширять проэкт в будущем.

ps:непонятно что есть объекты и зачем они нужны, если можно то само задание в студию.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
23.09.2016, 16:55
общий
это ответ
Здравствуйте, zasulskaya.oksana!

Код паскаль ВР7.0, как-то так:
[code lang=pascal h=200]uses
Crt;
type
tData=record
name:string;
pass:string;
data:string;
end;
pUser=^tUser;
tUser=record
data:tData;
next:pUser;
end;
var
a:tData;{переменная для записи чтения данных и текущий пользователь}
b:string;{строка для ввода данных}
c:char;{символ для меню}
f:file of tData;{}
head{},temp{}:pUser;{}
function GetData(z:string):string;
begin
write(z);
readln(z);
GetData:=z;
end;
procedure ShowMenu;
begin
writeln;
write('current user ');
if a.name='' then
begin
writeln('no pressent');
writeln('1 - login');
writeln('2 - register');
writeln('0 - exit');
end
else
begin
writeln(a.name);
writeln('1 - view user');
writeln('2 - change password');
writeln('0 - log off');
end;
end;
procedure LogOffUser;
begin
a.name:='';
end;
procedure LoginUser;
begin
a.name:=GetData('Enter user name:');
a.pass:=GetData('Enter you password:');
temp:=head;
while(temp<>nil)and(a.name<>temp^.data.name)do
temp:=temp^.next;
if(temp^.data.name=a.name)and(temp^.data.pass=a.pass)then
a.data:=temp^.data.data
else
begin
writeln('wrong user name');
a.name:='';
end;
end;
procedure NewUser;
begin
b:='Enter New User Name:';
repeat
temp:=head;
a.name:=GetData(b);
while(temp<>nil)and(a.name<>temp^.data.name)do
temp:=temp^.next;
b:='User pressent in system, Enter New User Name:';
until temp=nil;
repeat
a.pass:=GetData('Enter you password:');
until a.pass=GetData('Confirm you password:');
new(temp);
temp^.data.name:=a.name;
temp^.data.pass:=a.pass;
temp^.data.data:='arwd';
temp^.next:=head;
head:=temp;
end;
procedure ExitProgram;
begin
c:='e';
end;
procedure ViewUser;
begin
temp:=head;
while temp<>nil do
begin
writeln('user:',temp^.data.name,' acess:',temp^.data.data);
temp:=temp^.next;
end;
end;
procedure ChangePass;
begin
repeat
until a.pass=GetData('Enter you old password:');
repeat
a.pass:=GetData('Enter you password:');
until a.pass=GetData('Confirm you password:');
end;
begin
assign(f,'dataUser.dat');
head:=nil;
reset(f);
while not(eof(f)) do
begin
read(f,a);
new(temp);
temp^.data.name:=a.name;
temp^.data.pass:=a.pass;
temp^.data.data:=a.data;
temp^.next:=head;
head:=temp;
end;
close(f);
{begin main loop}
ClrScr;
a.name:='';
repeat
ShowMenu;
c:=ReadKey;
if c in ['0'..'2'] then
begin
if a.Name='' then
begin
case c of{}
'0':ExitProgram;
'1':LoginUser;
'2':NewUser;
end;
end
else
begin
case c of{}
'0':LogOffUser;
'1':ViewUser;
'2':ChangePass;
end;
end
end
else c:='z';
writeln('press any key ...');
ReadKey;
until c='e';
{end main loop}
rewrite(f);{}
while head<>nil do
begin
temp:=head;
head:=head^.next;
a.name:=temp^.data.name;
a.pass:=temp^.data.pass;
a.data:=temp^.data.data;
write(f,a);
dispose(temp);
end;
close(f);
end.[/code]
Перед запуском нужно создать пустой файл dataUser.dat.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
23.09.2016, 22:27
общий
Адресаты:
Добавил админа:
[code lang=pascal h=200]uses
Crt;
const
AllAcess:string='arwd';
type
tData=record
name:string;
pass:string;
data:string;
end;
pUser=^tUser;
tUser=record
data:tData;
next:pUser;
last:pUser;
end;
var
a:tData;
b:string;
c:char;
f:file of tData;
head,temp:pUser;
function GetData(z:string):string;
var
y:string;
begin
repeat
write(z);
readln(y);
until length(y)>0;
GetData:=y;
end;
function FindUser(z:string):pUser;
begin
temp:=head;
while(temp<>nil)and(z<>temp^.data.name)do temp:=temp^.next;
FindUser:=temp;
end;
procedure ShowMenu;
begin
writeln;
write('current user ');
if a.name='' then
begin
writeln('no pressent in system');
writeln('0 - exit');
writeln('1 - login');
writeln('2 - register');
end
else
begin
writeln(a.name);
writeln('0 - log off');
writeln('1 - view user');
writeln('2 - change password');
if pos('a',a.data)>0 then writeln('3 - delete user');
if pos('a',a.data)>0 then writeln('4 - change acess user');
end;
end;
procedure LogOffUser;
begin
a.name:='';
end;
procedure LoginUser;
begin
a.name:=GetData('Enter User Name:');
a.pass:=GetData('Enter password:');
temp:=FindUser(a.name);
if(temp^.data.name=a.name)and(temp^.data.pass=a.pass)then
a.data:=temp^.data.data
else
begin
writeln('wrong user name');
a.name:='';
end;
end;
procedure NewUser;
begin
b:='Enter New User Name:';
repeat
a.name:=GetData(b);
temp:=FindUser(a.name);
b:='User pressent in system, Enter New User Name:';
until temp=nil;
repeat
a.pass:=GetData('Enter password:');
until a.pass=GetData('Confirm password:');
new(temp);
temp^.data.name:=a.name;
temp^.data.pass:=a.pass;
temp^.data.data:=AllAcess;
temp^.next:=head;
head:=temp;
end;
procedure ExitProgram;
begin
c:='e';
end;
procedure ViewUser;
begin
temp:=head;
while temp<>nil do
begin
writeln('user:',temp^.data.name,' acess:',temp^.data.data);
temp:=temp^.next;
end;
end;
procedure ChangePass;
begin
repeat
until a.pass=GetData('Enter you old password:');
repeat
a.pass:=GetData('Enter you password:');
until a.pass=GetData('Confirm you password:');
end;
procedure KillUser;
var
z:pUser;
begin
b:=GetData('Enter User Name:');
temp:=FindUser(b);
if temp<>nil then
begin
z:=temp;
temp:=temp^.last;
temp^.next:=z^.next;
temp^.next^.last:=temp;
end
else
writeln('wrong user name');
end;
procedure ChangeAcess;
begin
b:=GetData('Enter User Name:');
temp:=FindUser(b);
if temp<>nil then
begin
write('user ',temp^.data.name,' heave acess ',temp^.data.data);
temp^.data.data:=GetData(' set new acess:');
end
else
writeln('wrong user name');
end;
begin
assign(f,'dataUser.dat');
head:=nil;
reset(f);
while not(eof(f)) do
begin
read(f,a);
new(temp);
temp^.data.name:=a.name;
temp^.data.pass:=a.pass;
temp^.data.data:=a.data;
temp^.next:=head;
head^.last:=temp;
head:=temp;
end;
close(f);
{begin main loop}
ClrScr;
a.name:='';
repeat
ShowMenu;
c:=ReadKey;
if c in ['0'..'9'] then
begin
if a.Name='' then
begin
case c of
'0':ExitProgram;
'1':LoginUser;
'2':NewUser;
end;
end
else
begin
case c of
'0':LogOffUser;
'1':ViewUser;
'2':ChangePass;
'3':if pos('a',a.data)>0then KillUser;
'4':if pos('a',a.data)>0then ChangeAcess;
end;
end
end
else c:='z';
writeln('press any key ...');
ReadKey;
until c='e';
{end main loop}
rewrite(f);
while head<>nil do
begin
temp:=head;
head:=head^.next;
a.name:=temp^.data.name;
a.pass:=temp^.data.pass;
a.data:=temp^.data.data;
write(f,a);
dispose(temp);
end;
close(f);
end.[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа