2013-03-18 4 views
0

Я пытаюсь настроить так, чтобы пользователи получили сообщение «не авторизованное», если они нажмут редактирование для профиля, который не принадлежит им. Это сообщение должно, конечно, не появляться для администраторов, так как админы могут редактировать все профили. Я ранее делал это на Permission.rb, однако я избавился от файла, чтобы перейти с более основными пользовательскими ролями/авторизацией.Отказ от неавторизованных пользователей от редактирования профиля

Я не вижу, как я могу реализовать то, что у меня было ранее на Permission.rb для моих текущих файлов. Я пробовал некоторые решения, но они не складываются. Если кто-то может указать мне в правильном направлении, это будет здорово. Также я делаю все это с нуля, аутентификация/авторизация пользователя.

index.html.erb:

<% @users.each do |user| %> 
    <li> 
     <% if current_user.admin? || current_user == @user %> 
     <% end %> 
     <%= link_to "Edit #{user} profile", user %> 

      | <%= link_to "delete", user, method: :delete, 
              data: { confirm: "You sure?"} %> 
     </li> 
     <% end %> 
+0

Извините, что я сделал это сегодня утром, но это был еще один вопрос. Спасибо за указание. – pwz2000

+0

Посмотрите на мое редактирование в конце ответа. Вы слишком быстро положили свой «<% end %>». – Zippie

ответ

1

Почему вы даете возможность пользователям редактировать другие профили народов?

Во-первых, вы должны иметь оператор if, на котором вы видите ссылку для страницы редактирования. Я предполагаю, что это отражается на профиле каждого пользователя, так что я предполагаю, что код в ваш контроллер что-то вроде этого:

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

Тогда, по вашему мнению, вы должны иметь что-то вроде этого:

<% if current_user.admin? || current_user == @user %> 
    <%= link_to 'Edit Profile' , edit_user_path(@user) %> 
<% end %> 

Существует также случай, если кто-то пытается «сила» их путь в, так же, как пытается ввести URL www.yourapplication.com/users/6/edit вы могли бы написать метод before_filter в контроллере:

before_filter :check_privileges, only => [:edit, :update] 

, а затем написать метод в называется check_privileges

def check_privileges 
    unless current_user.admin? || current_user.id == params[:id] 
    flash[:warning] = 'not authorized!' 
    redirect_to root_path 
    end 
end 

EDIT: После того, как спрашивающий редактировать его код, я показываю ошибку:

Вы ставите end слишком рано:

<% @users.each do |user| %> 
    <li> 
     <%= link_to user.name, user %> 
     <% if current_user.admin? || current_user == @user %> 
      <%= link_to "Edit #{user} profile", user %> 
      | <%= link_to "delete", user, method: :delete, 
              data: { confirm: "You sure?"} %> 
     <% end %> 
    </li> 
<% end %> 
+1

Кроме того, я рекомендую взглянуть на эту онлайн-книгу, а именно на этот раздел: http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#sec-authorization – gabrielhilal

+0

отличный ресурс! :) – Zippie

+0

Я еще не добавил часть привилегий. Но ваше первое решение только блокирует людей от просмотра страницы/users, если они не вошли в систему. Если у пользователя есть логин, он все равно может редактировать профили, даже если это чужой. Теперь, когда у меня есть настройки страниц, вы переходите к/users и перечисляете всех зарегистрированных пользователей. На этой странице вы нажмете имя пользователя, и оно приведет вас к/users/ID, где вы можете просматривать/редактировать профиль (я еще не создал шаблон, который выводит только информацию профиля). Поэтому вместо этого он не должен позволять никому, кто не является владельцем, просматривать/редактировать профиль. – pwz2000

Смежные вопросы