db auth
This commit is contained in:
parent
5cb2e1483f
commit
4592672dce
100
code/python/db_connect/authorization.py
Normal file
100
code/python/db_connect/authorization.py
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
import uuid
|
||||||
|
import csv
|
||||||
|
# Генерация случайного UUID (версия 4)
|
||||||
|
import hashlib
|
||||||
|
import database.database as database
|
||||||
|
random_uuid = uuid.uuid4()
|
||||||
|
DB = 'password_db.csv'
|
||||||
|
|
||||||
|
|
||||||
|
class UserFoundException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class PasswordWrongException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_db_password():
|
||||||
|
"""Читаем файл паролей в список"""
|
||||||
|
users = [ ]
|
||||||
|
with open(DB, newline='') as csvfile:
|
||||||
|
spamreader = csv.reader(csvfile, delimiter=':')
|
||||||
|
for row in spamreader:
|
||||||
|
users.append(row)
|
||||||
|
return users
|
||||||
|
|
||||||
|
|
||||||
|
def checkUser(login: str) -> bool:
|
||||||
|
"""Проверяем пользователя в БД"""
|
||||||
|
db = get_db_password()
|
||||||
|
for row in db:
|
||||||
|
if login == row[1]:
|
||||||
|
return row
|
||||||
|
# raise UserFoundException("Такой пользователь существует!")
|
||||||
|
|
||||||
|
# try:
|
||||||
|
# checkUser('user')
|
||||||
|
# except UserFoundException as e:
|
||||||
|
# print(e)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_md5(data):
|
||||||
|
"""Вычисляет MD5-хеш для данных."""
|
||||||
|
md5_hash = hashlib.md5(data.encode('utf-8')).hexdigest()
|
||||||
|
return md5_hash
|
||||||
|
|
||||||
|
|
||||||
|
def login(username, passwd):
|
||||||
|
|
||||||
|
_l , _p = database.get_list_account(username)
|
||||||
|
|
||||||
|
# user = checkUser(username)
|
||||||
|
# print(user[2])
|
||||||
|
passwd_md5 = calculate_md5(str(passwd))
|
||||||
|
|
||||||
|
# print(passwd_md5)
|
||||||
|
isRight = False if (_p == passwd_md5) else True
|
||||||
|
if isRight:
|
||||||
|
raise PasswordWrongException
|
||||||
|
else:
|
||||||
|
print("Пользователь авторизован")
|
||||||
|
|
||||||
|
# try:
|
||||||
|
# checkUser('user')
|
||||||
|
# except UserFoundException as e:
|
||||||
|
# print(e)
|
||||||
|
# except PasswordWrongException as e:
|
||||||
|
# print(e)
|
||||||
|
|
||||||
|
# login('oper', 123)
|
||||||
|
# exit(0)
|
||||||
|
|
||||||
|
def logout(username):
|
||||||
|
#todo: Сделать флаг выхода из системы
|
||||||
|
pass
|
||||||
|
|
||||||
|
def delete_user(username):
|
||||||
|
#todo: Дописать удаление пользователя
|
||||||
|
pass
|
||||||
|
|
||||||
|
def registration(login, passwd, rep_passwd):
|
||||||
|
"""Регистрация пользователей."""
|
||||||
|
|
||||||
|
if passwd == rep_passwd:
|
||||||
|
passwd_md5 = calculate_md5(passwd)
|
||||||
|
#print(f"MD5-хеш для '{passwd}': {passwd_md5}")
|
||||||
|
str = f"{random_uuid}:{login}:{passwd_md5}\n"
|
||||||
|
with open("password_db.csv", "a+") as fd:
|
||||||
|
fd.write(str)
|
||||||
|
|
||||||
|
if not database.add_account(login, passwd_md5):
|
||||||
|
print("Запись добавлена")
|
||||||
|
|
||||||
|
|
||||||
|
_login = input("login:")
|
||||||
|
_passwd = input("passwd:")
|
||||||
|
_rep_passwd = input("rep_passwd:")
|
||||||
|
|
||||||
|
|
||||||
|
#registration( _login, _passwd,_rep_passwd )
|
||||||
|
login( _login, _passwd )
|
62
code/python/db_connect/database/database.py
Normal file
62
code/python/db_connect/database/database.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import psycopg2
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn = psycopg2.connect("dbname='auth' user='auth' port='5432' host='localhost' password='123'")
|
||||||
|
except:
|
||||||
|
print("I am unable to connect to the database")
|
||||||
|
|
||||||
|
def add_account(login, passwd):
|
||||||
|
|
||||||
|
SQL_INSERT_ACCOUNT = f"""INSERT INTO account
|
||||||
|
(login, pswd, is_block, dt_create, "token", "refresh", dt_)
|
||||||
|
VALUES('{login}', '{passwd}', false, now(), '', '', now()); """
|
||||||
|
|
||||||
|
with conn.cursor() as curs:
|
||||||
|
try:
|
||||||
|
# simple single row system query
|
||||||
|
# conn.start()
|
||||||
|
# print(dir(conn))
|
||||||
|
curs.execute(SQL_INSERT_ACCOUNT)
|
||||||
|
conn.commit()
|
||||||
|
# returns a single row as a tuple
|
||||||
|
#single_row = curs.fetchone()
|
||||||
|
|
||||||
|
# use an f-string to print the single tuple returned
|
||||||
|
#print(f"{single_row}")
|
||||||
|
|
||||||
|
# simple multi row system query
|
||||||
|
# curs.execute("SELECT query, backend_type FROM pg_stat_activity")
|
||||||
|
|
||||||
|
# a default install should include this query and some backend workers
|
||||||
|
# use the * unpack operator to print many_rows which is a Python list
|
||||||
|
|
||||||
|
# a more robust way of handling errors
|
||||||
|
except (Exception, psycopg2.DatabaseError) as error:
|
||||||
|
print(error)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
curs.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_list_account(_login):
|
||||||
|
SQL_SELECT_ACCOUNT = f"""SELECT login, pswd
|
||||||
|
FROM account
|
||||||
|
WHERE login like '{_login}'"""
|
||||||
|
|
||||||
|
with conn.cursor() as curs:
|
||||||
|
try:
|
||||||
|
|
||||||
|
curs.execute(SQL_SELECT_ACCOUNT)
|
||||||
|
# returns a single row as a tuple
|
||||||
|
single_row = curs.fetchone()
|
||||||
|
print(f"{single_row}")
|
||||||
|
return single_row
|
||||||
|
|
||||||
|
except (Exception, psycopg2.DatabaseError) as error:
|
||||||
|
print(error)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
curs.close()
|
||||||
|
conn.close()
|
69
code/python/db_connect/sql/db.sql
Normal file
69
code/python/db_connect/sql/db.sql
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
CREATE TABLE "account" (
|
||||||
|
"id" SERIAL PRIMARY KEY,
|
||||||
|
"login" VARCHAR(10) NOT NULL,
|
||||||
|
"pswd" VARCHAR(255) NOT NULL,
|
||||||
|
"is_block" BOOLEAN,
|
||||||
|
"dt_create" DATE,
|
||||||
|
"token" VARCHAR(255) NOT NULL,
|
||||||
|
"refresh" VARCHAR(255) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "profile" (
|
||||||
|
"id" SERIAL PRIMARY KEY,
|
||||||
|
"id_account" INTEGER NOT NULL,
|
||||||
|
"name" VARCHAR(100) NOT NULL,
|
||||||
|
"surname" VARCHAR(100) NOT NULL,
|
||||||
|
"sex" BOOLEAN,
|
||||||
|
"dt_birth" TIMESTAMP
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX "idx_profile__id_account" ON "profile" ("id_account");
|
||||||
|
|
||||||
|
ALTER TABLE "profile" ADD CONSTRAINT "fk_profile__id_account" FOREIGN KEY ("id_account") REFERENCES "account" ("id");
|
||||||
|
|
||||||
|
CREATE TABLE "role" (
|
||||||
|
"id" SERIAL PRIMARY KEY,
|
||||||
|
"name" TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "role_account" (
|
||||||
|
"id_roles" INTEGER NOT NULL,
|
||||||
|
"acconts" INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY ("id_roles", "acconts")
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX "idx_role_account__acconts" ON "role_account" ("acconts");
|
||||||
|
|
||||||
|
ALTER TABLE "role_account" ADD CONSTRAINT "fk_role_account__acconts" FOREIGN KEY ("acconts") REFERENCES "account" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE "role_account" ADD CONSTRAINT "fk_role_account__id_roles" FOREIGN KEY ("id_roles") REFERENCES "role" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
CREATE TABLE "rules" (
|
||||||
|
"id" SERIAL PRIMARY KEY,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"body" JSONB NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE "role_rules" (
|
||||||
|
"id_roles" INTEGER NOT NULL,
|
||||||
|
"id_rules" INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY ("id_roles", "id_rules")
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX "idx_role_rules__id_rules" ON "role_rules" ("id_rules");
|
||||||
|
|
||||||
|
ALTER TABLE "role_rules" ADD CONSTRAINT "fk_role_rules__id_roles" FOREIGN KEY ("id_roles") REFERENCES "role" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
ALTER TABLE "role_rules" ADD CONSTRAINT "fk_role_rules__id_rules" FOREIGN KEY ("id_rules") REFERENCES "rules" ("id") ON DELETE CASCADE;
|
||||||
|
|
||||||
|
CREATE TABLE "rules_rules" (
|
||||||
|
"rules" INTEGER NOT NULL,
|
||||||
|
"rules_2" INTEGER NOT NULL,
|
||||||
|
PRIMARY KEY ("rules", "rules_2")
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX "idx_rules_rules" ON "rules_rules" ("rules_2");
|
||||||
|
|
||||||
|
ALTER TABLE "rules_rules" ADD CONSTRAINT "fk_rules_rules__rules" FOREIGN KEY ("rules") REFERENCES "rules" ("id");
|
||||||
|
|
||||||
|
ALTER TABLE "rules_rules" ADD CONSTRAINT "fk_rules_rules__rules_2" FOREIGN KEY ("rules_2") REFERENCES "rules" ("id")
|
68
code/python/db_connect/sql/select.sql
Normal file
68
code/python/db_connect/sql/select.sql
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
-- Алиасы вычесление в столбцах, применение функций
|
||||||
|
select a.id, a.login || ' ' || a.login login, 2+2 as summ_
|
||||||
|
from account a
|
||||||
|
where ( id in (1,2) and login ilike 'BOB')
|
||||||
|
|
||||||
|
|
||||||
|
--inner join с конструкцией CASE
|
||||||
|
select a.login, p."name" || ' ' || p.surname as fio,
|
||||||
|
to_char(p.dt_birth, 'DD.MM.YYYY') dt_birth,
|
||||||
|
CASE
|
||||||
|
when p.sex THEN 'Девушка'
|
||||||
|
ELSE 'Мужчина'
|
||||||
|
END as sex, r."name"
|
||||||
|
from account a, profile p, role_account ra ,"role" r
|
||||||
|
where a.id = p.id_account
|
||||||
|
and ra.acconts = a.id
|
||||||
|
and ra.roles = r.id
|
||||||
|
|
||||||
|
|
||||||
|
-- LEFT JOIN получение при запросе пересечение с NULL строками
|
||||||
|
-- Запрос представлен в виде таблицы
|
||||||
|
select * from
|
||||||
|
( SELECT a.login login, p."name"
|
||||||
|
FROM account a
|
||||||
|
LEFT JOIN profile p ON a.id = p.id_account
|
||||||
|
WHERE p."name" is null) null_acc
|
||||||
|
where null_acc.login not like 'bob' ;
|
||||||
|
|
||||||
|
|
||||||
|
-- Создание представления в БД на базе
|
||||||
|
create view v_account as
|
||||||
|
SELECT a.login
|
||||||
|
FROM account a
|
||||||
|
where NOT EXISTS (SELECT * FROM profile p
|
||||||
|
WHERE p.id_account = a.id )
|
||||||
|
select * from v_account va;
|
||||||
|
|
||||||
|
|
||||||
|
-- Объединение запросов
|
||||||
|
union all
|
||||||
|
SELECT a.login
|
||||||
|
FROM account a
|
||||||
|
where NOT EXISTS (SELECT * FROM profile p
|
||||||
|
WHERE p.id_account = a.id )
|
||||||
|
|
||||||
|
|
||||||
|
-- Запросы с группировкой group by, having
|
||||||
|
select ra.roles, count(ra.roles)
|
||||||
|
from account a, role_account ra
|
||||||
|
where a.id = ra.acconts
|
||||||
|
group by ra.roles
|
||||||
|
having count(ra.roles) > 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user