2013-07-01 24 views
5

Sono nuovo a Ruby on Rails, attualmente voglio usare Devise gem per il sistema di autenticazione. Il sistema deve avere solo l'amministratore può elencare gli utenti e creare un nuovo utente. (Ho aggiunto il ruolo di amministratore aggiungendo il campo booleano di admin al modello User generato da Devise). Uso Rails 3.2, Ruby 1.9.3 e l'ultima gemma Devise.Rails Devise authenticatate_user non funziona

Tuttavia, i codici elencati di seguito non impediscono agli utenti non autenticati di accedere a azioni specifiche (indice, nuovo e creazione).

# users_controller.rb 
class UsersController < Devise::RegistrationsController 
    before_filter :authenticate_user!, only: [:index, :new, :create] 
    before_filter :is_admin, only: [:index, :new, :create] 

    def index 
    end 

    private 

    def is_admin 
    current_user.admin? 
    end 
end 

==

# config/routes.rb 
App::Application.routes.draw do 
    root to: 'static_pages#home' 

    get '/about', to: 'static_pages#about' 

    devise_scope :user do 
    get '/users', to: 'users#index' 
    end 

    devise_for :users, controllers: { sessions: "sessions", registrations: "users" } 
end 

Il metodo authenticate_user! non funziona (per esempio, gli utenti non autenticati possono ancora accedere al /users o /users/sign_up), ma anche non solleva eccezioni. Ho fatto delle ricerche ma non ho idee sul perché. Per favore aiuto.

PS. Mi scusi per il mio inglese.

UPDATE

Grazie per tutte le risposte. Aggiornerò is_admin per funzionare correttamente come indicato.

Ma il problema principale qui è che gli utenti non registrati possono passare il filtro authenticate_user! in primo luogo (e generare un'eccezione sul metodo is_admin poiché current_user qui sarebbe nullo).

# Here non logged in users does not redirect to sign in page when access to, 
# for example, /users or /users/sign_up. 
before_filter :authenticate_user!, only: [:index, :new, :create] 

Mi dispiace per non essere ovvio.

+0

Utilizzare gemma [CanCan] (https://github.com/ryanb/cancan). – Hauleth

+0

Controlla la mia risposta aggiornata – bluehallu

+0

Grazie mille ragazzi. Cercherò. –

risposta

4

Dalla documentazione testamentaria:

Devise creerà alcuni helper da usare all'interno del tuo control lleri e punti di vista. Per impostare un controller con autenticazione dell'utente, basta aggiungere questo before_filter:

before_filter :authenticate_user! 

Per verificare se un utente ha eseguito l'accesso, utilizzare il seguente aiuto:

user_signed_in? 

Per l'attuale utente che ha effettuato l'accesso, questo helper è disponibile:

current_user 

Quindi,: authenticate_user! renderà disponibili tutti gli altri helper sul controller (purché li inserisca in: before_filter), ma è ancora responsabilità dell'utente definire la logica per gli utenti firmati/non firmati!

Tenere presente che Devise è una soluzione di autenticazione, non un'autorizzazione. Se devi gestire l'autorizzazione (sembra che tu lo faccia) senza scrivere tutta la logica, usa qualcosa come CanCan, che funziona meravigliosamente insieme a Devise.

+0

Grazie a te :). Vorrei votare su tutti qui, ma ho appena firmato questo sito e ho poca reputazione, mi dispiace per quello. –

+0

Per quanto ne so, hai gli stessi limiti di me per il voto. Benvenuto nel sito e non dimenticare di accettare la risposta che pensi sia la migliore! – bluehallu

0

Utilizzando if..else dichiarazione sul is_admin metodo

before_filter :authenticate_user!, only: [:index, :new, :create] 
before_filter :is_admin, only: [:index, :new, :create] 

private 

def is_admin 
if user_signed_in? 
    if current_user.admin? 
    true 
    else 
    redirect_to some_path 
    end 
else 
    redirect_to login_path 
end 
end 
+0

Grazie per la risposta veloce. Il codice funziona per reindirizzare gli utenti non amministratori (grazie per averlo notato). Ma il mio primo problema è che gli utenti non registrati possono passare il filtro "authenticate_user!" All'accesso all'indice, new o create action (e quindi sollevano eccezioni su "is_admin?" Poiché "current_user" qui è nil). Grazie comunque. –

1

Ovviamente è necessario verificare la presenza di un utente sessione valida e quindi procedere come segue ..

def is_admin 
    if current_user.nil? 
    redirect_to_some_path 
    else 
    if current_user.admin? 
     true 
    else 
     redirect_to some_path 
    end 
    end 
end 
Problemi correlati