- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用其他人的代码,而且我对 Rails 相当缺乏经验,而且我在使用 CanCan & Devise 时遇到了问题。
当尝试登录时(使用我知道的凭据,因为它们以前有效并且我已经检查了数据库并成功使用了重置功能)我收到一个错误屏幕说明。
CanCan::AccessDenied in AdminController#index
You are not authorized to access this page.
app/controllers/admin_controller.rb:4:in `index'
config/initializers/quiet_assets.rb:6:in `call_with_quiet_assets'
在终端
Started POST "/users/sign_in" for 127.0.0.1 at 2012-11-14 13:13:01 +0000
Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"T8CJkCIEA3r7ROiknVp/vbEgeKCBZEjl3uYd+46G7no=", "user"=>{"email"=>"pass@user.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
WARNING: Can't verify CSRF token authenticity
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`email` = 'pass@user.com' LIMIT 1
(0.2ms) BEGIN
(0.3ms) UPDATE `users` SET `last_sign_in_at` = '2012-11-14 11:10:56', `current_sign_in_at` = '2012-11-14 13:13:01', `sign_in_count` = 219, `updated_at` = '2012-11-14 13:13:01' WHERE `users`.`id` = 1
(0.1ms) COMMIT
Redirected to http://core.lvh.me:3000/admin
Completed 302 Found in 355ms
Started GET "/admin" for 127.0.0.1 at 2012-11-14 13:13:02 +0000
Processing by AdminController#index as HTML
Completed 500 Internal Server Error in 265ms
CanCan::AccessDenied (You are not authorized to access this page.):
app/controllers/admin_controller.rb:4:in `index'
config/initializers/quiet_assets.rb:6:in `call_with_quiet_assets'
admin_controller.rb
class AdminController < ApplicationController
def index
authorize! :index, :admin (#line 4)
end
能力.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
case user.role_name
when "super_admin"
# can do everything
can :manage, :all
when "franchise_admin"
can [:read, :search, :all, :up_down_index], Article
can [:old_feed, :sites, :new_feed], MobileFeed
can [:new, :read, :update], SiteSpecificArticle, site_id: user.site_id
can [:index, :new_site_essentials], :admin
when "franchise_editor"
can [:new, :read, :update], SiteSpecificArticle { |ssa| ssa.site.customer.sites.include?(user.site) }
can [:old_feed, :sites, :new_feed], MobileFeed
can [:read, :search, :all, :up_down_index], Article
when "site_admin"
# can CRUD users for their site
can :manage, User, site_id: user.site_id
# can edit content for their site
can [:read, :update], ArticleSitePermission, site_id: user.site_id
can [:read, :update], CoreArticleSiteVisibility, site_id: user.site_id
can [:new, :read, :update], SiteSpecificArticle, site_id: user.site_id
can [:new, :read, :update], FrontPageCampaign, site_id: user.site_id
can [:new, :read, :update], FrontPageTimeBasedArticle, site_id: user.site_id
can [:new, :read, :update], FrontpageArticle, site_id: user.site_id
can [:index, :new_site_essentials], :admin
can [:read, :search, :all, :up_down_index, :hidden_in_this_site], Article
can [:old_feed, :sites, :new_feed], MobileFeed
can [:index, :create], TrackMood
can :site_styles, Site
when "editor"
# can edit content for their site
can [:read, :update], ArticleSitePermission, site_id: user.site_id
can [:read, :update], CoreArticleSiteVisibility, site_id: user.site_id
can [:new, :read, :update], SiteSpecificArticle, site_id: user.site_id
can :manage, FrontPageCampaign, site_id: user.site_id
can :manage, User, site_id: user.site_id
can [:new, :read, :update], FrontPageTimeBasedArticle, site_id: user.site_id
can [:new, :read, :update], FrontpageArticle, site_id: user.site_id
can [:old_feed, :sites, :new_feed], MobileFeed
can [:index, :new_site_essentials], :admin
can [:read, :search, :all, :up_down_index, :hidden_in_this_site], Article
can [:index, :create], TrackMood
can :site_styles, Site
else
# guest user (not logged in)
can [:read, :search, :up_down_index], Article
can [:old_feed, :sites, :new_feed], MobileFeed
can [:index, :create], TrackMood
can :site_styles, Site
end
end
end
如有任何帮助,我们将不胜感激。即使这只是尝试调试问题的又一步。
谢谢
最佳答案
Github 上的 CanCan wiki 指出:
“添加 authorize_resource 将创建一个调用 authorize! 的前过滤器,如果存在则传递资源实例变量。如果未设置实例变量(例如在索引操作中),它将传递类名。对于例如,如果我们有一个 ProductsController,它将在每个操作之前执行此操作。”
authorize!(params[:action], @product || Product)
您的问题是您试图授权 :admin 符号的 :index 操作,而实际上您必须授权 admin 对象或模型,如下所示:
authorize!(:index, @admin)
我想你误解了授权!方法并尝试为角色 :admin 授权索引操作,但所有 CanCan 内容都是基于 current_ability 授权的,这应该是在登录后在用户 session 上设置的第一件事。 CanCan 可以用这个默认的 ApplicationController 方法为你做这件事:
def current_ability
@current_ability ||= Ability.new(current_user)
end
但这意味着您需要另一个名为 current_user 的方法来返回当前用户 (doh)。检查你是否有这个设置,如果没有然后设置它并将 :admin 更改为 @admin (你必须实例化它,我认为它类似于 current_user.admin
(?) )。
还有一件事:如果您像这样进行授权只是为了调试,没问题,但是如果您实际上想像这样手动授权每个操作,请不要这样做。 CanCan 有一个名为 load_and_authorize_resource
的方法,它既为 Controller 的每个操作授权 current_user,也实例化变量 @model,例如 @products,到:Product.accessible_by(current_ability)
。当您拥有用户只能在某些情况下查看或管理的内容(例如编辑他们自己的个人资料)时,此方法非常有效。当然,您必须在 ability.rb 文件中进行设置。这个方法是这样的:
class AdminController < ApplicationController
load_and_authorize_resource
def index
# @admins here will have every admin that the user can see
end
end
如果您有一些不需要授权的操作,您可以说:
load_and_authorize_resource, :only => [:action1, :action2]
load_and_authorize_resource, :except => [:action1, :action2]
或者还有:
load_and_authorize_resource
skip_authorize_resource, :only => [:action1]
skip_authorize_resource, :except => :action2 #can be both an array or single symbol
我希望这对您和任何遇到此问题的人有所帮助:)
关于ruby-on-rails - CanCan 错误地拒绝管理员访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379610/
如何为 CanCan 设置角色,以及如何将这些角色分配给用户?我现在至少希望在注册时有一个下拉菜单,供用户选择他们的角色。我对所有文档都不太确定,我似乎一直想念这个,但非常感谢任何帮助! 最佳答案 这
我正在努力实现 CanCan。出于某种原因,当我尝试获取有关模型权限的具体信息时,CanCan 不断给我拒绝访问。我不明白为什么。 有没有办法让 CanCan 变得具体,也许在日志中或在开发中关于为什
假设您正在为 Blogger 编写软件。 每个用户只有在他们是博客的所有者时才能创建博客文章。在这种情况下,CanCan 通常会将能力检查定义为: user.can? :create, Post 但是
第三天我很痛苦,我不明白为什么我没有通过下一个测试: 4) Error: ArticlesControllerTest#test_should_get_index_if_admin: CanCan:
我想为我的 User 模型添加额外的属性,并且不想创建单独的 Profile 模型。我正在尝试使用来自 RESTful 操作集的标准 «update» 更新自定义字段: class UsersCont
我在 Rails 4 中工作,并且根据 this issue 中的说明让 CanCan 工作得很好,除了我认为可能相对常见的一个用例。 我有一个 Comment 模型,其中 has_many :com
我正在尝试在 spree 中授予一些自定义角色特定权限。在任何地方都找不到这个答案 角色能力.rb class RoleAbility include CanCan::Ability def in
我如何在事件管理员和 cancan 中使用范围。 我有管理员用户并且那些与机构有(has_one)关系 和机构有很多简介 现在,当管理员用户登录时,我想显示所有具有相同机构的个人资料。 发现以下链接没
我有可以选择通过其他资源访问的资源,就像这样 resources :projects do resources :tasks end resources :tasks 如果任务是通过项目访问的,我
我已经使用Devise和CanCan启动了Rails应用程序。我有与文章具有一对多关系的用户。我是CanCan的新手,这是我打算做的事情: 管理员 可以对文章采取任何措施 登录用户 可以阅读和创建文章
我正在使用 Rails 设置一个非常基本的 Web 应用程序,我已经设置好设计并开始工作。 我现在的问题是,无论我登录的是谁,我都可以查看和销毁我上次登录的帐户的内容。 我只需要两种类型的角色,成员和
我有一个 发表 带有 :published 的型号属性( bool 值)和 用户 带有 role 的型号属性(字符串)。共有三个角色:ROLES = %w[admin publisher author
我正在尝试将 cancan 合并到我的第一个 Ruby on Rails 应用程序中。 我在入门时遇到问题...这肯定是一些基本问题。 我的应用程序有一个项目列表,用户可能有权也可能没有权限查看其中任
我的问题是关于在以下上下文中定义 cancancan 能力。 我有一个通用模型,其中包含用户和公司实体之间的多对多关系 class User {:users => {:id => user.id}}
我目前在我的网络应用程序中使用 cancan,到目前为止它运行良好,但我遇到了一个关于 Rails 中嵌套资源的问题。当访问索引页面时,cancan 不会限制用户看到其他登录用户可以看到的内容。它在显
我正在使用其他人的代码,而且我对 Rails 相当缺乏经验,而且我在使用 CanCan & Devise 时遇到了问题。 当尝试登录时(使用我知道的凭据,因为它们以前有效并且我已经检查了数据库并成功使
我的问题是关于在以下上下文中定义 cancancan 能力。 我有一个通用模型,其中包含用户和公司实体之间的多对多关系 class User {:users => {:id => user.id}}
我有带有 Cancan 1.6.9 的 Rails 3 应用程序进行授权。我想将能力类转换为 JSON。这是我的能力类。 # encoding: utf-8 module Ability def
我已经为此苦苦挣扎了一段时间,终于到了 CanCan 似乎不允许您授权一组记录的地步。例如: ads_controller.rb def index @ads = Ad.where("ads.
我无法解决 CanCan gem 的问题。在我的 Controller 中,我有“确认”操作,这是“预订”资源的成员路由。我不想在此操作中通过 CanCan 授权资源,所以我在 Controller
我是一名优秀的程序员,十分优秀!