【问题标题】:Routes based role management in railsRails 中基于路由的角色管理
【发布时间】:2015-06-13 10:24:06
【问题描述】:

我正在构建一个用户角色管理系统。它有一个Permission 模型和一个Role 模型。 Role has_many permissionsUser has_many roles。所以我们需要permsissionsroles 的CRUD。

我正在考虑一种不同的方法。如何在我的应用程序中获取所有路由并从中创建权限?基本上权限是去路径的权限,我们在路由中有一个路径列表。

我能够获得我的应用程序中的所有路由,例如

Rails.application.routes.routes.to_a

但我无法在任何地方看到这种方法。您对此有何看法?请分享您的建议。提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 permissions roles rails-routing


    【解决方案1】:

    如果您想在每个路由的基础上施加权限,请为application_controller 中的每个角色创建方法,以检查用户是否对其具有相应的权限并进行重定向或其他操作。在您想要的控制器和操作的before_action 上使用它..

    【讨论】:

    • 这使得添加新角色变得很困难,因为您必须为此编写代码。不是吗?
    • 如果您想进入每个路线级别的访问控制,可以。如果出现新角色,您只需在要限制的地方添加到 before_action 中。只需稍作调整,您根本不必为各个角色编写单独的方法。
    • 这让我每次添加路由时都要编写代码。我希望管理员在没有开发人员帮助的情况下从 UI 中选择权限。
    【解决方案2】:

    您检查过https://github.com/ryanb/cancan 吗?使用此 gem,您可以在多个模型中定义角色并处理禁止的资源

    【讨论】:

    • 如何让用户在角色中添加/编辑权限并将其分配给使用 cancan 的用户?或者,我如何从用户端生成能力?
    • @mukesh 如果模型中有权限字段,即使在另一个表中,您也可以使用它并像 Bart Jedrocha 之前告诉您的那样与 cancan 结合。
    【解决方案3】:

    我认为您所描述的是cancancan 的完美用例。有了它,你就定义了一个能力等级

    class Ability
      include CanCan::Ability
    
      def initialize(user)
        # See the wiki for details:
        # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
        if user.admin?
            can :manage, :all
        elsif user.contributor?
            can :manage, [Post]
        else
            can :read, :all
        end
      end
    end
    

    然后可用于控制控制器级别的访问

    class PostsController < ActionController::Base
      load_and_authorize_resource
    end
    

    这将允许 adminscontributors 访问所有操作(因为管理员可以管理所有资源,而贡献者可以管理帖子),而其他用户只能访问 read 仅操作(索引、显示)。当然,您也可以在资源级别控制访问。

    【讨论】:

    • 感谢@bart 的回复。但是除了编码之外,我怎么能从用户端添加一个能力呢?我希望它就像管理员可以从检查列表中选择一些权限并将它们保存为角色一样,以便可以为用户分配这些角色。可以用cancancan吗?
    • cancancan 专门以特定用户的能力为中心。如何定义这些能力取决于您。话虽如此,您可以轻松地对其进行调整以满足您的需求。例如,在能力类中,您可以执行以下if user.role.permissions.include?(:whatever) 来决定用户可以访问哪些资源。
    猜你喜欢
    • 1970-01-01
    • 2016-06-12
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多