0

루비 2.2.0을 실행 레일 - 4.2 고안-3.4.1 Declarative_Authorization-0.5.7고안 로그 아웃 - 오이 단계가 실패하지만 응용 프로그램이 제대로

내가 레일-4에 레일 - 3.2 응용 프로그램을 변환하고 . 앱은 Devise 인증과 Declarative Authorization을 모두 사용합니다. 기본 Devise 컨트롤러를 사용하고 있습니다.

이 시점에서 저는 대부분의 인증 시나리오를 통과 시켰습니다. 그러나 내가 실행 한 것은 내가 오이를 통해 로그 아웃 할 수 없지만 브라우저에서 할 수 있다는 것입니다. 문제의 단계는 다음과 같습니다

When /select end the current session/ do 
    selector_type = "#" 
    selector_value = link = "session_end_action_id" 
    selector = selector_type + selector_value 
    click_button(selector_value) 
end 

라우트는 다음과 같이 :

. . . 
        new_user_session GET /users/sign_in(.:format)          devise/sessions#new 
         user_session POST /users/sign_in(.:format)          devise/sessions#create 
       destroy_user_session DELETE /users/sign_out(.:format)          devise/sessions#destroy 
        user_password POST /users/password(.:format)          devise/passwords#create 
       new_user_password GET /users/password/new(.:format)         devise/passwords#new 
       edit_user_password GET /users/password/edit(.:format)         devise/passwords#edit 
            PATCH /users/password(.:format)          devise/passwords#update 
            PUT /users/password(.:format)          devise/passwords#update 
         user_unlock POST /users/unlock(.:format)           devise/unlocks#create 
        new_user_unlock GET /users/unlock/new(.:format)          devise/unlocks#new 
            GET /users/unlock(.:format)           devise/unlocks#show 
          account POST /account(.:format)            users#create 
         new_account GET /account/new(.:format)           users#new 
         edit_account GET /account/edit(.:format)           users#edit 
            GET /account(.:format)            users#show 
            PATCH /account(.:format)            users#update 
            PUT /account(.:format)            users#update 
            DELETE /account(.:format)            users#destroy 
         authenticate GET /authenticate(.:format)           devise/sessions#new 

. . . 

        users#index 
            POST /users(.:format)            users#create 
          new_user GET /users/new(.:format)           users#new 
         edit_user GET /users/:id/edit(.:format)          users#edit 
           user GET /users/:id(.:format)           users#show 
            PATCH /users/:id(.:format)           users#update 
            PUT /users/:id(.:format)           users#update 
            DELETE /users/:id(.:format)           users#destroy 

. . . 

뷰의 코드는 다음과 같습니다

<%-if current_user-%> 
    <span class="authenticated_session" id="authenticated_session"> 
    <%=button_to(I18n.t(:session_end).strip.titleize, 
     :destroy_user_session, 
     :class => "button logout", 
     :confirm => I18n.t(:session_end_confirm).strip.titleize, 
     :id => :session_end_action_id, 
     :method => :delete, 
     :title => I18n.t(:session_end_logout).strip.titleize)-%> 
    </span 
<%-else-%> 
    <%=button_to(I18n.t(:session_start).strip.titleize, 
     :new_user_session, 
     :class => "button login", 
     :id => :session_start_action_id_top, 
     :method => :get, 
     :title => I18n.t(:session_start_login).strip.titleize)-%> 
<%-end-%> 

I 인증하고 때 키를 누릅니다 로그 아웃 버튼을 누르면 로그 아웃됩니다. 오이 단계를 실행할 때 Declarative Authorization에서 권한 오류가 발생합니다.

<p class='security classified' style='color: orangered'> 
     you are not authorised to access the requested resource</p>  
    <br/> 
    <!-- End of header section from layouts/application.html.erb --> 

응용 프로그램 컨트롤러 여기에 생성됩니다

def permission_denied 
    if current_user 
    flash[:security_classified] = I18n.t(:security_classified).strip 
    else 
    flash[:security_restricted] = I18n.t(:security_restricted).strip 
    end 
    redirect_back_or_default(welcome_url) 
end 

하고는 분명히 사용자의 컨트롤러에서 호출되는 :

User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 21]] 

    Rendered public/hll_authorisation_notice.html (0.1ms) 

    Rendered welcome/show.html.erb within layouts/application (3.6ms) 
Completed 200 OK in 105ms (Views: 100.4ms | ActiveRecord: 0.6ms) 

Started DELETE "https://stackoverflow.com/users/sign_out" for 127.0.0.1 at 2015-01-26 15:19:48 -0500 

Processing by UsersController#destroy as HTML 
    Parameters: {"id"=>"sign_out"} 
    (0.2ms) SELECT COUNT(*) FROM "users" 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 21]] 
    CACHE (0.0ms) SELECT COUNT(*) FROM "users" 
    Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "clearances" ON "roles"."id" = "clearances"."role_id" WHERE "clearances"."user_id" = ? [["user_id", 21]] 
    CACHE (0.0ms) SELECT COUNT(*) FROM "users" 

Redirected to http://www.example.com/welcome 
Filter chain halted as :filter_access_filter rendered or redirected 
Completed 302 Found in 23ms (ActiveRecord: 1.0ms) 

Started GET "/welcome" for 127.0.0.1 at 2015-01-26 15:19:48 -0500 
Processing by WelcomeController#show as HTML 
    (0.2ms) SELECT COUNT(*) FROM "users" 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 21]] 

    Rendered public/hll_authorisation_notice.html (0.1ms) 

    Rendered welcome/show.html.erb within layouts/application (1.5ms) 
Completed 200 OK in 61ms (Views: 57.2ms | ActiveRecord: 0.4ms) 
    (0.4ms) rollback transaction 

의 검사 (이 목적을 위해 포맷) 객체 permission_denied 메소드에서 다음과 같이 나타냅니다.

#<UsersController:0x00000006ba52d8 @_action_has_layout=true, 
@_routes=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, 
@_request=#<ActionDispatch::Request:0x00000006ba51c0 
@env={"rack.version"=>[1, 3], "rack.input"=>#<StringIO:0x00000006c378e0>, 
"rack.errors"=>#<StringIO:0x00000006c379a8>, "rack.multithread"=>false, 
"rack.multiprocess"=>true, "rack.run_once"=>false, 
"REQUEST_METHOD"=>"DELETE", "SERVER_NAME"=>"www.example.com", 
"SERVER_PORT"=>"80", "QUERY_STRING"=>"", "PATH_INFO"=>"https://stackoverflow.com/users/sign_out", 
"rack.url_scheme"=>"http", "HTTPS"=>"off", "SCRIPT_NAME"=>"", 
"CONTENT_LENGTH"=>"14", "rack.test"=>true, "REMOTE_ADDR"=>"127.0.0.1", 
"HTTP_REFERER"=>"http://www.example.com/", 
"HTTP_HOST"=>"www.example.com", 
"CONTENT_TYPE"=>"application/x-www-form-urlencoded", 
"HTTP_COOKIE"=>"_proforma_session=. . . 

따라서 사용자 컨트롤러에서는 분명히 문제가됩니다. 그러나 오류는 오이 실행 중에 만 발생합니다. Rails 서버에서 응용 프로그램을 제공하고 브라우저에서 액세스 할 때 로그인하고 로그 오프하면 아래 로그 추출 결과와 같은 오류없이 로그 아웃됩니다.

Started DELETE "https://stackoverflow.com/users/sign_out" for ::1 at 2015-01-26 15:45:50 -0500 
Processing by Devise::SessionsController#destroy as HTML 
    Parameters: {"authenticity_token"=>"Xl9Ui1a6jt8gyjZOuh0lsefUqFI1eEunaXivaEdfwWhMofYhYbRumnZlsRQjwmjWiC1C7sI7O3FwDgEf9lJzJw=="} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
    (0.2ms) SELECT COUNT(*) FROM "users" 
    (0.1ms) begin transaction 
    (0.4ms) UPDATE "users" SET "accessed_at" = '2015-01-26 20:45:50.179843', "changed_at" = '2015-01-26 20:45:50.180748', "lock_version" = 20 WHERE ("users"."id" = 1 AND "users"."lock_version" = 19) 
    (103.2ms) commit transaction 
Redirected to http://localhost:3000/ 

여기에 무슨 일이 일어나고 있는지 아이디어가 있습니까? 브라우저 sign_out에서 발견 된 토큰 값이 중요합니까?

P. 이렇게하면 다음과 같습니다.

visit('/users/sign_out') 

다음 단계가 수행됩니다. 나는 여기서 야생의 추측을하고 있지만 RoR에서 html 버튼과 함께 사용되는 javscript가 내가보고있는 것을 야기 할 수있는 것은 무엇인가?

+0

오이 단계를 실행할 때 로그인하지 않았다는 것을 분명히 보았습니까? – diabolist

+0

예, 테스트가 로그인되어 있습니다. 하나가 인증 될 때까지 인증 오류를 얻을 수 없습니다. –

답변

0

나는 무엇이 잘못되었는지를 발견했다. 우연히 다른 관련이없는 문제를 연구하는 동안.

기본적으로 https://github.com/jnicklas/capybara#selecting-the-driver

는, 카피 바라가 사용 : rack_test 드라이버를 빠르고,하지만 이 제한 : 그것은 자바 스크립트를 지원하지 않습니다

내가 믿는 문제는 카피 바라가 사용하는 기본 테스트 방법 또한 원격 API 및 OAuth 서비스와 같이 Rack 애플리케이션 외부에서 HTTP 리소스에 액세스 할 수 없습니다. 이러한 한계를 극복하기 위해 기능에 대해 다른 기본 드라이버를 설정할 수 있습니다. 당신이 은 셀레늄 모든 것을 실행 원하는 경우 예를 들어, 당신은 할 수 :

Capybara.default_driver = :selenium

을하지만, 당신은 RSpec에 나 오이를 사용하는 경우, 대신 에 할 수있는 등 :rack_test 빨리 떠나 고려 default_driver 및 은 각각 :js => true 또는 @javascript을 사용하는 JavaScript 가능 드라이버 이 필요한 테스트에만 표시됩니다. 기본적으로 JavaScript 테스트는 :selenium driver을 사용하여 실행됩니다. 은 Capybara.javascript_driver으로 설정하여 변경할 수 있습니다.

또한 일시적으로 드라이버를 변경할 수 있습니다 (일반적으로/설치하기 전에 및/분해 블록 후) :

Capybara.current_driver = :webkit # temporarily select different driver ... tests ... Capybara.use_default_driver # switch back to default driver

참고 : 드라이버를 전환하기 때문에, 새로운 세션을 생성 당신은 시험 도중에 전환 할 수있는 이 아닐 수도 있습니다.