Как использовать условие IF в хранимой процедуре? - PullRequest
0 голосов
/ 15 декабря 2018

Я использую условие для блокировки учетной записи после фиксированного количества попыток с неверным паролем.Часть обновления выглядит следующим образом:

loginAttempts (INT (1)) сначала читается из учетной записи входа

DECLARE LoginAttempts   INT(1);
UPDATE login SET 
LOGIN_ACCOUNT_STATUS = (SELECT CASE (LoginAttempts > MaxLoginAttempts) WHEN 1 THEN 'LOCKED' ELSE 'ACTIVE' END),
LOGIN_LOGIN_ATTEMPTS = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN 0 ELSE LOGIN_LOGIN_ATTEMPTS + 1 END),
LOGIN_LAST_LOGIN_DATE = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN TransactionDateTime ELSE LOGIN_LAST_LOGIN_DATE END),
LOGIN_LAST_LOGIN_LOCATION = null 
WHERE LOGIN_EMAIL = UserEmail;

Когда я установил MaxLoginAttmpts на 5, учетная запись блокируется на 11 (большечем дважды maxLoginAttempts).Если я установлю MaxLoginAttmpts на 2, учетная запись будет заблокирована на 5 (больше, чем в два раза maxLoginAttempts).

Почему это так?Любая помощь приветствуется.

Здесь я добавляю полную хранимую процедуру.

 CREATE DEFINER=`pubuducg`@`%` PROCEDURE `CustomerAuthenticate`(IN UserEmail VARCHAR(100), IN PassWD VARCHAR(40), IN AccStatus VARCHAR(100),IN TransactionDateTime DATETIME, IN MaxLoginAttempts INT(1))
BEGIN
DECLARE LoginUserID     INT(11);
DECLARE LoginEmail      VARCHAR(50);
DECLARE LoginPassword   TINYTEXT;
DECLARE LoginAttempts   INT(1);
DECLARE AccountStatus   VARCHAR(45);
DECLARE UserRoles       VARCHAR(80);
SELECT 
login.LOGIN_USER_ID,
login.LOGIN_EMAIL,
login.LOGIN_PASSWORD,
login.LOGIN_ACCOUNT_STATUS,
login.LOGIN_LOGIN_ATTEMPTS,
GROUP_CONCAT(user_role.USER_ROLE_ROLE SEPARATOR ',') AS ROLES
INTO
LoginUserID,
LoginEmail,
LoginPassword,
AccountStatus,
LoginAttempts,
UserRoles
FROM login 
INNER JOIN user_role ON 
user_role.USER_ROLE_USER_ID = login.LOGIN_USER_ID AND user_role.USER_ROLE_STATUS = AccStatus 
WHERE login.LOGIN_EMAIL = UserEmail;

SET @USER_FOUND = found_rows();
SET @PASSWORD_CORRECT = IF((LoginPassword = PassWD AND AccountStatus = AccStatus), true, false);

UPDATE login SET 
LOGIN_ACCOUNT_STATUS = (SELECT CASE (LoginAttempts > MaxLoginAttempts) WHEN 1 THEN 'LOCKED' ELSE 'ACTIVE' END),
LOGIN_LOGIN_ATTEMPTS = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN 0 ELSE LOGIN_LOGIN_ATTEMPTS + 1 END),
LOGIN_LAST_LOGIN_DATE = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN TransactionDateTime ELSE LOGIN_LAST_LOGIN_DATE END),
LOGIN_LAST_LOGIN_LOCATION = null 
WHERE LOGIN_EMAIL = UserEmail;

SELECT 
IF(@USER_FOUND AND @PASSWORD_CORRECT, LoginUserID,0) AS USER_ID,
@PASSWORD_CORRECT AS AUTHENTICATED,
@USER_FOUND AS USER_EXISTS,
AccountStatus AS ACCOUNT_STATUS,
IF(@USER_FOUND AND @PASSWORD_CORRECT, 0, LoginAttempts + 1) AS LOGIN_ATTEMPTS,
IF(@USER_FOUND AND @PASSWORD_CORRECT, UserRoles,null) AS USER_ROLES;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...