【问题标题】:switching authentication table as per request parameter springSecurity in springboot在spring boot中根据请求参数spring Security切换身份验证表
【发布时间】:2015-09-25 14:47:19
【问题描述】:

我正在 springboot 中编写一个程序,用户可以通过用户名/密码的组合以两种方式访问​​应用程序,或者使用位于单独表中的单个唯一 16 位字母数字字符。 我很乐意使用用户名/密码的组合或一次使用 16 位字符来记录用户。但我需要的是能够在基于用户和基于字符的登录之间切换。我已经考虑过基于过滤器的方法,但不确定如何开始它,任何人都可以指出我正确的方向。 我想要的是这样的:-

if(request.getParameter("userType").equals("userbased")){
auth.jdbcAuthentication().dataSource(dataSource)
            .usersByUsernameQuery(
                    "select username,password,enabled from user where username=?")
            .authoritiesByUsernameQuery(
                    "SELECT u.username,r.role FROM user u  INNER JOIN user_role ur ON u.id = ur.user_id INNER JOIN role r ON ur.role_id = r.id WHERE u.username=?; ");
}
else if(request.getParameter("userType").equals("tokenNo")){
   //token based login logic with structure same as above
}

【问题讨论】:

  • 不,这不是你想要的。只需为唯一编号而不是用户名/密码组合添加一个过滤器,该过滤器应该返回一个AuthenticationToken,接下来你需要一个知道如何处理它的AuthenticationProvider。配置它并完成。

标签: spring spring-mvc spring-security spring-boot


【解决方案1】:

实际上,您不必实施任何新的东西。如果您查看ProviderManager 的文档,您会看到这样的解释:

通过一个列表迭代一个身份验证请求 身份验证提供者。

AuthenticationProviders 通常会按顺序尝试,直到提供 非空响应。非空响应表明提供者有 有权决定身份验证请求,而不是进一步 提供者已尝试。

所以你可以定义多个AuthenticationProviders,并根据你的不同需求进行配置。一个典型的用例是一个authManager用于真实用户(带有用户名+pass),另一个用于应用程序(带有基于令牌的访问)。我假设您在这里实现了相同的要求,但即使这个假设是错误的,该解决方案仍然适用于您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 2022-08-16
    • 1970-01-01
    • 2019-12-22
    • 2017-09-14
    • 2012-11-23
    • 2015-08-09
    • 2021-04-21
    相关资源
    最近更新 更多