Edytowanie rekordu bez autoryzacji

W jaki sposob moge umozliwic uzytkownikowi bez konta edytowanie komentarzy ktore wczesniej dodal. Przykladowo guest stworzy komentarz i chce umozliwic mu przez 30 minut mozliwosc edycji.

Możesz zapisywać id dodanych komentarzy w sesji. Później wystarczy tylko sprawdzić czy id komentarza jest w sesji i czy został stworzony w ciągu ostatnich 30 minut.

http://railscasts.com/episodes/119-session-based-model

Dokładnie o to pytasz

można zrobic taki model na podstawie UserSession którego uzywa authlogic ? przykładowy wygląda tak:

class UserSession < Authlogic::Session::Base consecutive_failed_logins_limit 10 failed_login_ban_for 1.hour end
a tworzenie

@user_session = UserSession.new(:email => params[:user][:email], :password => params[:user][:password]) @user_session.save

A nie bezpieczniej wykonać tego na podstawie adresu IP ? Wtedy nawet po zamknięciu przeglądarki i otwarciu jej ponownie można dalej zmieniać swoje komentarze przez określony przez nas czas.

W ten sposób algorytm będzie o wiele krótszy i prostszy w zaimplementowaniu niż też pokazany tutaj: http://railscasts.com/episodes/119-session-based-model

PS: Trzymanie hasła w sesji jest złym rozwiązaniem. Osobiście nie polecam tego typu praktyki.

Adres IP… oj to nie jest dobry pomysł.

Pani Zosia napisała komentarz ze swojego stanowiska w firmie. Pan Włodzimierz wszedł na tą samą stronę i zmienił komentarz. Wszystko za sprawą wspólnego adresu IP.

A trzymanie hasła w sesji… nie wydaje mi się to konieczne. Wszystkie dane w domyślnych Railsowych sesjach ciasteczkowych są podpisane, użytkownik ma więc niezwykle utrudnioną próbę ich modyfikacji. Jeszcze lepiej kiedy dane sesji przechowywane są w jakiejś bazie danych.

Ja bym po prostu zapisał ID nowego rekordu do sesji użytkownika.

BTW: Wydaje mi się żę już podobny temat był kiedyś na forum, proponuję poszukać.

Moim skromnym zdaniem temat wyczerpał gotar z linkiem do railscasta, w którym jest zaimplementowane dokładnie coś takiego, o co pytał lewy313.

Dzieki wszystkim za pomoc :slight_smile:

A co powiesz na to że nie każdy ma DSLa ze stałym IP? Jest NAT, gdzie kilka osób jest widzianych przez serwer pod jednym IP. Jest również nerwostrada, gdzie za chwilę ktoś może mieć Twoje IP. Nie, nie jest to dobry pomysł.

Update: ups, spóźniłem się z tym postem. Sorki :wink:

Udalo mi sie stworzy testowy projekt wzorowany na podanym wyzej railscast. W swojej aplikacji uzywam authlogic(authorization) declarative_authorization(authentication)



class UserSession < Authlogic::Session::Base def initialize(session) @session = session @session[:comment_ids] ||= [] end end
Extracted source (around line #11):
Powyzszy kod wyswietla wrong number of arguments (2 for 1)

8: <div id="post_menu"> 9: <%=h post.user_id %> 10: <%= link_to "Show", post %> 11: <%= link_to "Edit", edit_post_path(post) if permitted_to? :edit, post%> 12: <%= link_to "Destroy", post, :confirm => 'Are you sure?', :method => :delete if permitted_to? :destroy, post%> 13: </div> 14: <div id="post_content">
Blad wyskakuje na pierwszej linijce w ktorej uzylem metody ktora dostarcza declarative_authorization. W jaki sposob mozna dodac cos do sesji ktora jest tworzona przez authlogic. Przegladalem dokumentacje ale nic nie znalazlem :confused:

Tak wyglada sesja w konsoli

s = UserSession.new(:login => "admin", :password => "root") => #<UserSession: {:login=>"admin", :password=>"<protected>"}>
Tak jest tworzona sesja

[code=ruby]class UserSessionsController < ApplicationController
def new
@user_session = UserSession.new
end

def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = “Successfully created user session.”
redirect_to user_albums_path(current_user)
else
render :action => ‘new’
end
end

def destroy
@user_session = UserSession.find
@user_session.destroy
flash[:notice] = “Successfully destroyed user session.”
redirect_to root_path
end
end[/code]