我有一个Devise用户模型,其属性为admin类型为boolean。如果admin = true,我如何在我的控制器中指定只希望某些操作可用?以下授权方法是否有效?
def authorize
redirect_to login_url, alert:"Not authorized" if current_user.admin == false
end
这是我的Users表,admin是一个布尔值。
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.boolean "admin", default: false
t.string "image_file_name"
t.string "image_content_type"
t.integer "image_file_size"
t.datetime "image_updated_at"
t.string "name"
end
使用Pry:
在authorize_admin方法内输出current_userNameError: undefined local variable or method `current_user' for :authorize_admin:Symbol
我正在使用设计,所以不应该current_user工作?
以下是控制台中User.first的输出:
#<User id: 1, email: "email@gmail.com", encrypted_password:
"$2a$10$RCgzx7PJho4vegbf8Z04eumTGB1RyDl5YvDeCAMz7g3...", reset_password_token: nil,
reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 5,
current_sign_in_at: "2014-10-25 23:42:17", last_sign_in_at: "2014-10-23 00:57:07",
current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at:
"2014-10-10
19:24:39", updated_at: "2014-10-25 23:42:17", admin: false, image_file_name: nil,
image_content_type: nil, image_file_size: nil, image_updated_at: nil, name: nil>
答案 0 :(得分:1)
如果admin = true,我如何在我的控制器中指定只希望某些操作可用?
您可以使用rails before filter
来实现它。 您可以在应用程序控制器中定义授权方法,这将使所有控制器都可以使用此方法。
class ApplicationController < ActionController::Base
private
def authorize
redirect_to login_url, alert:"Not authorized" if current_user.try(:admin) == false
end
end
现在在控制器内部,您可以在过滤器之前设置要授权的方法。
class HomeController < ApplicationController
before_action :authorize, only: [:your_action_name]
def your_action_name
#some action
end
end
如果您的代码有很多自定义功能,具体取决于管理员和普通用户,那么您还可以使用cancancan
答案 1 :(得分:0)
我使用Declarative Authorization gem来控制用户对控制器操作的访问权限并强烈推荐它。它允许您设置用户类别,然后控制哪个组可以访问哪些控制器操作。它功能强大,灵活且易于设置。