rspec의 "CanCan::AccessDenied"오류
9495 단어 cancan
묘사
"간판 컨트롤러"의 나의rspec 코드가져오기: 편집 작업 설명
전에
# Spree가 자동으로 첫 번째 사용자를 생성하므로
#관리자가 작성되었습니다. 아래 컨텍스트에서 비관리자가 필요합니다.
#이렇게 하면 우리는 권한 부여를 테스트할 수 있다
사용자창조!(Factory.attributes_for(:user))
끝맺다
let(:product) { Factory(:daily_deal) }
context "for a logged-in User" do
context "that is the creator of the product being edited" do
before(:each) do
sign_in product.creator
get :edit, :id => product.id.to_s
end
it { should respond_with(:ok) }
it { should render_template(:edit) }
end
context "that is not the creator of the product being edited" do
before(:each) do
sign_in Factory(:user)
end
it "raises an authorization error" do
expect { get :edit, :id => product.id.to_s }.to raise_error(CanCan::AccessDenied)
end
end
end
context "for a non-logged-in User" do
it "raises an authorization error" do
expect { get :edit, :id => product.id.to_s }.to raise_error(CanCan::AccessDenied)
end
end
끝맺다목록 컨트롤러의 코드
정의 편집
render:template=>@product.매일 거래아이템/편집 daily deal': 아이템/편집 gift card
끝맺다
이것은 다음과 같은 오류를 표시합니다
Listings Controller GET: 로그인한 사용자가 편집 중인 제품의 작성자가 아닌 경우 편집이 승인 오류를 유발합니다.
실패/오류: 예상 {get:edit,:id=>product.id.to s}. 오류 발생(CanCan::AccessDenied)
예상 CanCan::AccessDenied
만약 당신의 능력
토론 #1
을 아는 사람이 있다면 저에게 회답해 주세요.rb?토론 #2
나는 이 능력을 뛰어넘고 있다.이렇게제1단원 설계사
클래스 능력 편집기
CanCan 포함: 기능
def initialize(user)
can(:create, Product) if user.can_sell?
can :update, Product do |product|
user == product.creator
end
can :destroy, Product do |product|
user == product.creator
end
end
끝맺다끝맺다
능력class eval {register ability OneDesign Company::AbilityDecorator}
토론 #셋
목록이나 응용 프로그램 컨트롤러에 load_and_authorize_resource
또는 다른 권한 수여 방법이 있습니까?아니면 편집 작업이 권한 수여에서 제외되었을 수도 있습니까?로그인하지 않은 사용자에 대해 통과했습니까?토론 #4
내 공시 컨트롤러 중불러오기 및 권한 수여 자원:class=>Product,:instance name=>"Product",:only=>[:new,:edit,:destroy]
토론 #5
를:only => [:new, :edit, :destroy]
로 바꾸시겠습니까?네가 필요할 수도 있으니까:except => :index
:update
해볼게토론 #6
지금 나도 오류를 얻었어.내 목록 controller spec에서 전체 코드는 다음과 같습니다.
spec helper 필요
Listings Controller의 작업 설명
"획득:신규"방법 설명
컨텍스트 "영업 가능한 사용자"란 무엇입니까?
let(:user_who_can_sell){Factory(:user_who_can_sell)}
before(:each) do
sign_in user_who_can_sell
get :new
end
it { should respond_with(:ok) }
it { should render_template(:new) }
it "builds a daily deal into @daily_deal" do
assigns(:daily_deal).daily_deal?.should be_true
end
it "builds an address for the daily deal" do
assigns(:daily_deal).address.should_not be_nil
end
it "builds a gift card into @gift_card" do
assigns(:gift_card).gift_card?.should be_true
end
end
context "for a non-logged-in User" do
it "raises an authorization error" do
expect { get :new }.to raise_error(CanCan::AccessDenied)
end
end
끝맺다삭제 삭제 설명
전에
# Spree가 자동으로 첫 번째 사용자를 생성하므로
#관리자가 작성되었습니다. 아래 컨텍스트에서 비관리자가 필요합니다.
#이렇게 하면 우리는 권한 부여를 테스트할 수 있다
사용자창조!(Factory.attributes_for(:user))
끝맺다
let(:product) { Factory(:daily_deal) }
context "for a logged-in User" do
context "that is the creator of the product being destroyed" do
before(:each) do
sign_in product.creator
delete :destroy, :id => product.id.to_s
end
it "makes the specified Product deleted" do
product.reload.deleted?.should be_true
end
it { should redirect_to(my_listings_path) }
end
context "that is not the creator of the product being destroyed" do
before(:each) do
sign_in User.create!(Factory.attributes_for(:user))
end
it "raises an authorization error" do
expect { delete :destroy, :id => product.id.to_s }.to raise_error(CanCan::AccessDenied)
end
end
end
context "for a non-logged-in User" do
it "raises an authorization error" do
expect { delete :destroy, :id => product.id.to_s }.to raise_error(CanCan::AccessDenied)
end
end
끝맺다가져오기: 편집 작업 설명
전에
# Spree가 자동으로 첫 번째 사용자를 생성하므로
#관리자가 작성되었습니다. 아래 컨텍스트에서 비관리자가 필요합니다.
#이렇게 하면 우리는 권한 부여를 테스트할 수 있다
사용자창조!(Factory.attributes_for(:user))
끝맺다
let(:product) { Factory(:daily_deal) }
context "for a logged-in User" do
context "that is the creator of the product being edited" do
before(:each) do
sign_in product.creator
get :edit, :id => product.id.to_s
end
it { should respond_with(:ok) }
it { should render_template(:edit) }
end
context "that is not the creator of the product being edited" do
before(:each) do
sign_in Factory(:user)
end
it "raises an authorization error" do
expect { get :edit, :id => product.id.to_s }.to raise_error(CanCan::AccessDenied)
end
end
end
context "for a non-logged-in User" do
it "raises an authorization error" do
expect { get :edit, :id => product.id.to_s }.to raise_error(CanCan::AccessDenied)
end
end
끝맺다가져오기: 색인 설명
이것은 "검색 프로그램을 설치할 때 매개 변수에 현재 위도와 경도를 포함합니다"do
가져오기:인덱스
controller.params[:location].should == controller.send(:current_lat_and_lon)
end
끝맺다끝맺다
내 목록 컨트롤러에서 다음을 수행합니다.
클래스ListingsController
리소스 로드 및 권한 부여:class=>Product,:instance\u name=>"Product",:except=>:index
filter 이전: 매개변수에서 위치 설정,:only=>:index
def 새
일일 거래 수립
선물 카드를 만들다
끝맺다
def 인덱스
@searcher=Spree::Config.클래스를 검색합니다.신규(매개변수)
@ 제품 = @ 검색자.제품 검색
@특색 제품 = 특색 제품.제한(100).카드 세탁[0.15]
c=@ 주요 제품.크기
하면, 만약, 만약...
@특색 제품 = @특색 제품 [0.11]
하면, 만약, 만약...
@특색 제품 = @특색 제품 [0.7]
하면, 만약, 만약...
@특색 제품 = @특색 제품 [0.3]
끝맺다
끝맺다
정의 편집
render:template=>@product.매일 거래아이템/편집 daily deal': 아이템/편집 gift card
끝맺다
def 제거
@ 제품.속성 업데이트(:, 시간, 현재 삭제)
내 경로로 리디렉션
끝맺다
프라이빗
def 매개 변수의 위치 설정
매개 변수 [:위치] = 현재 위치
끝맺다
def 권한 없음
render:template=> "listings/cannot sell"및 현재 사용자를 반환합니다.선물?
슈퍼
끝맺다
끝맺다
명세서 사양의 rspec 오류는 다음과 같습니다.
실패:
1) Listings Controller GET: 로그인하지 않은 사용자에게 새로 만들면 인증 오류가 발생합니다.
실패/오류: {get:new}로 예상됩니다. 오류 발생(CanCan::AccessDenied)
예상 CanCan::AccessDenied
# ./사양/디렉터/체크리스트\u디렉터\u사양rb:31
2) Listings Controller DELETE: 제거된 제품을 만든 사람이 아닌 로그인한 사용자를 제거하면 라이센스 오류가 발생합니다.
실패/오류: 예상 {delete:destroy,:id=>product.id.to s}. 오류 발생(CanCan::AccessDenied)
예상 CanCan::AccessDenied
# ./사양/디렉터/체크리스트\u디렉터\u사양rb:66
3) Listings Controller 삭제: 로그인하지 않은 사용자를 제거하면 라이센스 오류가 발생합니다.
실패/오류: 예상 {delete:destroy,:id=>product.id.to s}. 오류 발생(CanCan::AccessDenied)
예상 CanCan::AccessDenied
# ./사양/디렉터/체크리스트\u디렉터\u사양rb:74
4) Listings Controller GET: 로그인한 사용자가 편집 중인 제품의 작성자가 아닌 경우 편집이 승인 오류를 유발합니다.
실패/오류: 예상 {get:edit,:id=>product.id.to s}. 오류 발생(CanCan::AccessDenied)
예상 CanCan::AccessDenied
# ./사양/디렉터/체크리스트\u 디렉터\u 사양rb:106
5) Listings Controller 가져오기: 로그인하지 않은 사용자의 편집은 인증 오류를 유발합니다.
실패/오류: 예상 {get:edit,:id=>product.id.to s}. 오류 발생(CanCan::AccessDenied)
예상 CanCan::AccessDenied
# ./사양/디렉터/체크리스트\u디렉터\u사양rb:114
65.01초로 완료
15개 예, 5번 실패
실패한 예:
rspec/spec/controllers/listings controller spec.rb:30#Listings Controller GET:new 로그인하지 않은 사용자에게 권한 부여 오류 발생
rspec/spec/controllers/listings controller spec.rb:65 35; Listings Controller DELETE:destroy는 폐기된 제품을 만든 사람이 아닌 로그인한 사용자에게 권한 수여 오류를 일으킬 수 있습니다
rspec/spec/controllers/listings controller spec.rb:73#Listings Controller DELETE:destroy가 로그인하지 않은 사용자에게 권한 부여 오류를 일으킬 수 있습니다
rspec/spec/controllers/listings controller spec.rb:10535; Listings Controller GET:edit는 편집 중인 제품 작성자가 아닌 로그인 사용자에게 권한 부여 오류를 일으킬 수 있습니다
rspec/spec/controllers/listings controller spec.rb:113 #listingsconner GET: edit for a non-logging-in User 인증 오류 발생
토론 #7
네, 해보시겠어요?작동하지 않으면 일치하지 않는 것 같습니다: 업데이트: 편집, 계속:
토론 #8
및can [:edit, :update, :destroy], Product do |product|
user == product.creator
end
실제로 하나의 ID만 비교하는 것이 좋습니다.:only => [:new, :update, :destroy]
네, 해 보겠습니다. :only => [:new, :edit, :update, :destroy]
당신의 건의에 따라 해 보았지만 같은 오류가 여전히 존재합니다토론 #9
. 네.로그인하지 않은 사용자로 편집하려고 할 때 브라우저와 로그 파일에서 무엇을 보았습니까?당신은 어디에서 구조될 수 있습니까?
토론 #10
브라우저에서 비로그로 편집할 때 일부 파일을 표시합니다render:template=> "listings/cannot sell"은 권한이 부여되지 않은 기능
토론 #11
에 있습니다. 접근이 거부되었는지 확인하는 것이 아니라 이 템플릿이 사용되었는지 확인해야 합니까?다른 작업은요? Rspec에서 cancan AccessDenied 예외가 감지되었습니까?그들의 브라우저 동작은 같습니까?
토론 #12
감사합니다:) 렌더링 템플릿을 사용하여 오류를 해결합니다.토론 #13
잘됐다!그리고 너는 이 문제를 끝낼 수 있다.Reference
이 문제에 관하여(rspec의 "CanCan::AccessDenied"오류), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/461텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)