2015-03-19 9 views
2

У меня есть на основе Starman сервер -Как вы используете Plack :: Middleware :: Session с сервером Starman?

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Printer; 
use Plack::Builder; 

my $app = sub { 
    my $env = shift; 
    my $session = $env->{'psgix.session'}; 

    # Print environment variables 
    p($env); 

    return [ 
     200, 
     [ 'Content-Type' => 'text/plain' ], 
     [ "Hello, you've been here for ", $session->{counter}++, "th time!" ], 
    ]; 
}; 

my $default = sub { 
    my $env = shift; 
    p($env); 
    return [ 
     '200', [ 'Content-Type' => 'text/html' ], 
     ["Welcome to default page"], 
    ]; 
}; 

builder { 
    mount "/validate" => builder { 
     enable "Middleware::Authentication" 
     enable "Session"; 
     $app; 
    }; 
    mount "/" => builder { $default }; 
}; 

Мой собственный промежуточного «Аутентификация» аутентификации пользователя и возвращает информацию сеанса (время истечения, ключ сеанса и т.д.) для управления сеансом, так как я могу использовать эти информацию в промежуточной среде сеанса?

ответ

2

Если я правильно понимаю, ваша проблема только в порядке промежуточного программного обеспечения. Включите Session перед вашим Auth.

Проверьте следующее, используя хранилище Файлов, сеансы хранятся постоянно. Попробуйте, перезапустите свой Starman, и счетчик будет перезагружен. (Я с помощью инлайн промежуточного программного обеспечения в качестве замены на ваш Authentication.)

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Data::Printer; 
use Plack::Builder; 

my $app = sub { 
    my $env = shift; 
    my $session = $env->{'psgix.session'}; 
    return [ 
     200, 
     [ 'Content-Type' => 'text/html' ], 
     [ 
      "My app page is visited ", 
      $session->{counter}++, 
      "th times! Validation is done at:", 
      $session->{mwaretime}, 
      q{<br><a href="/validate">go validate again</a> --- <a href="/">reload this page</a>} 
     ], 
    ]; 
}; 

my $validate = sub { 
    my $env = shift; 
    my $session = $env->{'psgix.session'}; 
    $session->{counter} = 0; 
    return [ 
     '200', [ 'Content-Type' => 'text/html' ], 
     [ 
      "Resetting the counter:", 
      $session->{counter}, 
      ". Time from middleware: ", 
      $session->{mwaretime}, 
      q{<br> <a href="/validate">reload this page</a> --- <a href="/">go to index</a> } 
     ], 
    ]; 
}; 

builder { 
    #the session will be stored persistently 
    #enable the Session BEFORE your middleware 
    enable 'Session', store => 'File'; 

    mount "/validate" => builder { 
     #enable "Authentication"; 
     #following is same as an middleware 
     enable sub { 
      my $app = shift; 
      return sub { 
       my $env = shift; 
       my $session = $env->{'psgix.session'}; 
       $session->{mwaretime} = time(); 
       $app->($env); 
      }; 
     }; 
     #end of the middleware 
     $validate; 
    }; 
    mount "/" => $app 
}; 
+0

Спасибо, jm666 за ваш ответ. Я искал сериализацию промежуточных продуктов, то есть после аутентификации пользователя из промежуточного ПО Auth он возвращает идентификатор сеанса (токен), время входа пользователя и т. Д., Которые я хочу использовать в промежуточном программном обеспечении Session для управления сеансом. Итак, как я могу передать выход одного промежуточного программного обеспечения другому. Этот подход в порядке? – CodeQuestor

+0

@CodeQuestor Лучшее, что вы можете сделать, [поиск metacpan] (https://metacpan.org/search?q=Plack%3A%3AMiddleware%3A%3AAuth&size=500) для некоторых 'Plack :: Middleware :: Auth' модулей и проверить источники, как они используют промежуточное ПО Session.Я не уверен в 'session ID', потому что он генерируется самим промежуточным программным обеспечением Session, используя' Plack :: Session :: State' (где вы можете передать свой собственный код, что возвращает SID.) – jm666

+0

Спасибо за указания jm666, позвольте мне попробовать подробнее об этом. – CodeQuestor

1

Из Вашего вопроса, то трудно сказать, что ваши требования выглядеть точно. Но если вам нужен этот контроль над управлением сеансом, лучше написать собственное промежуточное программное обеспечение. Тем не менее, есть некоторые способы адаптировать Plack::Middleware::Session к определенным сценариям. Но большинство из них используют более или менее недокументированные функции. Это означает, что вам нужно ознакомиться с исходным кодом и что эти функции могут быть изменены или удалены в более поздних версиях.

Если вы хотите предоставить свои собственные сеансовые ключи, вы можете передать генератор пользовательских SID и валидатор Plack::Session::State:

enable 'Session', 
    state => Plack::Session::State->new(
     sid_generator => $my_generator, 
     sid_validator => $my_validator, 
    ); 

documentation из sid_generator говорит в основном «только что прочитал источник».

Вы также можете реализовать свой собственный Plack::Session::Store бэкэнд. Но в этом случае, вероятно, имеет смысл переключиться на собственное решение.

Что касается времени истечения срока действия куки, вы можете установить опцию expires в $env->{'psgix.session.options'}перед тем новый печенье создано:

$env->{'psgix.session.options'}{expires} = $my_expires; 

Это не тайм-аут, но время в секундах с начала эпохи UNIX, или любой стоимость принята Cookie::Baker.

Возможно, вам стоит просто переосмыслить, действительно ли ваше промежуточное программное обеспечение для аутентификации должно генерировать ключи сеанса. Как и @ jm666, вы обычно запускаете промежуточное программное обеспечение сеанса перед аутентификацией. Затем ваш код аутентификации может получить доступ ко всей информации о сеансе. Идентификатор сеанса, как правило, представляет собой детальную информацию об управлении сеансом, которая не должна касаться других частей вашего кода. Чтобы изменить время истечения срока действия, см. my answer to this question.

+0

Спасибо за ваш отзыв nwellnhof. Фактически сеанс будет поддерживаться для каждого пользователя, и пользователь должен пройти аутентификацию перед входом в какой-либо сеанс. Ключ/токен сеанса будет использоваться совместно с другими серверами, и когда пользователь отправит некоторую команду на этот сервер, этот сеансовый ключ/токен будет проверен. Вот почему я генерировал ключ сеанса в моем промежуточном программном обеспечении для проверки подлинности. – CodeQuestor

 Смежные вопросы

  • Нет связанных вопросов^_^