我实际上已经围绕这个主题进行了相当多的应用程序构建/研究,所以我将尝试给出详细的答案。
以同样的方式,您可以在非用户、登录用户和管理员帐户之间划分应用程序或网站的部分,您可以实施检查以确保,例如,只有正确的用户可以更改他们的帐户密码。以下是您可能用于此类方法的测试:
describe "as wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
before { sign_in user, no_capybara: true }
describe "submitting a GET request to the Users#edit action" do
before { get edit_user_path(wrong_user) }
specify { expect(response.body).not_to match(full_title('Edit user')) }
specify { expect(response).to redirect_to(root_url) }
end
describe "submitting a PATCH request to the Users#update action" do
before { patch user_path(wrong_user) }
specify { expect(response).to redirect_to(root_url) }
end
end
end
如果您不熟悉测试(或不确定这具体是做什么的),我会解释:
在代码中,工厂可以选择一个选项(下面这一行)
FactoryGirl.create(:user, email: "wrong@example.com")
这基本上创建了一个与默认电子邮件地址不同的用户。然后发生的所有事情就是测试指定错误的用户不应访问原始用户的编辑或更新操作。
下一步是添加一个前置过滤器来检查当前用户的状态。这可能会出现在您的 users_controller.rb 文件中。
before_action :correct_user, only: [:edit, :update]
然后(仍然在 users_controller.tb 文件中)创建一个私有方法来检查当前用户是否有权修改数据,否则会将它们重定向回根 url(如果你喜欢你可以使用 [:notice]说“你无权访问这部分应用程序”或类似的东西)
private
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
correct_user 过滤器使用您在 Sessions 帮助器中定义的 current_user? 布尔方法,如下所示:
def current_user
remember_token = User.encrypt(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end
def current_user?(user)
user == current_user
end
当涉及到谁可以访问什么时,这并不是安全的全部教条,但我希望它能够为您提供问题中提到的缺失细节。