2014-09-14 4 views
1

나는 여기에 하나를 기반으로하는 인증 시스템을 발견 건물입니다 :Mojolicious 플래시 메시지

https://github.com/alexanderBendo/Experiments/blob/master/exp0001/mojolicious-auth-session.pl

오전 데 문제는 사용자가 잘못된 사용자 이름 또는 암호를 입력하면, 서버가 반환된다는 것이다 플래시 메시지가 로그인하지 않고 페이지에 액세스하려고하는 것처럼 표시됩니다. 잘못된 자격 증명 메시지가 표시되어야합니다. 잘못된 신임장을 두 번 입력하면 유효하지 않은 신임장 메시지가 표시됩니다.

다음은 관련 코드입니다 :

sub main { 
    my $self = shift; 
if ($self->is_user_authenticated) { 
    $self->redirect_to('/main/cp'); 
    } else { 
    $self->flash(message => 'You must log in to view this page'); 
    $self->render('login'); 
    } 
} 

sub login { 
    my $self = shift; 
    my $user = $self->param('name') || q{}; 
    my $pass = $self->param('pass') || q{}; 
    if ($self->authenticate($user, $pass)) { 
     $self->redirect_to('/main/cp'); 
    } else { 
     $self->flash(message => 'Invalid credentials!'); 
     $self->render('login'); 
     return; 
    } 
} 

템플릿 :

% layout 'default'; 
% title 'Login'; 
<h1>Log In</h1> 
<% if (my $message = flash 'message') { %> 
<b><%= $message %></b><br> 
<% } %> 
<%= form_for login => (method => 'post') => begin %> 
Name: <%= text_field 'name' %> 
<br> 
Password: <%= password_field 'pass' %> 
<br> 
<%= submit_button 'Login' %> 
<% end %> 

감사합니다.

답변

3

플래시는 세션의 현재 쿼리와 다음 쿼리 사이에 데이터를 저장하는 데 사용해야합니다. 따라서 flash 데이터는 즉시 세션에 배치되지 않습니다.

따라서 render('login_page')을 제외한 redirect_to('login_page')을 수행해야합니다.

sub main { 
    my $self = shift; 
if ($self->is_user_authenticated) { 
    $self->redirect_to('/main/cp'); 
    } else { 
    $self->stash(message => 'You must log in to view this page'); 
    $self->render('login'); 
    } 
} 

템플릿 :

% layout 'default'; 
% title 'Login'; 
<h1>Log In</h1> 
<% if (my $message = stash 'message') { %> 
<b><%= $message %></b><br> 
<% } %> 
당신이 stash에 데이터를 저장하기 위해 당신이해야 리디렉션하지 않으려면