Quarkus使用Security JDBC实现用户名/邮箱+密码登录问题咨询
问题原因
你当前配置的SQL存在参数不匹配问题,Quarkus的quarkus.security.jdbc.principal-query.sql默认仅传入1个参数,即用户登录时提交的身份标识(你输入的用户名/邮箱值),原SQL写了2个?占位符,参数数量不匹配导致校验逻辑无法生效。
解决方案
调整SQL语句,仅保留1个占位符,让同一个身份标识同时匹配用户名和邮箱字段即可,修改后的配置如下:
quarkus.security.jdbc.principal-query.sql=SELECT u.password, u.role FROM test_user u WHERE ? IN (u.username, u.email)
如果你的数据库不支持上述IN语法的写法,也可以用参数位置复用的写法(不同数据库参数位置标识可能有差异,下面是支持?1位置参数的数据库示例):
quarkus.security.jdbc.principal-query.sql=SELECT u.password, u.role FROM test_user u WHERE u.username = ?1 OR u.email = ?1
修改完成后重启服务,你给出的两个测试curl请求均可正常通过校验。
注意:如果业务中存在用户名和邮箱重复的情况(即某个用户的用户名与另一个用户的邮箱完全一致),需要额外增加校验逻辑避免匹配冲突,该场景属于业务规则范畴,可根据自身需求调整。
内容的提问来源于stack exchange,提问作者Pham Hung
相关产品推荐
相关产品推荐

