测试 cancancan 权限管理遇到的小问题

helapu · 2017年06月22日 · 最后由 helapu 回复于 2017年06月28日 · 6559 次阅读

最近开始一个新项目,当然上 Rails5.1。权限管理使用常规武器 cancancan

权限配置问题如下,非常简单

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.permission.to_sym == :manager
      can :manager, :all 
    else
      can :read, :all
    end

  end
end

但是遇到一个问题,在编辑任何的资源的时候都提示没有权限,我赶紧去看看 2.0 版本到底更新了啥,wiki 反复核对了好几遍!! 没有找到,怀疑人生了。去喝杯水回来,问题搞定,非常简单。不知道你们看出来了没有,正确的配置是这样的

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.permission.to_sym == :manager
      can :manage, :all
    else
      can :read, :all
    end

  end
end

特写一下

can :manage, :all # manage => not manager!!!

自己还是缺乏啊,浪费了两个小时,哎。

说说那些让你爱上的坑吧,我一定吸取教训的。比如测试啊,debug 的能力什么的

哎 自己傻 一个单词写不清楚

这不怪你,程序没写好,应该报错的。

chenge 回复

我觉得也不怪楼主,一个是这个 symbol 的话,不是方法或者变量,即使没有定义静态分析也不会报错。然后这个 manage 和 manager 也都是合法单词,拼写检查也不会报错,所以就悲剧了。

adamshen 回复

昨天我由此想到一个新名词:软阻,取自电阻的概念。不好的软件软阻大,也就是俗称的坑。

好的软件:接口简单不容易错,错了也能很快报告。量化不超过半个小时。

楼主可以去 github 报告,看有没有响应。

另外要注意可能会发生

undefined method `to_sym' for nil:NilClass

的情况

chenge 回复

有的时候这也没办法,毕竟每种解决方案都要在灵活性和严谨性之间找到一个平衡点。

如果一个项目禁止大家使用 ruby 的黑魔法,可能不太容易出错,但是冗余代码一定很多,抽象层次也会更深。

ruby 好不容易在传统 oo 和 dsl 之间找到了一种微妙的平衡,所以我们必须要承受这种自由带来的负面影响。

有的回路虽然软阻大,但是线路短,这样的回路说不定也是不错的。

adamshen 回复

不是魔法的问题。主要是不重视,软阻的两个来源,一个是文档,另一个更重要的就是参数检查和及时准确地报错。其实很简单,就一行代码的事情。

毕竟是免费的开源软件,需要大家共同努力去改进。

gyorou 回复

这个也是的 对于这种情况我一般是在数据库那个地方设置默认值 一定不会在代码里到处判断

chenge 回复

文档写的挺好的 自己没有从那复制代码 而是手动敲入的 导致的问题

helapu 回复

是代码没有检查,你有兴趣的话可以参与改进。

通常增加一行检测,就可以避免类似的烦恼了:raise ‘Error' unless [:manage, :read].include?(param)

我以前别的地方也遇到过。

chenge 回复

我用这个思路做一下

chenge 回复

忘了一点 这个权限是支持自定义的

can :whateveryouwant, :all 

所以会比较麻烦一点儿 以后自己还是注意点 仔细点吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号