Gem 关于 devise,用户分类权限的问题

gechentuo · 2013年12月19日 · 最后由 shooter 回复于 2013年12月20日 · 4967 次阅读

我用了 devise 这个 gem,来快速完成用户模块的搭建。但是遇到了问题,不知到怎样去给用户不同的权限(或者让用户具有不同的类型),请大家帮帮忙

,项目的内容如下:

项目背景: 期末大作业,网上购物系统 shoppingmall

系统角色: 1.系统管理员 (MallManager) 2.店铺管理员(StoreManager) 3.普通用户

功能: 1.系统管理员 审批用户的开店申请 强制关闭店铺 2.店铺管理员 商品 (Item) 的增删改查 3.普通用户 申请开店 浏览商品 购买商品

devise 不是干这活儿的 它只管登录注册 试试 cancan /rolify 不用 rolify 的原因在 #32 说明了,因为本人不太常用

@shooter 那 devise 能和 cancan 一块用吗

简单的权限的话,只需要加一个不用的 model 就可以了,比如只有 admin 和 user,在只有 admin 可以访问的时候增加 befor_filter 就可以了, 如果设计复杂的权限,那就 cancan 吧

#4 楼 @hxplove01 如果是 3 种权限呢?

#5 楼 @gechentuo 那就多几个 if else

我一般是用几个表 1、roles,用户只有一个角色,users 包含 roler_id。如果是多个角色就加中间表 roles_users 2、operates,权限表,里面会描述 controller 和 action 的信息 3、menus,菜单,依赖哪些 operates

给角色分配权限,多少个角色都可以。给用户分配角色,用户就有角色的权限了。早期我的项目里还实现过 roles 有权限和 users 有权限,最后取并集,那更复杂。

3个 model,针对不同的 model 使用不同的 before_filter,最简单的做法。 如果复杂的情况简易用 cancan 另外,拒绝使用 if else,太丑了,

#3 楼 @liwei78 谢谢你,你给我的这个项目是同时整合了 devise, cancan, rolify 这三个 gem.怎样去理清出中间的关系,用到我的项目中呢?

其实就是普通用户 (User),管理账户(admin),假设 admin 中有一个 field 区分是其 level, 然后在 controller 中使用

before_filter :authenticate_user
before_filter :mall_scope, only: [:index]
before_filter :store_scope, only: [:show]

private

def mall_scope
  current_user.mall? ...blablabla
end

def store_scope
  current_user.store? ...blablabla
end 

在你的 controller 中,永远保持自己的 action 只有基本的 CRUD 标准 action,尽量不增加其他 action

#9 楼 @gechentuo 我是照着它一点点搬过来,需要什么拿什么,就熟悉它的细节了。

cancan 和 rails 4 的 strong_parameter 有兼容问题,而且确实已经很久没有维护了(master 上次改动是 9 个月前,2.0 被坑掉了),所以不推荐用 cancan 了 你的需求还算简单,可以用 before_action 来做访问控制。用户模型存角色

#10 楼 @hxplove01 我的 user 这个 Modle 是用 devise 生成的,我可以随便改 user 的表结构,增加字段吗?

#8 楼 @hxplove01 你觉得用多态取代表达式就没有 if else 了?

case user
when User
  can ...
when Admin
  can ...
end

#14 楼 @Rei 降低代码复杂度,简单易懂,每次重构的目标都是让代码看起来更舒服。取决于个人喜好,另外,也不喜欢 code climate 分值太低

#16 楼 @hxplove01 恩,谢谢了。我试着写写

#9 楼 @gechentuo 别整那么多,会晕的,看来我误人子弟了。 简单的需求就自己去完成,复杂的用下 cancan 吧。 使用 gem,得到的教训是学习成本高很多,定制起来还会很麻烦。

#19 楼 @shooter 不过还是谢谢你

#19 楼 @shooter cancan 处理的也是简单问题,复杂问题还是要自己设计实现。

#14 楼 @Rei 可以做成接口

class Admin < User
   ROLES = User::ROLES + [:create_group, :update_group]
   def can?(operation)
      ROLES.include? operation
   end
end

a_guest.can? create_group # => false
an_admin.can? :create_group # => true

通过 STI 来做是个好主意,可以避免 if..elsif..else cc @gechentuo

#22 楼 @jasl 用的时候不也是

if a_guest.can? create_group
  ...

#23 楼 @Rei 哈 对对... 不过我习惯是

return redirect_to '403' unless a_guest.can? :create_group
# do sth

这样能把结构弄扁

#24 楼 @jasl 所以我的意思是,多几个权限就多几个 if else,无论这个 if else 是用语句形式,还是多态形式,还是 before_filter 形式,最终都取决于自己怎么设计自己的系统,而不是觉得这有点复杂不如找个 gem 吧,这不省多少事。

#25 楼 @Rei 嗯,言之有理,刚才似乎理解错了 不过无论咋样,rails4 时代,还没有一个靠谱的访问控制 gem。。。

@Rei @jasl 如果网站注册功能呢?是不是交给 devise 就好了呢!@Rei 有没有比较好的权限的例子给一个看看呀~!

#1 楼 @shooter 一直觉得rolify 做权限管理足够了,求教这玩意有什么弊病或者无法做到的导致 rolify

#28 楼 @jarorwar 如果你的注册流程比较常规,devise 可以 否则我建议用 omniauth-identity 或者自己写 比如 knewone 正在做的新流程,用户通过 oauth 注册可以不输入邮箱、没有密码,注册登录通过 ajax,注册只需要输入密码无需确认密码等等,其实做完下来等于重新实现了 devise 控制器的部分,对 model 也有很大的 hack,于是就很痛苦...devise 的代码,一些部分还是不太容易理解的

#30 楼 @jasl 恩,研究下看看啦。谢谢

#29 楼 @dddd1919 我否定的原因是 一下给了 LZ 太多的选择,会耗费的精力,而我经常用 cancan,比较熟,自然... rolify 的权限控制颗粒度很细,不像 cancan 样硬编码到文件中。挺好的

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