Java 在Spring security中添加组

Java 在Spring security中添加组,java,spring,jakarta-ee,spring-mvc,spring-security,Java,Spring,Jakarta Ee,Spring Mvc,Spring Security,我想在我的应用程序中使用组抽象。但是,我不知道如何配置它,也不知道需要哪些表。除了名字等其他内容外,您还有一个用户名、密码和启用列的用户表,这对吗?然后您需要这些表:组,组_权限和组_成员 在user表和group_members表中复制用户名不是很糟糕吗?我不明白这两者之间有什么关系。我发现的一些东西 ? 问题1:我不确定我是否完全理解你的问题。现在我认为答案是肯定的 问题2:是的 问题3:视情况而定。如果你有/将来可能有一个“更改用户名”功能,那就不好了。好消息是您可以自定义DB模式。例

我想在我的应用程序中使用组抽象。但是,我不知道如何配置它,也不知道需要哪些表。除了名字等其他内容外,您还有一个用户名、密码和启用列的用户表,这对吗?然后您需要这些表:
组_权限
组_成员

在user表和group_members表中复制用户名不是很糟糕吗?我不明白这两者之间有什么关系。我发现的一些东西

?


问题1:我不确定我是否完全理解你的问题。现在我认为答案是肯定的

问题2:是的

问题3:视情况而定。如果你有/将来可能有一个“更改用户名”功能,那就不好了。好消息是您可以自定义DB模式。例如,向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";
您可以在安全配置中执行此操作:



当用户表中有此信息时,我不明白为什么您需要自己的group_members表。你能解释一下吗?哪些信息?只是用户名字段?它是在两个表(用户和组成员)之间进行引用的。说明:假设您有3个用户username={user1,user2,user3}。您需要给他们两个角色,角色A和角色B。在这种情况下,您可以添加新组(组表中的一条记录)。然后将3个用户添加到此组(group_members表中的3个新记录)。然后影响该组的两个角色(组权限表中的两个新记录)。你清楚吗?不清楚。我是说你有一张用户表,对吗?它包含用户名、密码、已启用、firstname、lastname、age等。为什么您需要第二个名为group_members(我知道您可以更改此名称)的表,该表只包含用户名?为什么不只有用户、组和组权限?为什么选择group_members表。使用此表,您可以将
users
表中的用户添加到
groups
表中的某个组中。换句话说,每次将用户放入某个组时,都会在组权限表中添加一条记录。看起来你需要功能性的理由。而且很简单:您可以同时将一个用户放入多个不同的组中。在DB级别上,它意味着两个实体之间的多对多关系=>附加表(组成员)。删除此表和users表中的group_id字段,用户将只能在同一时刻参与一个组。它能为你回答这个问题吗?
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";