【发布时间】:2020-12-23 13:26:51
【问题描述】:
我目前正在使用 Ruby on Rails 构建一个简单的 Web 应用程序,它允许登录用户对 User 模型执行 CRUD 操作。我想添加一个函数:
- 用户可以选择每个控制器可以执行的操作; 例如:用户 A 可以在控制器 A 中执行操作 a&b,而用户 B 只能在控制器 A 中执行操作 B。这些可以通过视图进行编辑。
- 只有授权用户才能访问其他用户的编辑授权权限。例如,如果用户 A 获得授权,那么它可以更改用户 B 能够执行的操作,但未经授权的用户 B 将无法更改自己或任何人的可执行操作。
我已经为我的用户控制器设置了视图和模型
class UsersController < ApplicationController
skip_before_action :already_logged_in?
skip_before_action :not_authorized, only: [:index, :show]
def index
@users = User.all
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to users_path
else
render :new
end
end
def show
set_user
end
def edit
set_user
end
def update
if set_user.update(user_params)
redirect_to user_path(set_user)
else
render :edit
end
end
def destroy
if current_user.id == set_user.id
set_user.destroy
session[:user_id] = nil
redirect_to root_path
else
set_user.destroy
redirect_to users_path
end
end
private
def user_params
params.require(:user).permit(:email, :password)
end
def set_user
@user = User.find(params[:id])
end
end
My sessions controller:
class SessionsController < ApplicationController
skip_before_action :login?, except: [:destroy]
skip_before_action :already_logged_in?, only: [:destroy]
skip_before_action :not_authorized
def new
end
def create
user = User.find_by(email: params[:email])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to user_path(user.id), notice: 'You are now successfully logged in.'
else
flash.now[:alert] = 'Email or Password is Invalid'
render :new
end
end
def destroy
session[:user_id] = nil
redirect_to root_path, notice: 'You have successfully logged out'
end
end
登录/注销功能有效,没有问题。
我首先在主应用程序控制器中实现 not_authorized 方法,如果用户角色不等于 1,默认情况下会阻止用户访问相应的操作。
def not_authorized
return if current_user.nil?
redirect_to users_path, notice: 'Not Authorized' unless current_user.role == 1
end
问题是我想让它可编辑。因此,角色 = 1 的用户可以编辑每个用户的访问权限,如果这有意义的话。
我将如何进一步开发它?我也不想使用宝石,因为这样做的唯一目的是让我学习。 任何见解都值得赞赏。谢谢!
【问题讨论】:
-
你不必使用 gem,但你可以看到 gem 是如何解决他们的问题的,github.com/CanCanCommunity/cancancan
-
无论如何我都会从权威人士开始。 Pundit 只是简单的 OOP,如果您从头开始重新发明轮子,您可能会学到更多。从学习的角度来看,CanCanCan 实际上更糟糕,因为它的 DSL 往往会妨碍您。
标签: ruby-on-rails ruby session authorization