Sorcery 0.11.0(Rails5.1.4)认证子模块无法正常加载求助
排查Sorcery自定义认证模型(Person)方法缺失的问题
我之前在使用Sorcery 0.11.x版本配合Rails 5.x时,也碰到过类似自定义认证模型后方法不生效的情况,结合你的环境(Rails 5.1.4、Ruby 2.4.2),给你几个针对性的排查方向:
1. 确认初始化文件中指定了正确的认证模型
Sorcery默认会使用User类作为认证模型,换成Person后必须在config/initializers/sorcery.rb里明确配置,而且注意要用字符串形式(这个版本对符号的支持不稳定):
Rails.application.config.sorcery.configure do |config| # 核心配置:指定认证模型为Person config.user_class = "Person" # 你的子模块配置,比如开启remember_me等 config.submodules = [:remember_me] # 替换成你实际使用的子模块 # 子模块的具体配置... end
2. 检查Person模型的模块引入是否正确
在app/models/person.rb里,要确保正确引入Sorcery的核心模型模块和对应的子模块,不要漏掉:
class Person < ApplicationRecord # 先引入核心模型模块 include Sorcery::Model # 再引入你需要的子模块,比如remember_me include Sorcery::Model::Submodules::RememberMe # 或者如果要加载所有子模块,可以用: # include Sorcery::Model::All end
另外要确认模型文件名是person.rb(小写单数),Rails才能正确加载这个模型类。
3. 重启服务/控制台,验证方法存在性
修改初始化文件或模型后,一定要重启Rails服务器或者控制台,否则变更不会生效。重启后可以在控制台里直接测试:
# 测试类方法是否存在,比如authenticate Person.respond_to?(:authenticate) # 测试实例方法是否存在,比如remember_me!(如果用了remember_me子模块) Person.new.respond_to?(:remember_me!)
4. 排查子模块的配置完整性
如果是引入子模块后方法缺失,要确保初始化文件里开启了对应的子模块,并且相关配置项没有错误。比如使用remember_me子模块时,要确保配置了必要的参数:
config.remember_me_cookie_name = "remember_me" config.remember_me_expires_at = 7.days.from_now
子模块没有正确配置的话,可能会导致其对应的方法无法被注入到模型中。
5. 查看启动日志,排查加载错误
启动服务器或控制台时,仔细查看输出日志,有没有出现Sorcery加载失败的提示(比如找不到Person类、子模块加载异常等),这些细节往往能定位问题根源。
内容的提问来源于stack exchange,提问作者Mark Fraser
相关产品推荐
相关产品推荐

