관건: 중첩된 자원은 여전히 접근할 수 있습니다

4641 단어 cancan

묘사

은 CanCan wiki의 원래 지침을 따릅니다. - Nested Resources은 불필요한 행동을 초래할 수 있습니다.
CanCan은 params[:project_id]에서 제공된 항목에 대한 액세스 권한을 확인합니다.이것은 여전히 임무 검사를 우회할 가능성이 있다는 것을 의미한다.프로젝트 #5를 읽었다고 가정합니다.상위 항목에 관계없이 projects/5/tasks/47으로 이동하면 작업 47이 표시됩니다.
이 문제를 해결하려면 항상 before 필터에 다음 내용을 설정하십시오
@project = @task.project if @task
나는 위키 페이지를 업데이트했지만, 당신의 동의가 있어야만 대중에게 이런 건의를 제공할 수 있습니다.
많은 사이트들이 이런 방식으로 공격을 받을 수도 있다.

토론 #1

wiki를 따라 :through 옵션을 사용하여 load_and_authorize_resource을 찾으면 @project.tasks.find(params[:id])을 사용하여 작업을 찾을 수 없습니다.프로젝트에 속하지 않은 작업을 불러오려고 하면 ActiveRecord::RecordNotFound을 받을 수 있습니다.

토론 #2

네.load_and_authorize_resource through: :project을 놓치지 않았지만 아래 코드가 CanCan 비헤이비어를 덮어썼습니다.
문제는 다음과 같습니다.
# WRONG DEFAULT (generated by rails generate ...)
# Use callbacks to share common setup or constraints between actions.
def set_task
  @task = Tasks.find(params[:id])
end
이것은'Rails 마법'의 한 개념이다.나는 이 점을 의식하지 못했다.
몰라요.아마도 Controller Authorization Example - CanCan Wiki에서 이 문제를 언급하면 누군가를 도울 수 있을 것이다.당신은 어떻게 생각합니까?

토론 #셋

발전기가 지금 이렇게 하는 줄 몰랐어요.너는 당연히 제기할 수 있다
위키에서.
2014년 8월 30일 토요일, 자이조[email protected]쓰기:

OK. I was not missing the load_and_authorize_resource through: :project, but the following code has overwritten the CanCan behaviour. The problem was, that I used this for loading:

잘못된 기본값 (rails 새 프로젝트에서 생성)

콜백을 사용하여 작업 간에 공통 설정 또는 구속을 공유합니다.

def set_task @task = Tasks.find(params[:id]) end

This is a consequnece of the 'Rails magic'. I didn't realize this.

I don't know. Maybe mentioning this problem in Controller Authorization Example - CanCan Wiki https://github.com/ryanb/cancan/wiki/Controller-Authorization-Example could help someone. What do you think?

— Reply to this email directly or view it on GitHub https://github.com/ryanb/cancan/issues/1014#issuecomment-53967224.



윌 그레
테네시주 내슈빌

토론 #4

비트 페이지 Controller Authorization Example은 이번 호와 관련하여 업데이트되었습니다.

토론 #5

이 문제에 대한 해결 방안이 있습니까?
내 프로그램에서 사용자는 다른 사용자의 항목 인덱스 페이지에 접근할 수 있습니다.(표시된 페이지가 예상대로 차단됨).예를 들어 사용자 2는 여전히 users/3/educations으로 이동할 수 있습니다.
EducationsController은 다음과 같습니다.
  load_and_authorize_resource :user
  load_and_authorize_resource :education, through: :user, only: [:index, :show, :new, :edit, :destroy]
  before_action :set_education, only: [:show, :edit, :update, :destroy]
  before_action :set_user
    # Use callbacks to share common setup or constraints between actions.
    def set_education
      @education = Education.find(params[:id])
    end

    def set_user
      @user = User.find(params[:user_id])
      #@user = current_user
    end

토론 #6

@dkonayuki 네, set_education 함수와 필터를 삭제합니다.Cancan은 @education을 설정합니다.

토론 #7

네, 했습니다.그것은 작용하지 않는다.
마찬가지로 show 페이지에 접근할 수 없습니다.그러나 색인 페이지는 항상 표시됩니다.
이것은 능력의 관련 부분이다.rb:
블록에 정의된
      can :manage, Education do |e|                     # only owner can manage his educations
        e.user == user
      end

토론 #8

기능은 #accessible_by과 호환되지 않습니다.이것들은 모두 위키에 묘사되어 있다.https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks.조건 해시 (예: can :manage, Education, :user_id => user.id) 를 사용하거나 SQL 세션을 제공해야 합니다.
사용자가 교육 기록에 대한 읽기 권한을 가지고 있다면 색인 페이지에 접근할 수 있습니다.나는 네가 그곳의 기록을 필터하고 싶다고 가정한다.

토론 #9

답변 감사합니다.
그러나 이런 것들은 모두 효과가 없다.(블록 및 조건 해시)
그나저나 저는 rails 4를 사용하기 때문에 # 속성에 접근할 수 있는 #이 없습니다.
그리고 교육도 사용자 전유에 속하기 때문에 다른 사용자가 다른 사용자의 교육에 접근할 수 있는 권한이 있어서는 안 된다.

토론 #10

나는 이 문제를 해결할 방법을 생각해냈다.인덱싱 작업에 load_and_authorize_resource이 아닌
educations = @user.educations
authorize! :index, educations

좋은 웹페이지 즐겨찾기