我正在使用Rails构建一个应用程序,并使用Devise进行用户身份验证。
我想知道如何限制访问某些页面,除非用户已登录。 我猜我必须更改特定页面控制器上的代码,但我不确定如何操作。
另外,如果未经身份验证的用户想要访问该页面,我该如何限制?
非常感谢!
我想知道如何限制访问某些页面,除非用户已登录。 我猜我必须更改特定页面控制器上的代码,但我不确定如何操作。
另外,如果未经身份验证的用户想要访问该页面,我该如何限制?
非常感谢!
您可以在页面上做一些类似于这样的事情:
<% if user_signed_in? %>
<div> show content here </div>
<%else %>
<p>Please Sign Up or Sign In to view the content.</p>
<h2><%= link_to "Sign up", new_user_registration_path%>
<% end %>
before_action
:
before_action :authenticate_user!
官方文档 有详细信息。before_filter :authenticate_user!
就在这行代码之后:
class YourController < ApplicationController
您还可以将其缩小到特定的控制器操作,因此假设您想要限制对特定的Create和Destroy操作的访问,可以执行以下操作:
before_filter :authenticate_user!, only: [:create, :destroy]
这使得他们仍然可以自由地访问您的其他操作。
before_filter
在Rails 5.2中不再起作用。我们只使用before_action
。 - Travis Le有几种方法可以做到这一点。
其中一种方法是在before_action
中使用devise的authenticate_user!
方法。我建议这样做,因为它会在用户未经过身份验证时将其重定向到sign_in页面。
如果您想进行自定义重定向,可以使用您的控制器。像这样做一些事情:
def show
@user = User.find(params[:id])
redirect_to root_path unless @user == current_user #if you don't care who the user is I recommend to use user_signed_id? method
end
你也可以使用相同的if语句在视图层面限制内容,但我不建议这样做,因为它可能会对你的应用程序用户体验产生负面影响。
请查看Devise文档。
此外,有一个很好的gem可以帮助你解决身份验证问题,但不幸的是它不能帮助你查看用户是否已登录。无论如何,也许它对你有所帮助,所以我会把它留在这里。它的名字是CanCan。