2013-01-23 6 views
3

저는 Mojolicious 응용 프로그램과 인증 용 브리지를 가지고 있습니다. 이것은 나의 시나리오이다 :
나는 값을 전달함으로써 질의를하는 데이터베이스에서 표준 에러 응답을 가지고있다. 예를 들어, 자세한 에러 응답을 가진 404를 반환한다. 데이터베이스는 오류에 해당하는 공통 세부 사항을 가지며 IP 및 사용자 이름과 같은 기타 사용자 특정 세부 사항은 컨트롤러에서 가져옵니다. 오류 응답이 어떻게 구성되는지에 관해서는 this link을 참조하십시오. 컨트롤러의 인스턴스를 가져오고 필요한 응답을 생성하는 오류 코드가있는 도우미가 있습니다. 나는 오류 응답을 포함하는 테이블의 결과 집합을 통해 db를 쿼리하기 위해 컨트롤러 개체를 사용합니다. 컨트롤러를 통해 응답을 생성하는 데 필요한 사용자 별 세부 정보도 얻을 수 있습니다. 그런 다음 응답이 만들어 져서 컨트롤러로 보내지고 Json으로 반환됩니다.
내 문제는 로그 아웃 중이므로 세션을 무효화하는 $self->session(expires => 1)으로 설정합니다. 다시 로그 아웃하려고 시도 할 때 컨트롤러를 사용하여 도우미에 액세스하여 오류 응답을 작성하고이를 클라이언트에 보냅니다. 이제 URI에 액세스하려는 시도는 다음 확인을 통해 첫 번째 시도에서 무의미합니다.세션이 Mojolicious에서 만료되지 않습니다.

unless($self->session('user')) { 
    my $res = Controller::Helper->error_res($self, 403); 
    $self->render_json($res, status => $res->{httpstatuscode}); 
    return; 
    } 

이 검사는 처음으로 작동하지만, 내가 다시 (여러 번) 자원에 액세스하려고 할 때,이 검사가 실패하고 자원이 로그인없이 액세스 할 수 있습니다. 쿠키를 보면 새로운 쿠키가 만들어집니다. 내가 여기서 어디로 잘못 가고 있니? 그런 문제를 해결하는 가장 좋은 방법은 무엇일까요? 도우미 기능은 res가 특정 오류를 식별 할 데이터베이스이며 ID이

error_res{ 
    my($self,$c,$res) = @_; 
    my @arref = $c->db->resultset('Errorcode')->select_row($res); 
    my $ref=$arref[0]; 
    $ref->{user}=$c->session->{user}->{name}; 
    $ref->{request}=$c->req->method."".join("\\",$c->req->url->path); 
    $ref->{time}=scalar localtime(); 
    return $ref; 
} 

것 같습니다.

그래서 컨트롤러의 참조가 도우미에서 계속 사용할 수 있습니까? 내가 도우미에서 $c을 undef하면 도움이되지 않습니다.
편집 1 : 여기에 몇 가지 요점이 누락되어 있으며 올바른 방법입니까?
편집 2 : 나는 로그 아웃시 사용자를 무효화합니다. 사용자가 다시 로그 아웃하려고하면 오류에 대한 추가 정보가있는 오류를 반환합니다. 그러나 오류에 대한 추가 정보를 만드는 동안 사용자 정보가없는 새 세션이 만들어집니다. 다음을 수행하면 이런 일이 발생하지 않습니다.

unless($self->session('user')) { 
    $self->render_json("message:User has not logged in", status => 403); 
    return; 
} 
+0

모든 요청에 ​​대해 세션 쿠키가 무효화되는 것을 알고 있습니까? 아마도 사용자 상호 작용 흐름을 설명해야하며 정확하고 잘못된 동작이 무엇인지 이해할 수 없습니다. –

+0

@JoelBerger 질문에 대한 답변을 편집했습니다.이 질문을 이해하는 데 도움이되기를 바랍니다. –

+0

편집 (2)이 예상대로 작동하는 것 같습니다. 사용자가 로그 아웃하면 새로운 세션 쿠키에 'user' 키가 없습니다. 내 CMS [Galileo] (https://github.com/jberger/Galileo/blob/master/lib/Galileo.pm#L111) –

답변

3

그래서 대답을 알아 냈습니다. 이상한 행동은 autovivification perl의 기능입니다. 데이터 구조의 동적 생성이 필요합니다. 내 경우, 나는 사용자가, user 키가 세션에서 설정되지 않은 로그인하지 않은 경우

$ref->{user}=$c->session->{user}->{name}; 

에서 세션 쿠키를 통해 사용자의 이름을 얻으려고하지만 난이 키를 통해 name를 얻으려고 오류 응답을 생성 할 때.결과적으로 user이 생성됩니다. user 키가 있는지 확인하여 문제가 해결되었습니다.

1

의견을 읽은 후 프레임 워크가 예상대로 작동하는지 확신합니다. 애플리케이션 로직을 변경해야 할 수도 있습니다 (편집 2에서 설명 된 것처럼).

그 이유는 세션이 해시 레퍼런스이고, JSON으로 직렬화되고, 서명되고, 쿠키에 저장되기 때문입니다. 키를 생성하면 키가 생성됩니다. 내가 너에게 할 말이 있을지 모르겠다.

예, 이전 세션의 만료 직후에 새로운 세션 쿠키가 생성됩니다. 이것은 프레임 워크에 필요하며 완전히 예상됩니다.

+0

Joel에게 도움을 주셔서 감사합니다. 나는 틀을 의심하지 않았다. 나는 응용에서 무슨 일이 일어나고 있는지 알아 내려고 노력했다. –

+0

당신이 그것을 알아 낸 것을 기쁘게 생각합니다. 실제로 저는 autoviv –