使用Spring安全性对两个用户服务进行身份验证

时间:2012-09-02 23:21:27

标签: sql authentication spring-security

我对Spring安全性很新,我的问题如下:

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

但是我也想要一个不会出现在成员表中的超级用户。

  1. 是否可以并建议将此超级用户置于内存用户存储库中,从而将jdbc用户服务与内存中用户服务混合使用?如果是这样的话?
  2. 如果 1。是不可能的,也许我可以使用第二个名为主持人的mysql表。那么我需要对这两个表进行哪种sql查询验证呢?

1 个答案:

答案 0 :(得分:1)

Collissions

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

会员表

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

主持人表

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

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

数据表

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

如果发生碰撞,现在会发生什么?例如,用户注册,您的成员表现在看起来像这样:

会员表

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

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

替代方法

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

会员表

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

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

使用多个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 appendix作为示例查询。