2017-05-03 2 views
0

私はdevilsをレールアプリにインストールしました。ユーザーがログインしている場合、他のすべてのユーザー編集ページにアクセスできます。Deviseはユーザーを編集するために正確なIDを制御しません

たとえば、私はuser_id 2です。ユーザー1/3/4/5のプロフィールを編集することができます。経路内で手作業でパラメータを変更すると、編集できます。ここで

私のアプリコントローラー:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_action :authenticate_user! 

    before_action :configure_permitted_parameters, if: :devise_controller? 

    def configure_permitted_parameters 
    # For additional fields in app/views/devise/registrations/new.html.erb 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :company, :position, :office_phone, :mobile_phone, :address, :description, :radius, :photo_company_logo, :photo_presentation, photos_projet_1: [], photos_projet_2: [], photos_projet_3: [], photos_projet_4: []]) 

    # For additional in app/views/devise/registrations/edit.html.erb 
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :company, :position, :office_phone, :mobile_phone, :address, :description, :radius, :photo_company_logo, :photo_presentation, photos_projet_1: [], photos_projet_2: [], photos_projet_3: [], photos_projet_4: []]) 
    end 
end 

ここに私のユーザーコントローラー:ここ

class UsersController < ApplicationController 

    skip_before_action :authenticate_user!, only: [:index, :show] 
    before_action :set_user, only: [:show, :edit, :update] 

    def index 
    @client = Client.new 

    @users = User.all 
    @users = User.where.not(latitude: nil, longitude: nil) 

    @hash = Gmaps4rails.build_markers(@users) do |user, marker| 
     marker.lat user.latitude 
     marker.lng user.longitude 
    end 

    end 

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

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    @user.save 

    redirect_to users_path 
    end 


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

    def update 
    @user = User.find(params[:id]) 
    @user.update(user_params) 

    redirect_to user_path(@user) 
    end 


    private 

    def user_params 
    params.require(:user).permit(:company, :first_name, :last_name, :position, :mobile_phone, :office_phone, :email, :address, :description, :radius, :nettoyage_toiture, :photo_company_logo, :photo_presentation, photos_projet_1: [], photos_projet_2: [], photos_projet_3: [], photos_projet_4: []) 
    end 

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

end 

ミューUserモデル:

class User < ApplicationRecord 
    has_attachment :photo_presentation 
    has_attachment :photo_company_logo 
    has_many :projects, dependent: :nullify 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
    #geocoder for google maps 
    geocoded_by :address 
    after_validation :geocode, if: :address_changed? 
end 

ここに私のルート:

Rails.application.routes.draw do 
    ActiveAdmin.routes(self) 
    devise_for :users 
    root to: 'pages#home' 
    resources :users do 
    resources :projects 
    end 
    resources :clients, only: [:new, :create, :show] 
    mount Attachinary::Engine => "/attachinary" 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
end 

ありがとうございました!

+0

あなたのルートも共有できますか? – whodini9

+0

whodiniこんにちは、ここに私のルート:ユーザー ルートへ: 'ページ番号ホーム' 資源: – Tana

+0

Rails.application.routes.draw ActiveAdmin.routes(自己) devise_forを行うプロジェクト エンド リソース:ユーザーが リソースを行います:クライアント:[:new、:create、:show] マウントAttachinary :: Engine => "/ attachinary" #このファイルで利用できるDSLの詳細については、http://guides.rubyonrails.org/を参照してください。 routing.html end – Tana

答えて

1

Deviseは認証ライブラリです。権限の問題があります。だから、あなたは認可のために何かを使うべきです。私はCanCanを使用します。これを使うと、このような権限を定義することができます。

can :edit, User, id: current_user.id 

あなたが別のライブラリを習得したくない場合、あなたは常にあなたのコントローラにゲットー・承認を行うことができます。

class UsersController 
    before_action :can_edit_only_self, only: [:edit, :update, :destroy] 

    private 

    def can_edit_only_self 
    redirect_to root_path unless params[:id] == current_user.id 
    end 
end 

*認証 - 私はあなたが誰であるか知っている

*承認 - 私はあなたが、問題はこれです

1

を行うことを許可されているか知っている:

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

def update 
    @user = User.find(params[:id]) 
    @user.update(user_params) 

    redirect_to user_path(@user) 
end 

ユーザーが他のユーザーを編集できるようにしたくない場合は、この2つの方法は必要ありません。あなたは、端末内の前の編集やタイプrake routesを作る場合、あなたは工夫が編集者のためのコントローラのアクションを提供することを確認する必要がありアップデート

resources :users, except: [:edit, :update] do 
    resources :projects 
end 

を:また、あなたのルートファイルがに変更することができます。 :idパラメータなしのusers/editである必要があります。 Devise :: RegistrationsControllerでは、編集メソッドは現在ログインしているユーザーのアカウント情報を編集するためのヘルパーメソッドcurrent_userを使用するだけです。

あなたが管理者ユーザーの他のユーザーが編集できるようにしたいんなら、あなたは約これらの宝石で

  1. Can Can
  2. Pundit

次宝石のを読みたいと思うでしょうロールに基づいて他のユーザーを編集できるユーザー "ロール"を定義することができます。また、これらの宝石を使用して、他のリソースの作成、読み取り、更新、削除の許可を与えることもできます。

+1

「これらの2つの方法は必要ありません」 - ユーザーは自分の情報を更新することはできません。 –

+1

ターミナルに 'rake routes'と入力すると、Deviseがユーザーを編集するためのコントローラアクションを提供するはずです。 ':id'パラメータなしで' users/edit'にする必要があります。 Devise :: RegistrationsControllerでは、編集メソッドは、現在ログインしているユーザのアカウント情報を編集するために 'current_user'レコードを使用するだけです。私はこの情報で私の答えを更新します –

関連する問題