CanCan을 어셈블리 모델이 없는 컨트롤러에 어떻게 사용합니까?

6447 단어 cancan

묘사

달력을 생성하고 표시할 수 있는 달력 컨트롤러가 하나 있는데 달력 모형이 없습니다.컨트롤러에서 "load and authorize resource"를 사용하면 실패하고 "uninitialized constant"오류가 발생합니다.이 경우 "load and authorize resource"를 사용하지 말아야 한다는 것을 깨달았지만, CanCan 보호 컨트롤러를 어떻게 해야 할지 정말 몰랐습니다.
내가 간단한 것들을 놓쳤나?
보기:http://railscasts.com/episodes/192-authorization-with-cancan질문 42와 44는 더 많은 세부 사항과 다른 관점을 알고 있습니다.

토론 #1

너는 하나before_filter나 모든 동작에서 이런 일을 할 수 있니?
unauthorized! if cannot? :read, :calendar
물론 정확한 방법으로 바꿔야 한다:read.

토론 #2

이 문제를 해결하는 방법 중 하나는load 와authorize 자원에 +class+ 옵션을 사용하여 관련이 없을 수 있는 다른 모델을 가리키는 것이다.단점은 능력모델에서 대리모델을 어떠한 신분 검증 목적에도 사용할 수 없지만 내 경우(달력 사용)에는 큰 문제가 되지 않는다는 것이다.
나는 최종적으로 능력 모델 자체를 에이전트 클래스로 사용하고 사용자 규칙에'can:read,Ability'를 포함했다.그것은 나의 요구를 만족시킬 수 있을 것 같다.내가 안전 구멍을 열 수 있는 뭔가를 빠뜨린 거 아니야?아니면 내가 하고 싶은 일을 할 수 있는 더 좋은 방법이 있을까?

토론 #셋

응, 내 :class => Ability 해커 프로그램은 효과가 있어.읽기만 하는 것이 아니라 권한을 적용해야 할 때, 권한이 붕괴된다.예컨대.내 Admin::ImportControl(관리자가 데이터베이스로 데이터를 가져올 수 있음)에 있을 때 모든 사용자가 들어갈 수 있습니다.(
모이트: 저는 사용할 수 없다고 생각합니다before_filter. 왜냐하면 :calendar는 아직 정의가 없고 권한이 없기 때문입니다/
젠장, 생각보다 어려운 일이야.어쩌면 내가 문제를 잘못했을지도 몰라...
업데이트: 사실이 증명하듯이, 나는 :class => Admin 나의 Imports 컨트롤러 (기타 관리 컨트롤러) 에 사용할 수 있으며, 그것은 매우 잘 작동한다.히드록시 메틸 멜라민 메틸 에테르...나는 내가 너의 문제를 완전히 이해했는지 아닌지 확실하지 않다.

토론 #4

모델은 있지만 CalendarController 모델은 없습니다.컨트롤러에 대한 접근을 제한하려고 합니다.그런가요?
CanCan은 사용 권한을 정의할 때 모델 클래스 대신 기호를 사용할 수 있습니다.그래서 너는 이렇게 할 수 있다.
학급 능력
...
can:읽기,:달력
끝맺다
class CalendarController < ApplicationController
  before_filter(:only => [:index, :show]) { unauthorized! if cannot? :read, :calendar }
  ...
end
그리고 Calendar 방법을 사용하지 마세요.load_and_authorize_resource오, 그럼 종류가 아닌 기호를 사용할 수 있겠어?!나는 이것이 결국 쓸모가 있을 것이라고 생각한다.
Thanx!
Richard

토론 #5

molte에서 언급한 바와 같이 대상이나 클래스가 아닌 것에 대한 권한을 정의하려면 기호를 사용할 수 있습니다.

토론 #6

이런 상황에서 사용할 수 있는 기호가 있으면 불편하다. 이것은 컨트롤러 등급의 권한을 확보하고 같은 이름을 가진 모델에 의존하지 않는다.
예컨대
공인 리소스:리소스=>:컨트롤러
Calendar Controller라는 컨트롤러에서 컨트롤러는:calendar를 검사하고 activerecord 동작을 실행하지 않습니다.나는 가능한 패치가 파손되지 않았다면 패치를 찾고 있었다.

토론 #7

컨트롤러에 있는 필터를 사용하기 전에 상술한 방법을 시도했지만
정의되지 않은 방법 "불가"...
can, cannot는 동작 내부에서만 사용할 수 있고 외부에서만 사용할 수 없는 것 같습니다.
어떻게 해야 할지 아시는 분?

토론 #8

스컬리: 내 포크를 시험해 봐도 돼:

토론 #9

나도'rnhurt'와 같은 문제에 부딪혔어. 상응하는 모델이 없는 컨트롤러를 권한을 주고 싶어.예를 들면 다음과 같습니다.
일반: 제품 컨트롤러 때 제품 모델.
내 사례: 도구 컨트롤러는 조수 방법만 포함하지만 도구 모델은 없습니다.
나는 구글에서 대부분의 문서를 검색하고 보았지만 해결 방안이 없었다.(elisehuard는 해결 방안을 제공했지만 현재 버전 1.4.0에는 없습니다.)
마지막으로 내가 이 문제를 해결할게. 이 컨트롤러에 공백 모델을 정의하기만 하면
클래스 도구
끝맺다
능력을 정의합니다.
예: 관리, 도구 # 또는 불가능...
완성!

토론 #10

@sg552 클래스가 아닌 기호를 전달하고 1.4.0에서 이 기호에 대한 권한을 정의할 수 있어야 합니다. 이것은 도움이 되지 않습니까?
나는 이 표를 열고 그것을 문서로 표시할 것이다.모형wiki 페이지가 없는 컨트롤러가 있었으면 좋겠어요.

토론 #11

@ryanb,
당신의 회답에 감사 드립니다. 당신이 언급한 해결 방안은 저에게 아무런 작용이 없습니다.

준비:

  • 에는 "ToolsController"가 있는데 그에 상응하는 모델이 없고 SQL 생성과 같은 보조 방법만 포함한다.
  • 에는 관리자, 관리자
  • 의 두 가지 역할이 있습니다.

    나의 기대:

  • 관리자가 "관리"가능
  • 관리자는 ToolsController
  • 만 관리할 수 있음

    1호 구현 시나리오가 작동하지 않습니다.

    class ToolsController < ApplicationController
      # this will throw an exception:  
      authorize_resource :resource => :controller 
    end
    
    class Ability
      include CanCan::Ability
      def initialize(user)
        if user.blank?
          # anonymous could do nothing but login
        elsif user.admin?
          can :manage, :all
        elsif user.maintainer?
          can :manage, :tools
        end
      end
    end
    
    나는 예외를 하나 얻었다. 이것은 내가 본 가장 좋은 예외이다.
    CanCan::ImplementationRemoved, 
    The :resource option has been renamed back to :class, use false if no class.
    
    따라서 적절한 코드를 다음과 같이 변경합니다.
    class ToolsController < ApplicationController
      authorize_resource :class => :controller
    end
    
    또는
    class ToolsController < ApplicationController
      authorize_resource :class => false
    end
    
    CanCan::AccessDenied 예외를 제거합니다.

    두 번째 실행 가능한 실시 방안은 저녁 식사 시간에 심지어 자기 전에 이 해결 방안을 고려한 적이 있다. -)

    class ToolsController < ApplicationController
      authorize_resource 
    end
    
    #used for cancan, a blank model.
    class Tool
    end
    
    class Ability
      include CanCan::Ability
      def initialize(user)
        if user.blank?
          # anonymous could do nothing but login
        elsif user.admin?
          can :manage, :all
        elsif user.maintainer?
          can :manage, Tool
        end
      end
    end
    

    내 환경:


    윈도우즈 XP(Linux는 집에), rails 2.3.5, 루비 1.8.7, cancan 1.4.0

    토론 #12

    @sg552, 응, 전달

    토론 #13

    까지false가 올바른 방법일 거야.이렇게:
    클래스ToolsControllerauthorize_resource:class=>false
    끝맺다
    #능력
    can:관리,:도구
    그것은 쓸모가 없습니까?:class 네, 효과가 있어요!감사합니다!
    나는 초보자들이 이 예가 RDoc에 나타나는지, 아니면 그들에게 WIKI 페이지를 주는지 이해하는 것이 가장 좋다고 생각한다.: -)

    토론 #14

    네, 더 잘 기록하기 위해 표시를 했습니다.

    토론 #15

    이 점은 현재 Non Restful Controllers위키 페이지에 더 좋은 기록이 있다.

    토론 #16

    @ryanb
    만약 컨트롤러에 명칭 공간이 있다면, 나는 이렇게 쓸 수 있습니까?
    클래스 Admin::ToolsControllerauthorize_resource:class=>false
    끝맺다

    유능하다


    can:manage,[:admin,:tool]

    토론 #17

    @ryanb 감사합니다.
    클래스ToolsControllerauthorize_resource:class=>false
    끝맺다

    유능하다


    can:manage,:tool

    토론 #18

    @choyno
    승인 리소스:class=>:도구
    이것도 효과가 있어!

    토론 #19

    @ryanb가 작동합니다!!!감사합니다!

    토론 #20

    @molte 고마워요. 책상에 머리를 부딪쳤어요.

    토론 #21

    클래스가 아닌 기호를 전달할 때, 능력 중의 블록이 조건에 부합되는지 확인하기 위해 어떤 방식으로 파라미터를 전달할 수 있습니까?

    좋은 웹페이지 즐겨찾기