我用了 devise 这个 gem,来快速完成用户模块的搭建。但是遇到了问题,不知到怎样去给用户不同的权限(或者让用户具有不同的类型),请大家帮帮忙
,项目的内容如下:
项目背景: 期末大作业,网上购物系统 shoppingmall
系统角色: 1.系统管理员 (MallManager) 2.店铺管理员(StoreManager) 3.普通用户
功能: 1.系统管理员 审批用户的开店申请 强制关闭店铺 2.店铺管理员 商品 (Item) 的增删改查 3.普通用户 申请开店 浏览商品 购买商品
简单的权限的话,只需要加一个不用的 model 就可以了,比如只有 admin 和 user,在只有 admin 可以访问的时候增加 befor_filter 就可以了, 如果设计复杂的权限,那就 cancan 吧
我一般是用几个表 1、roles,用户只有一个角色,users 包含 roler_id。如果是多个角色就加中间表 roles_users 2、operates,权限表,里面会描述 controller 和 action 的信息 3、menus,菜单,依赖哪些 operates
给角色分配权限,多少个角色都可以。给用户分配角色,用户就有角色的权限了。早期我的项目里还实现过 roles 有权限和 users 有权限,最后取并集,那更复杂。
3个 model,针对不同的 model 使用不同的 before_filter,最简单的做法。 如果复杂的情况简易用 cancan 另外,拒绝使用 if else,太丑了,
其实就是普通用户 (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
cancan 和 rails 4 的 strong_parameter 有兼容问题,而且确实已经很久没有维护了(master 上次改动是 9 个月前,2.0 被坑掉了),所以不推荐用 cancan 了 你的需求还算简单,可以用 before_action 来做访问控制。用户模型存角色
#8 楼 @hxplove01 你觉得用多态取代表达式就没有 if else 了?
case user
when User
can ...
when Admin
can ...
end
#9 楼 @gechentuo 别整那么多,会晕的,看来我误人子弟了。 简单的需求就自己去完成,复杂的用下 cancan 吧。 使用 gem,得到的教训是学习成本高很多,定制起来还会很麻烦。
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
return redirect_to '403' unless a_guest.can? :create_group
# do sth
这样能把结构弄扁