我正在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
}
答案 0 :(得分:0)
实际上你不必实施任何新的东西。如果你看一下ProviderManager的文档,你会看到这个解释为:
通过列表来迭代身份验证请求 AuthenticationProviders。
AuthenticationProviders通常按顺序尝试,直到提供 非空响应。非空响应表示提供者具有 决定身份验证请求的权限,不再进一步 提供商尝试。
因此,您可以定义多个AuthenticationProviders并根据您的不同需求进行配置。一个典型的用例是真实用户authManager
(用户名+密码),另一个用于应用程序(使用基于令牌的访问)。我假设你在这里实现了同样的要求,但即使这个假设是错误的,解决方案仍然适用于你。