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]
对于Index
和Show
操作用户不需要身份验证
或如果您想对用户进行所有操作的身份验证
before_filter :authenticate_user!
我非常喜欢 Devise 登录模式和管理面板,您可以使用 CanCan 或 Active Admin
【讨论】:
以上是关于Ruby on Rails,注销后,仍然可以访问具有用户 ID 的页面的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails 链接到无效输入后表单失败的上一页
如何在本地网络上托管 Ruby on Rails 应用程序,以便多人可以访问它?
Ruby on Rails 部署到阿里巴巴 ECS 后无法加载
如何在 ruby on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby?