我在Spring MVC
应用程序中使用Spring Security。JdbcUserDetailsManager
使用以下用于身份验证的查询初始化:
select username, password, enabled from user where username = ?
当局正在这里加载:
select u.username, a.authority from user u join authority a on u.userId = a.userId where username = ?
我想这样做,以便用户可以同时使用用户名和电子邮件登录。有没有办法修改这两个查询来实现这一点?还是有更好的解决方案?
最佳答案
不幸的是,没有简单的方法可以通过更改查询来做到这一点。问题是,Spring Security希望按用户名查询的用户和按用户名授权的用户具有单个参数(用户名),因此,如果您的查询包含两个参数,例如
username = ? or email = ?
查询将失败。
您可以做的是实现自己的 UserDetailsService ,该查询将执行一个(或多个)查询以按用户名或电子邮件搜索用户,然后将此实现用作您的Spring安全配置中的身份验证提供者,例如
<authentication-manager>
<authentication-provider user-service-ref='myUserDetailsService'/>
</authentication-manager>
<beans:bean id="myUserDetailsService" class="xxx.yyy.UserDetailsServiceImpl">
</beans:bean>
关于使用用户名或电子邮件的Spring Security,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122756/