restful_authentication :/

Witam!

Mam następujący problem: chciałbym, żeby użytkownik po zalogowaniu mógł przeglądać profile innych userów (users/:id), a niezalogowany - localhost:3000/:login. Męczę się z tym od wczoraj, niby takie łatwe, ale ciągle coś nie wychodzi

[code=ruby]class UsersController < ApplicationController

before_filter :niezalogowany, :only => [:name, :new, :create]
before_filter :zalogowany, :only => [:show, :edit, :update]
before_filter :redaktor, :only => [:index, :destroy, :enable]

def show
@user = User.find(params[:id])
end

def name
@user = User.find_by_login(params[:id]) #czy params[:login] - nie dziala :confused:
end

end[/code]
show.html.erb<h2>User: <%=h @user.login %></h2> Mail: <%= @user.email %> Skąd: <%=h @user.location %> ...
name.html.erb<h2>User: <%=h @user.login %></h2>
routes.rb[code]
map.resources :users, :member => { :enable => :put } do |users|
users.resource :account
users.resources :roles
end

map.name ‘/:id’, :controller => ‘users’, :action => ‘name’[/code]
Wywołanie (jeśli user jest niezalogowany): localhost:3000/admin lub localhost:3000/users/name/admin - działa, jednak gdy próbuje zalogować się, to pokazuje się błąd:

NoMethodError in Users#name
You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.login
Extracted source (around line #2):

User: <%=h @user.login %>

Ma ktoś jakieś pomysły, jak rozwiązać ten problem?

Pozdrawiam

  1. zaimplementuj metody, do których się odwołujesz w filtrze (zalogowany, niezalogowany, redaktor)
  2. restful auth implementuje za Ciebie metodę login_required do zastosowania w filtrze, która dodatkowo wywołuje metodę authorized? w kontrolerze, w kontekście którego się znajduje; na przykład:

before_filter :login_required def authorized? (!current_user.nil?) && (current_user.rights > 0) end
3) jeśli szukasz rozwiązania do autoryzacji opartej na filtrach, polecam to:
http://blog.aenima.pl/2008/12/8/base-auth-a-complete-tutorial-to-securing-your-rails-application
jako osoba odpowiedzialna w firmie za ten plugin i troszku w nim pogrzebawsza służę pomocą (w rozsądnych ilościach oczywiście :wink: )

Ee no, bez przesady, o takich podstawowych rzeczach przecież nie zapomniałem (mimo, iż mój nick może wskazywać co innego :P). Metody są ok, jak dam: before_filter :zalogowany, :only => [:name, :show, :edit, :update], to niezalogowany user (wpisując np. localhost:3000/admin) od razu zostanie wywalony do root_path, więc filtry działają perfekycjnie :wink:

Punkt 3, dzięki, zapoznam się jutro z tym pluginem :slight_smile:

A pytanie dalej aktualne, nikt nie wie, jak rozwiązać ten problem?

Pozdrawiam

sorry za double post, problem rozwiązany, postawiłem projekt od nowa, potem zrobiłem jak poprzednio, tylko dodałem :collection

map.resources :users, :collection => { :name => :get }, :member => { :enable => :put } do |users|
users.resource :account
users.resources :roles
end

i map.name ‘/:id’, :controller => ‘users’, :action => ‘name’ dałem po (nie wiem, czy to ma jakieś znaczenie :/)

map.resource :session
map.resource :password

Pozdrawiam

Mam plugin restful_authentication. Chciałem zrobić ograniczenie dostępu dla zwykłego uzytkownika. Robiłem wszystko jak podano w książce “Agile. Programowanie w Rails”. W /controllers/application.rb dodałem prywatną metodę “authorize”: [code]class ApplicationController < ActionController::Base
include AuthenticatedSystem
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details

private
def authorize
unless User.find_by_id(session[:user_id])
flash[:notice] = “Please log in”
redirect_to(:controller => “sessions”, :action => “create”)
end
end

Scrub sensitive parameters from your log

filter_parameter_logging :password

end[/code]
w /controllers/users_controller.rb dodałem “before_filter : authorize”
a w sessions_controller.rb dodałem “before_filter : authorize, except => :create”
W związku z tym mam problem. Gdy chce włączyć stronę logowania, przekierowuje mnie na /session i występuje błąd: “Nieprawidłowe przekierowanie”. Czy ktoś kiedyś miał podobny problem niech da znać.

zostaw książke i zobacz screen cast, najlepiej wszystkie jakie są na interesujący cię temat. Przepisz, zastosuj, dostosuj i będzie ok