我有一个带有Devise和CanCan的Rails 3.2应用程序。用户能力由角色定义。数据库中有五个角色,ID值为1-5,而User has_one角色通过成员资格。因此,例如,Membership.create(user_id: 2, role_id: 4)
将导致User.find(2).role == Role.find(4) # => true
我的能力文件看起来像
if user.has_role? :admin
can :manage, Model
can :manage, AnotherModel
# etc.
elsif user.has_role? :basic
can :read, Model
can :read, AnotherModel
elsif user.has_role? (etc. for other roles)
(etc.)
else
cannot :manage, :all
我想挑选那些试图访问未经授权的网页的人。我的应用程序控制器包括:
rescue_from CanCan::AccessDenied do |exception|
reset_session
redirect_to new_user_session_path
end
在开发中单击时,此行为正常工作 - 通过rails控制台创建的基本用户在尝试执行管理操作时被踢出,而没有角色的用户(在控制台中创建,然后User.last.membership.destroy
) User.last.role # => nil
)无法登录仪表板 - 而是立即将用户重定向到登录页面(没有角色的用户无法管理任何内容)。
我在尝试测试同样的行为时遇到了问题,特别是对于没有角色的用户:
# spec/support/login_helpers.rb
def login_via_sign_in_page(user)
visit new_user_session_path
fill_in :user_email, with: user.email
fill_in :user_password, with: user.password
click_button 'Sign in'
end
# spec/features/dashboard_spec.rb
describe "as a user with no role" do
let(:user) { FactoryGirl.create(:user) }
before { login_via_sign_in_page(user) }
it "should redirect to the sign_in page" do
current_path.should == new_user_session_path
end
end
上述测试失败,RSpec显示用户已成功将其设置到仪表板页面,而不是重定向到登录页面。但是,以下规范确实通过了:
# spec/features/dashboard_spec.rb
describe "as a guest browser (no login whatsoever)" do
it "should redirect to the sign_in page" do
visit dashboard_index_path
current_path.should == new_user_session_path
end
end
describe "as an admin user" do
let(:user) { FactoryGirl.create(:admin_user) }
before { login_via_sign_in_page(admin_user) }
it "should go to the dashboard" do
visit dashboard_index_path
current_path.should == dashboard_index_path
end
end
...以及在尝试管理操作时将基本用户重定向到sign_in页面
我看过this post,似乎正在处理类似的问题,但那些建议没有帮助。
最后,在使用debugger
和save_and_open_page
时,我得到了令人困惑的结果。前者会给我user # => <A legit User object>
和user.role # => nil
。但是,save_and_open_page
显示我已在仪表板页面上登录。
答案 0 :(得分:0)
您是否尝试过使用Warden::Test::Helpers
以及测试Devy with Capybara所需的其余配置?看看How To: Test with Capybara。你在用哪个司机?