Home | 簡體中文 | 繁體中文 | 雜文 | Search | ITEYE 博客 | OSChina 博客 | Facebook | Linkedin | 知乎專欄 | Email

5.7. Token 認證

我們在staff表的基礎上增加 token 欄位

		
CREATE TABLE `staff` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '員工ID',
	`name` VARCHAR(50) NOT NULL COMMENT '員工名字',
	`token` VARCHAR(32) NOT NULL COMMENT 'Token 校驗',
	PRIMARY KEY (`id`)
)
COMMENT='員工表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;		
		
		

插入數據的時候增加一些干擾字元串,這裡使用concat(NEW.id,'+',NEW.name,'-')

		
CREATE DEFINER=`root`@`%` TRIGGER `staff_before_insert` BEFORE INSERT ON `staff` FOR EACH ROW BEGIN

if md5(concat(NEW.id,'+',NEW.name,'-')) != NEW.token then
		SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001;
	end if;

END
		
		

注意表權限可以授權給用戶,觸發器權限不讓普通用戶查看。否則用戶看到 concat(NEW.id,'+',NEW.name,'-') 就沒有意義了。

下面開始測試:

		
INSERT INTO `test`.`staff` (`name`, `token`) VALUES ('John', '678797066');
/* SQL錯誤(1001):Permission denied */	
		
		

下面再測試,首先生成一個正確的tokon, 然後使用該token插入數據:

		
-- 通過下面語句生成一個 Token
select md5(concat('5','+','Jam','-')) as token;

-- 使用上面的 Token 插入數據
INSERT INTO `test`.`staff` (`id`, `name`, `token`) VALUES (5, 'Jam', '1b033ce21cbadacabc9f0c38fb58dbb2');

SELECT * FROM `test`.`staff` WHERE `id` = 5;
		
		

開發注意事項, Token 生成算法要保密,不要使用下面SQL提交數據

INSERT INTO `test`.`staff` (`id`, `name`, `token`) VALUES (5, 'Jam', md5(concat('5','+','Jam','-')));		
		

應該分兩步,一是計算Token,二是插入數據。可以將Token計算交給程序而不是SQL,並且封裝在。jar(Java)中或者。so(PHP 擴展中).