使用CanCan
,可以在全局load_and_authorize_resource
(before_filter
)中调用application_controller
辅助方法。这将确保所有ActiveAdmin控制器操作本身也得到授权。
但是对于Pundit
,没有这样的load_and_authorize_resource
辅助方法。所有Pundit文档和教程都谈到在每个动作中调用authorize
。我可以在每个动作中调用授权。但在ActiveAdmin中,默认情况下不会公开操作。我应该打开每个控制器中的每个操作,然后拨打authorize
,然后拨打super
?
这似乎不对。那么,有人可以告诉我如何使用Pundit授权ActiveAdmin中的操作吗?
更新:
我知道Pundit授权适配器。我正在使用AA的主分支,我已经配置了AA以使用Pundit适配器,如here所述。我的问题是:如何使用适配器?只需设置config.authorization_adapter = ActiveAdmin::PunditAdapter
,它是否会自动调用ActiveAdmin中每个操作的授权?我不这么认为。
例如,在CanCan中,即使设置了config.authorization_adapter = ActiveAdmin::CanCanAdapter
,您仍然必须将load_and_authorize_resource
设置为全局的before_filter,以便自动授权所有AA操作。
答案 0 :(得分:2)
ActiveAdmin的master现在包含一个Pundit授权适配器。如果您使用的是ActiveAdmin的主分支,则可以轻松使用Pundit。否则,您可以手动将现有pundit_adapter.rb添加到旧版ActiveAdmin,但可能需要更多工作。
有关如何添加适配器的更多上下文和详细信息,请参阅ActiveAdmin PR #2857。
在ActiveAdmin设置为使用Pundit授权适配器后,它会检查默认资源操作的授权:show,index,edit,update,new,create,destroy。任何自定义操作都必须手动授权。
要检查的一个细节是您的Pundit策略定义了ActiveAdmin所期望的方法。可以使用template作为起点。 ActiveAdmin authorization docs也可能会有所帮助。