我在我的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 = ?
型
我想让它,使用户可以登录用户名和电子邮件。有没有办法修改这两个查询来实现这一点?或者有一个更好的解决方案?
8条答案
按热度按时间e37o9pze1#
不幸的是,没有简单的方法可以通过更改查询来做到这一点。问题是spring security期望users-by-username-query和authorities-by-username-query具有单个参数(用户名),因此如果您的查询包含两个参数,如
字符串
查询将失败。
你可以做的是实现你自己的UserDetailsService,它将执行查询(或多个查询),通过用户名或电子邮件搜索用户,然后在你的spring安全配置中使用这个实现作为身份验证提供者,比如
型
lymnna712#
我也遇到了同样的问题,在尝试了很多不同的查询,程序.
字符串
它只是用两个查询重复配置。
xkftehaa3#
如果我理解正确的话,那么问题是您希望在两个不同的DB列中查找用户输入的用户名。
当然,你可以通过自定义UserDetailsService来实现。
字符串
这个类的bean配置如下所示。
型
您的查询将类似于以下内容
型
cyej8jka4#
您可以像下面的代码一样使用UserDetailesService.和config。
字符串
关键是,你不需要返回用户相同的用户名,你可以得到用户的电子邮件和返回用户的用户名。代码将像下面的代码。
型
tip* UserDetail是一个接口,您可以创建一个或使用Spring Default。
jw5wzhpr5#
您可以分别在
users-by-username-query
和authorities-by-username-query
属性中的<jdbc-user-service>
标记中定义自定义查询。字符串
更新
您可以创建实现
org.springframework.security.core.userdetails.UserDetailsService
的类,并配置应用程序将其用作身份验证源。在自定义UserDetails服务中,您可以执行从数据库获取用户所需的查询。avkwfej46#
你可以像这样配置UserDetailesService类。
字符串
您的查询将类似于以下内容
select * from user where email =?or username =?
用于获取用户数据的UserRepository类
型
您也可以在登录时添加电话号码。
yb3bgrhw7#
这里是我发现的一个解决方法。基本上,我将用户名和电子邮件地址连接在一起,中间有一个字符(例如'email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)'),并检查参数是否匹配字符串的左侧或右侧:
字符串
如果您担心用户名或电子邮件中可能会存在“”字符(例如~),请改用非标准的“”字符(例如X '9 C“)。
6fe3ivhb8#
你可以按如下方式更改你的配置:
字符串