[MySQL - MariaDB] Chức năng Đăng ký tài khoản sử dụng Store Procedure và Function
Khi bạn có một công việc có cùng một câu lệnh, nhưng phải sử dụng ở nhiều nơi, bạn sẽ nghĩ ngay đến viết một hàm chứa nó và khi cần chỉ việc gọi ham . Cực kỳ quốc tế và cũng rất bình dân. Trong ví dụ này, mình sẽ tạo ra một store procedure đăng ký tài ...
Khi bạn có một công việc có cùng một câu lệnh, nhưng phải sử dụng ở nhiều nơi, bạn sẽ nghĩ ngay đến viết một hàm chứa nó và khi cần chỉ việc gọi ham. Cực kỳ quốc tế và cũng rất bình dân.
Trong ví dụ này, mình sẽ tạo ra một store procedure đăng ký tài khoản, có chức năng mã hóa mật khẩu. Và sử dụng function để tạo ra private key và tạo chuỗi password từ private key đó. Khá mơ hồ đúng không ? Xem ví dụ sẽ rõ thôi. Đơn giản lắm :))
Trong bài trước mình đã tạo ra một store procedure đơn giản dùng để làm chức năng login. Bài này mình sẽ nâng cấp nó lên 1 chút, đó là mình sẽ mã hóa mật khẩu trước khi lưu xuống database cũng như khi truy vấn kiểm tra.
Bắt đầu nhé.
- Tạo một chuỗi mã hóa ngẫu nhiên, có độ dài ngẫu nhiên từ 11-41 ký tự:
SELECT SUBSTRING(REPLACE(REPLACE(REPLACE( TO_BASE64(MD5(RAND())), '=','),'+','),'/','), 2, FLOOR(10+RAND()*31));
Chúng ta tạo một function chứa câu lệnh này để có thể xài nhiều nơi:
create FUNCTION UFN_Generate_Key() RETURNS varchar(50) return SUBSTRING(REPLACE(REPLACE(REPLACE( TO_BASE64(MD5(RAND())), '=','),'+','),'/','), 2, FLOOR(10+RAND()*31));
- Tiếp theo sẽ là một hàm mã hóa mật khẩu kèm chuỗi khóa, sau đó trả về một chuỗi mật khẩu dùng để lưu và truy vấn database:
CREATE FUNCTION Get_Password(pr_password varchar(50), pr_private_key varchar(50) ) RETURNS VARCHAR(50) return sha1(concat(pr_password, pr_private_key ,`GetKey2`('pw'))); #trong đây bạn có thể thêm nhìu cách mã hóa khác, như là thêm một khóa nữa, hoặc sha1 bao nhiu lần túy ý. #Trong trường hợp trên mình có tạo ra một function `GetKey2`('pw') trả về một chuỗi do mình chỉ định, chuỗi này mình tự tạo. #Các bạn có thể tự tạo ra một function tương tự trả về một chuỗi theo ý của bạn, nhằm tăng độ khó cho các thiên tài giải mã :)).
- Cuối cùng là viết store procedure Đăng ký tài khoản:
CREATE PROCEDURE USP_Register(pr_username varchar(50), pr_password varchar(50)) BEGIN DECLARE isExists int DEFAULT -1; DECLARE privateKey VARCHAR(50); DECLARE pw varchar(50); SELECT COUNT(*) INTO isExists FROM tbl_account; IF (isExists>0) THEN SELECT 'Tài khoản đã tồn tại !'; #Với câu lệnh SELECT store procedure sẽ trả về dữ liệu và không chạy những lệnh sau đó END IF; SET privateKey=UFN_Generate_Key(); SET pw=Get_Password(pr_password, privateKey); #function này đã tạo ra ở bước trên #Với table tbl_account có cấu trúc tbl_account(username varchar(50), password varchar(100), private_key varchar(50)) INSERT INTO tbl_account(username,password,private_key) VALUES (pr_username, pw, privateKey); IF(row_count()>0) THEN SELECT 'Đã đăng ký thành công !'; #hoặc trả về user vừa được đăng ký ELSE SELECT 'SOMETHING WRONG !!!'; END IF; END;
Ở ví dụ trên mình phải lưu private key cho từng user, do nó sẽ tự tạo ra khi đăng ký nên sẽ không ai giống ai cả, do đó cần phải lưu lại để sau này truy vấn và check password khi login.
Có Register rồi thì cũng nên sửa lại procedure login bài trước luôn nhở :))
CREATE PROCEDURE `usp_login`(IN `pr_username` varchar(50), IN `pr_password` varchar(50)) BEGIN DECLARE privateKey VARCHAR(50); DECLARE isExists INT DEFAULT -1; DECLARE pw VARCHAR(50) ; SELECT private_key INTO privateKey FROM tbl_account WHERE username=pr_username; SET pw=Get_Password(pr_password, private_key ); #function này đã tạo ra ở bước trên SELECT COUNT(*) INTO isExists FROM tbl_account WHERE username=pr_username AND password=pw; IF(isExists >0) THEN SELECT 'Đăng nhập thành công !'; ELSE SELECT 'Tên đăng nhập hoặc mật khẩu không đúng !'; END IF; END
Vậy là đã hoàn tất register và login, hiện tại mình cũng xài theo cách này. Khá là thô sơ nhưng mình nghĩ cũng không phải là không hiệu quả.
CÁM ƠN CÁC BẠN ĐÃ THEO DÕI BÀI VIẾT !
Đừng quên để lại bình luận bên dưới nhé !!!
HAPPY CODING !