Beperk gebruikers alleen toegang tot hun profielen met behulp van Devise

I have currently set my app so that on successful sign in the app redirects the user to their profile at localhost:3000/users/id however if I am the first user id => 1 and type users/2 I have full access to this profile. I have been trying to find how to stop this using devise. I'm pretty new to rails so I'm sure I'm missing something simple, I have used the before_filter :authenticate_user! but this is obviously just checking if a user is signed in, but doesn't limit access to other users' profiles. I have read a bit on CanCan but this seems a bit overkill for what I am trying to achieve. Any pointers much appreciated.

users_controller.rb

class UsersController < ApplicationController
  before_filter :authenticate_user!
  before_filter :user_authorization

  def index
    @users = User.all
  end

  def show

    @user = User.find(current_user[:id])

  end


  private

     def user_authorization
        redirect_to(root_url) unless current_user.id == params[:id]
     end
end 

Dit wordt gemeld vanaf de server:

Started GET "/users/2" for 127.0.0.1 at 2012-06-24 13:00:38 +0200
Processing by UsersController#show as HTML
  Parameters: {"id"=>"2"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 2]]
Redirected to http://localhost:3000/
Filter chain halted as :user_authorization rendered or redirected
Completed 302 Found in 20ms (ActiveRecord: 0.8ms)
2
gebruik de current_user methode. zie het document
toegevoegd de auteur vlain, de bron

3 antwoord

In je controller:

class UsersController < ApplicationController
  before_filter :validate_user, :only => :show

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


  def validate_user
    redirect_to courses_path unless current_user.id.to_s == params[:id]
  end

end

Let op de current_user.id.to_s aangezien current_user.id een geheel getal is en params [: id] een tekenreeks is.

3
toegevoegd
Bedankt voor de .to_s!
toegevoegd de auteur tomd, de bron

In het algemeen zou ik zeggen dat er twee benaderingen zijn om dit soort problemen op te lossen:

  1. Uw eigen code laten rollen en controles implementeren in uw controllers (of mogelijk in uw modellessen) en
  2. een edelsteen gebruiken die regels voor u afdwingt

Als u zelf een rol wilt spelen, is de eenvoudigste manier om eenvoudig controles in uw controller in te voeren om ervoor te zorgen dat ze worden omgeleid als ze naar een profiel kijken dat niet van hen is. Een manier om dit te doen met een eerder filter is dit, hoewel je het wilt aanpassen aan het gedrag dat logisch is voor je app.

  before_filter :validate_user
  def validate_user
    redirect_to home_path unless current_user and current_user.id == params[:id]
  end

Als je een edelsteen wilt gebruiken, raad ik cancan aan zoals je hebt genoemd of een andere edelsteen genaamd Handelingen als huurder. Ik heb het voor soortgelijke dingen gezien. Maar als u alleen het gebruikersprofiel wilt vergrendelen, werkt het toevoegen van code aan de controller waarschijnlijk goed.

2
toegevoegd

En voilà:

  before_filter :user_authorization

  private

     def user_authorization
        redirect_to(root_url) unless current_user.id == params[:id]
     end

current_user is een helper die de huidige aangemelde gebruiker bevat.

1
toegevoegd
Bedankt, maar dit werkt niet. Ik heb het in de user_controller en de application_controller geprobeerd, en evenmin gestopt met het bekijken van andere profielen?
toegevoegd de auteur Tom, de bron
Bedankt, maar dit lijkt nu gewoon terug te leiden naar het rootpad voor alle /users/id . Ik heb mijn code hierboven toegevoegd om te zien of er iets fout is gegaan.
toegevoegd de auteur Tom, de bron
fixed, miss redirect
toegevoegd de auteur vlain, de bron