0

我对 Spring 安全性非常陌生,我的问题如下:

我有一个成员mysql 表,其中包含有关网站成员的信息,包括他们的用户名、密码和角色。到目前为止一切顺利:我可以使用此表来配置<jdbc-user-service.

但是,我也希望有一个不会出现在成员表中的超级用户。

  1. 是否可以并建议将此超级用户放在内存用户存储库中,从而将 jdbc 用户服务与内存用户服务混合使用?如果有怎么办?
  2. 如果1.不可能,也许我可以有第二个 mysql 表,例如moderator。那么我需要对这两个表进行身份验证时需要什么样的 sql 查询呢?
4

1 回答 1

1

碰撞

多个存储库的问题是您需要确保区分哪个用户是哪个用户。例如假设您的数据如下所示

成员表

username
----------------------
member

主持人表

username
----------------------
moderator

然后你有一些与你的用户相关的数据

数据表

username          value
----------------------------------------
moderator         secret

如果发生碰撞,现在会发生什么?例如,用户注册,您的成员表现在如下所示:

成员表

username
----------------------
member
moderator

哪个版主拥有数据?没有办法区分这两个用户。

替代方法

另一种方法是使用用户到角色的映射。这将是使用这样的东西:

成员表

username           is_moderator
----------------------
member             false
moderator          true

然后,当用户尝试使用现有用户名注册时,就会违反约束,因此您无需区分两者。当然,您可以使用另一个表映射角色。这是 Spring Security 通常使用权限表所做的。

使用多个 UserDetailsS​​ervice

如果你真的想使用多个用户存储库,你可以简单地在你的配置中声明多个 UserDetailsS​​ervice 条目。内存配置示例如下所示:


  <authentication-manager>
    <authentication-provider>
      <jdbc-user-service .. />
    </authentication-provider>
    <authentication-provider>
      <user-service>
        <user username="moderator" 
            password="password"
            authorities="ROLE_MODERATOR"/>
      </user-service>
    </authentication-provider>
  </authentication-manager>

如果您想在数据库中同时执行这两项操作,则需要确定每个表的 SQL 查询是什么,然后添加两个元素。例如:


  <authentication-manager>
    <authentication-provider>
      <jdbc-user-service .. />
    </authentication-provider>
    <authentication-provider>
      <jdbc-user-service .. />
    </authentication-provider>
  </authentication-manager>

使用属性来控制您的 sql 查询。您可以参考Spring Security 附录中的示例查询。

于 2012-09-04T21:27:26.017 回答