9

A have a bunch of controllers with the Admin namespace. I want to restrict access to these unless the user is an admin. Is there a way to do this using CanCan without having to call unauthorized! in every method of every controller?

Cœur
  • 37,241
  • 25
  • 195
  • 267
Kyle Decot
  • 20,715
  • 39
  • 142
  • 263

3 Answers3

8

Add an application controller to your namespace and a before filter to it.

class ApplicationController < ActionController::Base
end

class Admin::ApplicationController < ApplicationController 
  # these goes in your namespace admin folder
  before_filter :check_authorized

  def check_authorized
    redirect_to root_path unless can? :admin, :all
  end
end

class SomeadminController < Admin::ApplicationController
   def some_action
     # do_stuff
   end
end
bbonamin
  • 30,042
  • 7
  • 40
  • 49
mark
  • 10,316
  • 6
  • 37
  • 58
1

The Admin Namespaces wiki page for CanCan lists out several solutions to this problem.

  • As @mark suggested, have a base controller for admins which checks authorization for every action.
    • You may not need to use CanCan at all for this if all you require is to check that users have an admin flag.
  • For handling admins differently from each other (as opposed to differently from regular users only), consider a separate AdminAbility class (this is a little off-topic, but could prove relevant).
Caleb Hearth
  • 3,315
  • 5
  • 30
  • 44
0

now rails_admin has full support with Cancan, you can find it in its official website, there is a wiki page for this topic:

Rails Admin's authorization with CanCan:

Siwei
  • 19,858
  • 7
  • 75
  • 95