如何在OpenAM认证后添加数据库用户不存在的验证逻辑?
OpenAM认证后添加数据库用户存在性验证逻辑
针对你的需求,需要在OpenAM认证通过后,额外验证用户是否存在于系统数据库中,不存在则拒绝登录并提示错误。以下是修改后的完整代码及说明:
修正后的完整代码
class OpenAMStrategy < Base def valid? puts("*************** CHECKING OPEN AM VALID ABXXXAB ********") # 仅当uid请求头存在时,该认证策略才生效 request.headers['uid'].present? end def authenticate! puts("******************** DOING OPEN AM AUTHENTICATE ----") userName = uidHeader user = User.find_by_email(userName) if user # 处理请求头(保留原代码逻辑并修正语法) request.headers.env.each do |k, v| if k.downcase.start_with?('http') || k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) headerValue = v if k.downcase.starts_with?('http') puts("************ HEADER >>>> #{k} VALUE --> #{headerValue}") end end # 标记认证成功,传递用户对象 success!(user) else # 用户不存在时触发认证失败,返回错误提示 fail!("该用户未在系统中注册,请联系管理员") end end end
关键修改点说明
valid?方法修正:原代码直接返回true会导致无论uid头是否存在都执行该策略,现在改为返回request.headers['uid'].present?,确保只有OpenAM传递了uid头时才启用该认证逻辑。authenticate!方法完善:- 保留原有用户查询逻辑,新增用户不存在的分支处理
- 使用
success!(user)明确标记认证成功,将用户对象传入系统认证上下文 - 使用
fail!()触发认证失败,传入自定义错误提示,前端可直接捕获该信息展示给用户 - 修正了原代码中
select循环的语法问题,改为each遍历并完善条件判断逻辑
内容的提问来源于stack exchange,提问作者invisible
相关产品推荐
相关产品推荐

