CanCan 호출 확인
묘사
리안,내 동료 한 명이 컨트롤러에서 권한을 테스트하고 있다.나는 "그렇게 할 필요가 없다. 이 능력 파일은 모든 일을 처리할 수 있다"고 말했지만, 나중에 나는 "응, 컨트롤러에 캔캔 방법이 한 번도 호출되지 않았다면 어떡하지..."라고 생각하기 시작했다.
그렇다면 화이트리스트 컨트롤러가 안전하다고 생각합니까?그것들은 권한을 부여할 필요가 없다.
내 지사는 다음과 같은 세부 정보를 제공합니다.
http://github.com/justinko/cancan/tree/cancan_safety
니 생각을 알려줘.
토론 #1
이것은 흥미로운 생각이지만, 나는 이것이 기본이어야 한다고 생각하지 않는다. 왜냐하면 Home Controller나 Info Controller가 REST 모델을 따르지 않을 수도 있기 때문이다. 나는 모든 사용자에게 추가cancan_safe
를 요구하고 싶지 않다. 단지 CanCan이 그들의 응용 프로그램에서 일하도록 하기 위해서이다.(편집: 이제 알겠어요. 기본값으로 만들고 싶지 않아요. 이 부분을 무시해도 돼요.)즉, 모든 컨트롤러가 권한을 부여받을 수 있도록 수동으로 이 기능을 사용하면 이 기능의 장점을 볼 수 있다.현재, 당신은
@current_ability
실례 변수의 존재를 검사함으로써 이 점을 실현할 수 있습니다.# application_controller.rb after_filter :ensure_cancan_used def ensure_cancan_used raise "CanCan not used in this controller action." unless instance_variable_defined?(:@current_ability) end
Will that work for your case? I think this would make a nice wiki tip.
토론 #2
My code needs some work, it has some issues. I was very tired when I wrote it.
hmmm..... I don't think unless instance_variable_defined?(:@current_ability)
will work because some controllers, like "home" or "info" will not call authorize_resource
, therefore @current_ability will never be defined.
And as you caught, ensure_cancan_safety!
allows this feature to be optional.
Can you think of another way to do this without adding code? I cannot.
P.S. load_resource
would not add @_cancan - don't know what I was thinking...
토론 #셋
Woops, was logged into the wrong github account.
토론 #4
The authorize!
method should bypass the safety message, this way manual authorization works as well.
I'll give this some thought and see if there are any alternatives ways to handle this. In the meantime I'd like to hear feedback from others as well.
토론 #5
adding check_authorization and skip_authorization controller class methods to ensure authorization is triggered (thanks justinko) - closed by 1af6c6f395602019b079e457e00f33815398fefc
토론 #6
Unfortunately this doesn't work with engines ...
토론 #7
@voxik, do you mean that engines will inherit this behavior so they will always fail? If one is using engines I think it's worth creating a subclass of ApplicationController
that all local controllers inherit from. Here you can place code that you want to effect your app without effecting engines.
토론 #8
Yes, that is exactly what I meant. If I will follow your advice, then the advantage of check_authorization method is lost again and you should test it again if you did not forget. But something like
check_authorization :except => SomeEngineController
내 관점에서 볼 때, 아마도 이 문제를 더욱 잘 해결할 수 있을 것이다.토론 #9
@voxik, 이렇게 하면 됩니까?SomeEngineController.skip_authorization
You could place this anywhere after the engine is available, maybe in an initializer.
토론 #10
Sounds good for me
토론 #11
It should work at the moment, try it out and let me know if not.
토론 #12
It doesn't work for me. Actually the mentioned engine is Devise, so what I am tried to do is adding:
Devise::SessionsController.skip_authorization
디자인 마지막에rb가 초기화되었지만 성공하지 못했다토론 #13
. 이상하다.그것은 오류를 보고합니까? 아니면 권한을 건너뛰지 않습니까?토론 #14
오류 없음...난 일 안 해.토론 #15
나는 이 문제를 다시 토론하고 그것을 더욱 연구할 것이다.기사 고마워요.토론 #16
@voxik, 내 디자인의 끝에 이 줄을 추가합니다.rb 초기화 파일이 저에게 유효합니다.너는 그것이 너에게 적합하지 않다고 확신하니?서버를 추가한 후 다시 시작해야 합니다.토론 #17
같은 질문을 봤어요. 디자인: 세션 컨트롤러.skip 라이센스가 Desive 끝에 추가됩니다.rb가 잘못되었습니다. 초기화되지 않은 상수 세션 이상을 받았습니다.CanCan 1.4, Desive 1.1.3 및 Rails 3.0토론 #18
@msaffitz, 이 항목을 추가한 후 서버를 재부팅하시겠습니까?토론 #19
네.나는 몇 차례 서버를 다시 시작하려고 시도했다.토론 #20
@msaffitz, 나는 방금 네가uninitialized constant Session
오류를 얻었다는 것을 깨달았어. 이것은 CanCan이 그 컨트롤러에 세션 모델을 불러오려고 했기 때문이야?skip_authorization
호출은 건너뛰기check_authorization
에만 사용되며 load_and_authorize_resource
가 아닙니다.나는 이곳의 혼란을 깨달았기 때문에, 나는 이름을 skip_authorization_check
또는 비슷한 이름으로 바꿀 수도 있다.실제 라이센스 건너뛰기 관련 질문 #164 참조
토론 #21
@ryanb: 사실 네가 옳았어. 일할 수 있었어. 하지만 서버가 다시 시작된 후 처음이었어:) 그래서 쓸모가 없었어.토론 #22
@voxik, 응, 첫 번째 요청 후에 왜 리셋되었는지 알고 싶어요.개발 중인 클래스를 다시 불러올 때 before 필터를 지울 수도 있습니까?응, 연구를 좀 해야겠어.생각이 있는 사람이 있으면 저에게 알려 주세요.토론 #23
네, 다시 불러오는 것이 문제입니다.디자인 초기값 설정 항목은 한 번만 호출됩니다. 따라서 디자인::SessionController는 처음 실행할 때만 수정됩니다.이후에 이 클래스는 삭제되고 다시 파일에서 다시 불러옵니다. 수정할 필요가 없습니다.놓다
module Devise
class ConfirmationsController < ApplicationController; skip_authorization; end
class PasswordsController < ApplicationController; skip_authorization; end
class RegistrationsController < ApplicationController; skip_authorization; end
class SessionsController < ApplicationController; skip_authorization; end
class UnlocksController < ApplicationController; skip_authorization; end
end
응용 프로그램 끝에서 컨트롤러를 누르십시오.rb가 이 문제를 해결했다.나는 더 깨끗한 해결 방안이 있는지 확실하지 않지만, 이것은 나에게 효과가 있는 것 같다.토론 #24
이것은 나에게 효과가 없다.Desive 컨트롤러의 작동에는 문제가 없지만 다른 컨트롤러에서 다른 작업을 수행하면 다음과 같이 말합니다.클래스 확인 컨트롤러의 클래스가 일치하지 않습니다
어떻게 된 건지 알아요?
토론 #25
사실 네가 맞았어.나는 지금 다음과 같은 방법을 사용하고 있다.before_filter {|controller| controller.instance_variable_set(:@_authorized, true) if controller.devise_controller? }
그것은 섹시하지는 않지만 매우 유용하다.토론 #26
이 문제를 끝낸 것은 최초의 게시물에서 제기된 문제가 해결되었기 때문에 부작용일 뿐이고 엔진의 행동을 덮어씌울 좋은 곳이 없기 때문에 개방적인 것이다.만약 누군가가 여전히 이 문제를 가지고 있다면, 단독 문제를 발표해 주십시오. 그러면 우리는 이 특정한 주제를 더욱 잘 해결할 수 있습니다.
토론 #27
voxiks 트랙 공사Reference
이 문제에 관하여(CanCan 호출 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/135텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)