Initial commit
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
|
||||
|
||||
|
||||
CREATE TABLE person_account(
|
||||
person_id int NOT NULL UNIQUE REFERENCES person,
|
||||
login varchar(60) NOT NULL,
|
||||
password varchar NOT NULL,
|
||||
CONSTRAINT empty_login CHECK (trim(login) <> '')
|
||||
);
|
||||
|
||||
CREATE OR REPLACE FUNCTION check_password(_password varchar(60))
|
||||
RETURNS void AS
|
||||
$BODY$
|
||||
BEGIN
|
||||
IF (trim(_password) = '')
|
||||
THEN
|
||||
RAISE EXCEPTION 'Пароль не может быть пустым!';
|
||||
END IF;
|
||||
|
||||
IF (trim(_password) <> _password)
|
||||
THEN
|
||||
RAISE EXCEPTION 'Пароль должен быть без пробелов!';
|
||||
END IF;
|
||||
|
||||
IF (length(_password) < 8)
|
||||
THEN
|
||||
RAISE EXCEPTION 'Пароль должен иметь больше 8 знаков!';
|
||||
END IF;
|
||||
|
||||
IF (lower(_password) = _password OR _password !~ '[0-9]')
|
||||
THEN
|
||||
RAISE EXCEPTION 'Пароль должен иметь прописные и заглавные буквы, а также цифры!';
|
||||
END IF;
|
||||
|
||||
IF ((SELECT COUNT(*) AS letter_count
|
||||
FROM ( SELECT regexp_split_to_table(_password, '') AS letter) AS letters
|
||||
GROUP BY letter
|
||||
ORDER BY letter
|
||||
LIMIT 1) >= length(_password)/2)
|
||||
THEN
|
||||
RAISE EXCEPTION 'Пароль не должен иметь больше половины одинаковых символов!';
|
||||
END IF;
|
||||
END
|
||||
$BODY$
|
||||
LANGUAGE plpgsql VOLATILE;
|
||||
|
||||
CREATE OR REPLACE FUNCTION create_person_account()
|
||||
RETURNS TRIGGER AS $$
|
||||
DECLARE
|
||||
role int;
|
||||
BEGIN
|
||||
PERFORM check_password(NEW.password);
|
||||
NEW.password := crypt(NEW.password, gen_salt('bf'));
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Создаем триггер
|
||||
CREATE TRIGGER trigger_create_account
|
||||
BEFORE INSERT ON person_account
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION create_person_account();
|
||||
|
||||
CREATE OR REPLACE FUNCTION check_enter_in_person_account(_login varchar, _password varchar)
|
||||
RETURNS int AS $$
|
||||
DECLARE
|
||||
_hash_password varchar := null;
|
||||
_person_id int;
|
||||
BEGIN
|
||||
-- Получаем person_id и проверяем авторизацию
|
||||
SELECT pa.person_id, pa.password
|
||||
INTO _person_id, _hash_password
|
||||
FROM person_account pa
|
||||
WHERE pa.login = _login
|
||||
AND pa.password = crypt(_password, pa.password);
|
||||
|
||||
-- Если запись не найдена
|
||||
IF _person_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Неверный логин или пароль!';
|
||||
END IF;
|
||||
|
||||
RETURN _person_id;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
INSERT INTO person_account (person_id, login, password)
|
||||
VALUES (1, 'Иванов Н.В.', 'Иванов123'),
|
||||
(2, 'Сидоров В.А.', 'Сидоров123'),
|
||||
(3, 'Кузнецов П.С.', 'Кузнецов123'),
|
||||
(4, 'Петров И.В.', 'Петров123'),
|
||||
(5, 'Иванов Н.А.', 'Иванов123'),
|
||||
(6, 'Иванов Е.С.', 'Иванов123');
|
||||
Reference in New Issue
Block a user