Ruby on Rails,注销后,仍然可以访问具有用户 ID 的页面

Posted

技术标签:

【中文标题】Ruby on Rails,注销后,仍然可以访问具有用户 ID 的页面【英文标题】:Ruby on Rails, after sign out, can still access to the page with user id 【发布时间】:2014-09-06 11:27:12 【问题描述】:

我使用 Ruby on rails 构建了登录、注册和注销功能,似乎所有这些功能都运行良好。

当我使用 sign_up 函数创建新用户时,也会创建一个 user_id,当我退出时,我仍然可以使用包含 user_id 的 url 进入用户页面。

我的显示功能有什么问题吗?请问这个问题怎么解决?

route.rb 是:

Rails.application.routes.draw do

  get 'users/new'
  get 'home/index'

  resources :users
  resources :sessions
  resources :courses

  match '/about', to: 'home#about', via: 'get'
  match '/signup', to: 'users#new', via: 'get'
  match '/signin', to: 'sessions#new', via: 'get'
  match '/signout', to: 'sessions#destroy', via: 'delete'
  match '/main', to: 'users#show', via: 'get'
end

users_controller.rb 是:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user, notice: 'User was sucessfully created!'
    else
      render action: "new"
    end
  end

  def show
    @user = User.find(params[:id])
  end

  private
    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end
end

sessions.controller.rb 是:

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.authenticate(params[:session][:email], params[:session][:password])

    if user.nil?
      flash.now[:error] = "Invalid email or password."
      render :new
    else
      sign_in user
      redirect_to user
    end
  end

  def destroy
    sign_out
    redirect_to signin_path
  end
end

sessions.helper.rb 是:

module SessionsHelper

  def sign_in(user)
    session[:user_id] = user.id
    self.current_user = user
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  def signed_in?
    !current_user.nil?
  end

  def sign_out
    session[:user_id] = nil
    self.current_user = nil
  end

  def current_user?(user)
    user == current_user
  end

  def deny_access
    redirect_to signin_path, :notice => "Please sign in first."
  end

end

比如我创建了一个账号,user_id为1,退出后可以进入账号展示页面,url为:http://localhost:3000/users/1 我的工作有什么问题吗?

【问题讨论】:

【参考方案1】:

你需要在你的控制器中添加一个 before_filter

# application_controller.rb
def check_if_logged_in
  deny_access unless signed_in?
end

# users_controller.rb
before_filter :check_if_logged_in, only: [:show, :edit, :update, :delete]

另外,show 方法是否应该通过 id 或当前登录用户的个人资料页面显示用户?如果是后一种情况需要修改为

@user = User.find(current_user.id)

【讨论】:

【参考方案2】:

IT 看起来您并没有限制对 /users/show 的访问——您是故意的吗?它通过 ID 加载 User 对象并显示它,就像您转到任何其他 :resource 路由一样。

【讨论】:

我的意思是,我注销后,我仍然可以不登录进入用户页面,只需输入带有user_id的url 我觉得不安全,感觉sign_out功能没用【参考方案3】:

你也可以试试这个

before_filter :authenticate_user!, :except => [:index, :show]

对于IndexShow 操作用户不需要身份验证

如果您想对用户进行所有操作的身份验证

before_filter :authenticate_user!

我非常喜欢 Devise 登录模式和管理面板,您可以使用 CanCanActive Admin

【讨论】:

以上是关于Ruby on Rails,注销后,仍然可以访问具有用户 ID 的页面的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:视图更改后,网站未更新

Ruby on Rails 链接到无效输入后表单失败的上一页

如何在本地网络上托管 Ruby on Rails 应用程序,以便多人可以访问它?

Ruby on Rails 部署到阿里巴巴 ECS 后无法加载

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Android - Ruby on Rails - MySQL