devise_invitable:仅允许管理员邀请用户

时间:2013-01-05 20:14:44

标签: ruby-on-rails devise routes devise-invitable

我正在使用devise_invitable gem在我的应用中启用邀请以及设计rails 3应用。我有User& Profile模型。在User中,有一个role列,它提供了用户类型。

现在,我想通过将此范围界定范围限定为devise/invitations#new user.role=='admin'&来限制创建新邀请的功能。打开其他人的路线。像这样的东西

MyApp::Application.routes.draw do

devise_for :users, skip: [:registrations, :invitations]

as :user do
 get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
  put 'users' => 'devise/registrations#update', as: 'user_registration'

# manually define alll devise_invitable routes, except devise/invitations#new

# accept_user_invitation GET /users/invitation/accept(.:format) devise/invitations#edit

# user_invitation POST /users/invitation(.:format) devise/invitations#create

# also the #accept route goes here

end



resource :profile, except: :destroy

authenticated :user, lambda {|u| u.role == "admin"} do

resources :user, controller: "user"

#only allow admin to invite other users

# new_user_invitation GET /users/invitation/new(.:format) devise/invitations#new

end

root to: 'profiles#show'

end

可能?另外,做同样事情的更好方法是什么?

2 个答案:

答案 0 :(得分:6)

一种简单的方法就是覆盖 ApplicationController 一侧的 authenticate_inviter!方法,如下所示:

class ApplicationController < ActionController::Base
  ...
  private
  def authenticate_inviter!
    unless user.role=='admin'
      redirect_to root_url, :alert => "Access Denied"
    end
    super
  end
  ...
end

将DeviseInvitable :: Inviter模块包含在您的用户模型中:

class User < ActiveRecord::Base
  ...
  include DeviseInvitable::Inviter
  ...
end

答案 1 :(得分:5)

如果单独留下标准路线并在Invitations控制器中使用 before_filter 来检查新的和创建操作的管理状态呢?

class Devise::InvitationsController < DeviseController
    ...
    before_filter :is_admin?, :only => [:new, :create]
    ...
end

看起来devise_invitable gem实际上也在内部使用了这个方法:

class Devise::InvitationsController < DeviseController
    before_filter :authenticate_inviter!, :only => [:new, :create]
    before_filter :has_invitations_left?, :only => [:create]
    before_filter :require_no_authentication, :only => [:edit, :update]
    ...
end

根据他们的Readme

  

要更改控制器的行为,创建一个继承自Devise :: InvitationsController 的控制器。可用的方法有:新建,创建,编辑和更新。在编辑任何这些操作之前,您应该阅读original controllers source

我只是复制他们的默认控制器并尝试添加我自己的自定义is_admin? before_filter在那里进行new和create操作。当然你还需要定义is_admin?过滤器调用之前的方法。