其實我看不到你的UserDetails表和RoleDetails一個之間的關係,也許我失去了一些東西。
當我做出這樣的實體模式時,我總是在用戶和角色之間建立一個1對n的關係,因此一個用戶可以擁有一個或多個角色。
但是假設你正在建立從用戶到角色的1-1關係,並且假設你正在尋找的ROLE_xxx位於UserDetails表中的角色字段中,那麼你的用戶名 - 查詢器查詢必須或多或少像這樣的:
"select display_name as username, role as authority from user_details where display_name =? "
如果user_details場上的作用是外鍵必須在role_details領域ROLE_NAME匹配,並且 - 瑞實際上這是在security_intercept URL的訪問元素引用的機關,它應該是這樣的:
"select u.display_name as username, r.rights as authority
from user_details as u INNER JOIN role_details as r ON u.role = r.role_name
where u.display_name =? "
但是,如果權限是逗號分隔的權限列表,您可能會遇到麻煩。用戶名 - 查詢權限期望在每行中接收具有權限的行的列表。如果這是你在尋找什麼,你應該考慮改變的模式或使返回每行結果的右側的表,甚至一個視圖
編輯:我應該做的是這樣的:
這是創建腳本:
CREATE TABLE IF NOT EXISTS `role_details` (
`role_id` INT(11) NOT NULL AUTO_INCREMENT,
`role_name` VARCHAR(45) NULL DEFAULT NULL,
`role_desc` VARCHAR(100) NULL DEFAULT NULL,
`role_authority` VARCHAR(300) NOT NULL,
PRIMARY KEY (`role_id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `user_details` (
`user_id` INT(11) NOT NULL AUTO_INCREMENT,
`display_name` VARCHAR(45) NULL DEFAULT NULL,
`password` VARCHAR(45) NULL DEFAULT NULL,
`emp_id` INT(11) NULL DEFAULT NULL,
`email` VARCHAR(45) NULL DEFAULT NULL,
`mobile` VARCHAR(45) NULL DEFAULT NULL,
`creation_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
`status` TINYINT(1) NULL DEFAULT 0,
PRIMARY KEY (`user_id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `user_role_details` (
`user_details_user_id` INT(11) NOT NULL,
`role_details_role_id` INT(11) NOT NULL,
PRIMARY KEY (`user_details_user_id`, `role_details_role_id`),
INDEX `fk_user_details_has_role_details_role_details1_idx` (`role_details_role_id` ASC),
INDEX `fk_user_details_has_role_details_user_details_idx` (`user_details_user_id` ASC),
CONSTRAINT `fk_user_details_has_role_details_user_details`
FOREIGN KEY (`user_details_user_id`)
REFERENCES `user_details` (`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_user_details_has_role_details_role_details1`
FOREIGN KEY (`role_details_role_id`)
REFERENCES `role_details` (`role_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
注意我刪除了user_details列「角色」,更名爲「權利」,以從varchar在role_details「role_authority」,改變了「狀態」改爲TINYINT(1)使用它作爲布爾。
然後,用戶詳細信息sql語句:
users-by-username-query=
"SELECT display_name as username, password, status as enabled
FROM user_details as u WHERE u.display_name = ? and status = 1;"
authorities-by-username-query=
"Select u.display_name as username, r.role_authority as authority
FROM
user_details as u
INNER JOIN user_role_details as urd ON u.user_id = urd.user_details_user_id
INNER JOIN role_details as r ON urd.role_details_role_id = r.role_id
WHERE u.display_name = ?"
這樣你就可以擁有多個角色綁定到每個用戶
可以請你給我提供正確的架構和相關查詢? –