在 Spring 安全性中添加组
Posted
技术标签:
【中文标题】在 Spring 安全性中添加组【英文标题】:Adding groups in Spring security 【发布时间】:2013-04-25 19:41:08 【问题描述】:我想在我的应用程序中使用组抽象。但是我不明白如何配置它,也不知道我需要哪些表。除了名字等其他内容之外,您还有一个包含用户名、密码和启用列的用户表是否正确?那么您需要这些表:groups
、groups_authorities
和 group_members
?
在 user 表和 group_members 表中复制用户名不是很糟糕吗?我不明白它是如何相互关联的。我发现的一些...
https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.java ?
create table groups (
id bigint generated by default as identity(start with 0) primary key,
group_name varchar_ignorecase(50) not null);
create table group_authorities (
group_id bigint not null,
authority varchar(50) not null,
constraint fk_group_authorities_group foreign key(group_id) references groups(id));
create table group_members (
id bigint generated by default as identity(start with 0) primary key,
username varchar(50) not null,
group_id bigint not null,
constraint fk_group_members_group foreign key(group_id) references groups(id));
【问题讨论】:
【参考方案1】:Q1:我不确定我是否完全理解您的问题。目前我认为答案是肯定的。
Q2:是的。
Q3:视情况而定。如果您有/将来可能有“更改用户名”功能,那就不好了。好消息是您可以自定义数据库模式。例如,在 users 表中添加一个 id 字段并将该字段用作 PK(在这种情况下确保 username 字段是唯一的)。现在您必须覆盖来自 org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
的默认 SQL 查询:
public static final String DEF_USERS_BY_USERNAME_QUERY =
"select username,password,enabled " +
"from users " +
"where username = ?";
public static final String DEF_AUTHORITIES_BY_USERNAME_QUERY =
"select username,authority " +
"from authorities " +
"where username = ?";
public static final String DEF_GROUP_AUTHORITIES_BY_USERNAME_QUERY =
"select g.id, g.group_name, ga.authority " +
"from groups g, group_members gm, group_authorities ga " +
"where gm.username = ? " +
"and g.id = ga.group_id " +
"and g.id = gm.group_id";
您可以在安全配置中执行此操作:
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="securityDataSource"
users-by-username-query="your customized SQL goes here"
authorities-by-username-query="your customized SQL goes here"
group-authorities-by-username-query="your customized SQL goes here"
/>
</authentication-provider>
</authentication-manager>
【讨论】:
当您在用户表中有此信息时,我不明白为什么您需要自己的 group_members 表。你能解释一下吗? 哪些信息?只是用户名字段?在这里可以在两个表(users 和 group_members)之间进行引用。说明:假设您有 3 个用户 username=user1, user2, user3。你想给他们 2 个角色,ROLE_A 和 ROLE_B。在这种情况下,您可以添加新组(groups 表中的一条记录)。然后将 3 个用户添加到该组(group_members 表中的 3 个新记录)。然后影响这个组的两个角色(group_authorities 表中的两个新记录)。你清楚吗? 并非如此。我的意思是你有一个用户表吗?它包含用户名、密码、已启用、名字、姓氏、年龄等。为什么您需要第二个名为 group_members 的表(我知道您可以更改此名称),它只包含一个用户名?为什么不只有用户、组和 group_authorities?为什么是 group_members 表。 使用此表,您可以将users
表中的用户添加到groups
表中的某个组中。换句话说,每次将用户放入某个组时,您都会在 group_authorities 表中添加一条记录。
好的,我专注于技术原因。看起来你想要功能原因。而且很简单:您可以同时将一个用户分到多个不同的组中。在数据库级别上,这意味着两个实体之间的多对多关系 => 附加表(group_members)。删除这个表,以及 users 表中的 group_id 字段,一个用户在同一时刻只能参与一个组。它为你回答了问题吗?以上是关于在 Spring 安全性中添加组的主要内容,如果未能解决你的问题,请参考以下文章
使用oauth2向授权URL添加附加参数的Spring安全性?