实际上我看不到您的 UserDetails 表和 RoleDetails 表之间的关系,也许我失去了一些东西。
当我制作了这样一种实体模式时,我总是在用户和角色之间建立一对n的关系,因此一个用户可以拥有一个或多个角色。
但假设您正在配置从用户到角色的 1-1 关系,并且假设您要查找的 ROLE_xxx 在 UserDetails 表中的角色字段上,您的权限-用户名查询必须或多或少像这样:
"select display_name as username, role as authority from user_details where display_name =? "
如果user_details中的字段role是外键,必须与role_details中的role_name字段匹配,而rigths实际上是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 =? "
但是,如果权限是用逗号分隔的权限列表,您可能会遇到麻烦。 authority-by-username-query 期望在每一行中接收具有权限的行列表。如果这是您所寻求的,您应该考虑更改架构或制作表的视图,以返回每行结果的权限
编辑:我应该这样做:
这是创建脚本:
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 中的“role”列,将 role_details 中的“rights”重命名为“role_authority”,并将“status”从 varchar 更改为 tinyint(1) 以将其用作布尔值。
然后,用户详细的sqls:
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 = ?"
这样您可以将多个角色绑定到每个用户