簡體   English   中英

在非安全(匿名)路由上顯示經過身份驗證的用戶

[英]Display authenticated users on non-secure (anonymous) routes

我使用PHP和Silex構建了一個Web應用程序,並通過SecurityServiceProvider實現了基本身份驗證,如下所示:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'private' => array(
            'remember_me' => array(
                'key' => $config['secret_key'],
                'lifetime' => $config['remember_me_duration'],
            ),
            'pattern' => '^/admin',
            'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'),
            'logout' => array('logout_path' => '/admin/logout'),
            'users' => $app->share(function () use ($app) {
                // ...
            }),
        ),
        'public' => array(
            'pattern' => '^/$',
            'anonymous' => true,
        ),
        'login' => array(
            'pattern' => '^/login$',
            'anonymous' => true,
        ),
    ),
));

如您所見, /admin路徑是安全的,在那里我可以使用$app['security']->getToken()->getUser(); 要獲得經過身份驗證的實際用戶並顯示類似$ username的身份登錄 ,但是如果我在/login/路由上執行此操作,則該用戶將永遠是anon. 即使我已通過身份驗證。

如果有一個身份驗證的用戶,我該如何獲取身份驗證的用戶;否則,該如何獲取身份驗證的用戶anon. 字符串,在//login路由上以顯示如下消息: 以$ username身份登錄

我還嘗試在樹枝模板中使用is_granted('IS_AUTHENTICATED_FULLY'函數來檢查用戶是否已通過身份驗證,但是在/login/它會返回false(即使我已通過身份驗證),因為匿名用戶的身份優先於已通過身份驗證的用戶,所以這里沒有成功。

為了幫助其他人,我如下所述解決了該問題。 Silex的不使用access_control ,但access_rules (該死的)。

正如Pazi (+1)所建議的,我將所有內容組合在一個防火牆下並使用了access_rules

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'main' => array(
            'remember_me' => array(
                'key' => $config['secret_key'],
                'lifetime' => $config['remember_me_duration'],
            ),
            'pattern' => '^/',
            'anonymous' => true,
            'form' => array(
                'login_path' => '/login',
                'check_path' => '/admin/login_check',
            ),
            'logout' => array('logout_path' => '/admin/logout'),
            'users' => $app->share(function () use ($app) {
                // ...
            }),
        ),
    ),
    'security.access_rules' => array(array('^/admin/files', 'ROLE_ADMIN'),
    ),
));

一切都必須在同一防火牆下,並且您必須使用訪問控制。

@Paul我希望添加評論,但我還不能添加評論,因此,答案是:

好像拿出來

'pattern' => '^/admin'

您已打開對/ admin / login_check的匿名訪問的防火牆模式中的字符串,這是不對的。

我的建議是取回並移除

'anonymous' => 'true'

從防火牆開始。 應該可以一樣工作,但是會更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM