【问题标题】:Authenticating users with Spring security against two user-services针对两个用户服务使用 Spring 安全性对用户进行身份验证
【发布时间】:2012-08-27 18:13:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql authentication spring-security


    【解决方案1】:

    碰撞

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

    成员表

    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

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 2013-08-12
      • 2016-07-29
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2011-10-05
      • 2011-08-12
      相关资源
      最近更新 更多