2010-12-02 3 views

Répondre

17

quelque chose comme ça dans votre routes.rb:

namespace :admin do 
    resources :users 
    end 

Voir http://guides.rubyonrails.org/routing.html pour plus de détails.

Ensuite, dans chaque contrôleur d'administration, vous aurez besoin d'un before_filter:

before_filter :authorized? 
def authorized? 
    #check if authorized here. 
end 
2
application_controller.rb 
before_filter :if_namespace_is_admin? 

def if_name_space_is_admin? 
    #now you should check to see if the namespace is from admin 
    #now you need namespaces because ruby ns confuse the f'out of me 
end 
9

Comme Todd mentionné, vous voulez ajouter un itinéraire des espaces de noms:

namespace :admin do 
    resources :users 
end 

Vous devez également mettre vos contrôleurs, vues, etc. dans les sous-dossiers de chacune de ces sections appelés "admin /". Si vous générez ce à partir de zéro, il est facile:

rails g controller admin/users 

Cela peut sembler assez compliqué, mais j'ai un article qui se promène à travers tout cela, avec un rail d'échantillons 3 application, vous pouvez télécharger pour jouer avec il:

Routing in Ruby on Rails 3

6

Ensuite, dans chaque contrôleur d'administration, vous aurez besoin d'un before_filter:

before_filter :authorized? 
def authorized? 
    #check if authorized here. 
end 

Je pense qu'il est préférable s'il place ce code dans un AdminController principal qui hérite d'ApplicationController, alors chaque contrôleur d'administration héritera de cet AdminController.

A propos Rails3, here est un bon article sur les itinéraires

3

Il est évident que ce que dit Todd est correct. Toutefois, si vous êtes un fan de sécurité supplémentaire par l'obscurité, vous pouvez aussi garder vos new_admin_user assistants url et Admin:: contrôleurs namespaced, mais fournir un chemin d'URL public moins largement utilisé avec les éléments suivants:

scope :module => "admin", :as => 'admin', :path => 'xyz' do 
resources :user 
end 

A rake route avec cette configuration montrera les routes le long de ces lignes:

new_admin_user GET /xyz/users/new(.:format) {:controller=>"admin/users", :action=>"new"} 

Je suppose que le seul acteur cela contrarierait est un attaquant peu sophistiqué qui a rampé et compilé un tas de sites Rails qui fournissent un accès système à admin/, mais je ne vois pas tout mal à oser être différent avec vos chemins de console d'administration vraiment.

37

Je préfère faire quelque chose de similaire à la réponse de Todd mais légèrement différente. Plutôt que d'ajouter le before_filter à chaque contrôleur lié à l'administration, je préfère créer un AdminController que tous les contrôleurs liés aux actions d'administration peuvent hériter de:

# config/routes.rb 
namespace :admin do 
    resources :users 
end 

# app/controllers/admin_controller.rb 
class AdminController < ApplicationController 
    before_filter :authorized? 
    private 
    def authorized? 
    unless current_user.has_role? :admin 
     flash[:error] = "You are not authorized to view that page." 
     redirect_to root_path 
    end 
    end 
end 

# app/controllers/admin/users_controller.rb 
class Admin::UsersController < AdminController 
    ... 
end 
Questions connexes