gpt4 book ai didi

ruby-on-rails - Ruby on Rails 4 : authorisation after authentication with multiple Devise models

转载 作者:行者123 更新时间:2023-12-01 03:52:00 24 4
gpt4 key购买 nike

我创建了一个简单的 Ruby on Rails 4 应用程序,其中包含一些简单的模型和一个部署在我的测试 VPS 上的 PosgreSQL 数据库。然后我使用 Rails 生成器创建了三个设计模型。

我选择了单独的 Devise 模型,因为这些模型彼此完全不同。 single table inheritance方法是没有问题的。

我知道使用任何设计模型,我都可以在现场执行身份验证、注册“设计”用户等。这些东西有效。

现在我打算设置一个地方来制作我的授权东西。根据我使用 Google 的发现,我放弃了 CanCan,因为目前 Rails 4 不支持它。

所以我找到的最合适的选择就是使用 before_filter和自定义身份验证方法,依次检查 current_user类型或它的存在,并返回是否好去。

这是我已经尝试过的示例伪代码,它看起来有效。

before_filter :custom_authentication!

def custom_authentication!
if current_admin
redirect_to "admin_page"
elsif current_monkey
redirect_to "zoo"
elsif current_human
redirect_to "home"
else
# some unauthorised access alert
end
end

据我了解,我需要将这种代码放入 Rails 4 应用程序中的每个 Controller 中。那是对的吗?

我的主要问题是:有没有更好的方法来做到这一点?我想在 application_controller.rb 中放一个方法为访问我的应用程序 Controller 的每种类型的启用设计的用户模型构建整个授权逻辑。对于这种逻辑,那会是一个更好的地方吗?这是正确的方法吗?还是我需要重新启动并使用不同的方法?

最佳答案

在发现 Rails 4 不支持 CanCan 后,我在尝试找到用户授权解决方案时遇到了同样的问题。我选择的选项是 Pundit。它真的很灵活,而且效果很好。

https://github.com/elabs/pundit

基本上,您设置了一堆策略类来管理您的 Controller 操作的用户授权。

一个posts_controller 将有一个类似于这样的策略类:

class PostPolicy
attr_reader :user, :post

def initialize(user, post)
@user = user
@post = post
end

def update?
user.admin?
end
end

并且您将授权 Controller 中的更新操作:
def update
@post = Post.find(params[:id])
authorize @post
if @post.update(post_params)
redirect_to @post
else
render :edit
end
end

因此,如果用户不是管理员,则会引发错误。 Pundit 允许您挽救 ApplicationController 中被拒绝的授权,并允许您添加自定义代码。例如,您可以执行以下操作:
class ApplicationController < ActionController::Base
protect_from_forgery
include Pundit

rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

private

def user_not_authorized
if current_monkey
redirect_to "zoo"
elsif current_human
redirect_to "home"
else
flash[:error] = "You are not authorized to perform this action."
redirect_to request.headers["Referer"] || root_path
end
end
end

您还可以为同一策略类中的多个设计用户配置策略。例如,在 PostPolicy 类中,您可以检查用户的类型并基于此授予权限:
def index?
return true if user.type == "Monkey"
end

关于ruby-on-rails - Ruby on Rails 4 : authorisation after authentication with multiple Devise models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com