0

セッションの有効期限が切れたときにユーザーを強制的にログアウトさせようとしていますが、セッションの時間にアクセスできません

namespace mio\mioBundle;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Request;

class RequestListener{

    protected $router;
    protected $security;  

    public function __construct(RouterInterface $router, SecurityContext $security)
    {
        $this->router = $router;
        $this->security = $security;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        echo $event->getRequest()->getSession()->('timeout');
    }
}

こんにちはここで私は設定ファイルsecurity.ymlを残します。

security:

    firewalls:
        frontend:
            pattern:  ^/
            anonymous: ~
            form_login:
                login_path: /login
                check_path: /login_check
                default_target_path: /index
                success_handler: authentication_handler
            logout:
                path: /logout
                target: /login
                success_handler: authentication_handler
            security: true
            remember_me:
                key:      loksea
                lifetime: 1800
                path:     /
            access_denied_handler: accessdenied_handler
          #primero deben de ir los usuarios anonimos si no se entra en loop redirect
    access_control:
        - { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/pruebita, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/js, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin, roles: ROLE_A }
        - { path: ^/nuevoinforme, roles: ROLE_M }
        - { path: ^/, roles: IS_AUTHENTICATED_REMEMBERED }

    providers:
        user_db:
            entity: { class: mio\mioBundle\Entity\Empleado, property: username }
    role_hierarchy:
        ROLE_M: ROLE_U
        ROLE_A: ROLE_U

    encoders:
        mio\mioBundle\Entity\Empleado: { algorithm: sha1 }
        Symfony\Component\Security\Core\User\User: plaintext

セッションが終了すると、再度ログインするように求められますが、ユーザーのログアウトは求められません。ログアウトを保存するリスナーがあります。

 public function onLogoutSuccess(Request $request){
        $empleado =  $this->security->getToken()->getUser();
        $log = new Log();
        $log->setFechalog(new \DateTime('now'));
        $log->setTipo("Salida");
        $log->setEmpleado($empleado);
        $this->em->persist($log);
        $this->em->flush();
}

セッションが終了したときにこのメソッドを呼び出しますか?ありがとう。

4

3 に答える 3

0

私は同じ問題を抱えていましたが、ユーザーが最大アイドル時間に達したときに CredentialsExpiredException をスローするリスナーを作成することができました。
あまりにも長い間アイドル状態だったユーザーは、ログイン/ログアウト ページにリダイレクトされます (状況によっては、ログアウト ターゲットを見て「/login」になります)。
これが私が問題を解決した方法です。

namespace mio\mioBundle;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;

class RequestListener{

    protected $container;  

    public function __construct(Container $container)
    {
        $this->container = $container;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $session = $this->container->get('session');
        $maxTime = 5*60; //5 minutes is the maximum lifetime

        // Get the current idle time and compare it with the max allowed time
        if (time() - $session->getMetadataBag()->getLastUsed() > $maxTime) {
            //Invalidate the current session and throw an exception
            $session->invalidate();
            throw new CredentialsExpiredException();
        }
    }
}

これでいいはずです。他にご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-12-16T08:47:50.213 に答える
0

私が正しいかどうか教えてください。ユーザーがログアウトするときに、メソッド「onLogoutSuccess」を実行する必要がありますか? ログアウトプロセスはうまくいきますよね?

明示的にログアウトするには、セッション オブジェクトの「clear()」メソッドを試しましたか?

于 2013-03-26T16:30:59.977 に答える
-2

この動作は security.yml 構成ファイルで構成する必要があり、自動的に機能するはずです。

ほら

于 2013-03-20T14:47:47.220 に答える