检查用户是否在不安全的路由上进行了身份验证

大卫·兹宾斯基

我正在尝试使用symofny/securitySilex 中的包构建一个简单的登录,但是我在身份验证检查方面遇到了一个小问题。

结构:

/
/login
/admin
    /login_check
    /logout

为了到达/admin路由,用户需要进行身份验证,如果没有,他将被重定向到/login表单,然后按照建议要求admin/login_check进行身份验证(所有这些都由 symofny 的安全防火墙提供)。

防火墙配置:

'security.firewalls' => array(
    'login' => array(
        'pattern' => '^/login$',
    ),
    'admin' => array(
        'pattern' => '^/admin',
        'http' => true,
        'form' => array(
            'login_path' => '/login',
            'check_path' => '/admin/login'
        ),
        'logout' => array(
            'logout_path' => '/admin/logout',
            'invalidate_session' => true
        ),
        'users' => ...
    ),
)

一切正常,但用户可以进入/login路线,即使他已经通过身份验证,这还不错,但我想避免它。我厌倦了检查用户身份验证状态,但我想它不起作用,因为我正在/login控制器上检查它,该控制器不在网站的“安全”区域。

这是代码:

public function index(Request $request, Application $app)
{
    if ($app['security.authorization_checker']->isGranted('ROLE_ADMIN')) {
        return $app->redirect($app['url_generator']->generate('admin'));
    }
    return $app['twig']->render('login/index.twig', array(
        'error'         => $app['security.last_error']($request),
        'last_username' => $app['session']->get('_security.last_username'),
    ));
}

这引发了一个错误:The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL.那么,问题是,有没有办法在symfony/security本地使用(没有任何走动)来做到这一点或者是否有可能/login在安全区域内创建路由并有可能访问它 - 即使用户未登录(例如,为 GET 请求设置例外)这将解决问题?

更新

我还为/login带有 option 的页面添加了防火墙配置anonymous: true,这导致不再抛出错误,但是,当我登录/admin路由时,方法isGranted('ROLE_ADMIN')结果为true,而在/login路由上它导致false(我是仍然在那里登录)。

Michał Szczech

您可以通过转储当前令牌轻松了解安全组件的行为。

public function index(Request $request, Application $app)
{
    var_dump($application['security.token_storage']->getToken());
}

当您没有anonymous为登录页面设置选项时(默认为false):

null

当您将anonymous登录页面的选项设置true

object(Symfony\Component\Security\Core\Authentication\Token\AnonymousToken)
    private 'secret' => string 'login' (length=5)
    private 'user' (Symfony\Component\Security\Core\Authentication\Token\AbstractToken) => string 'anon.' (length=5)
    private 'roles' (Symfony\Component\Security\Core\Authentication\Token\AbstractToken) => 
        array (size=0)
            empty
    private 'authenticated' (Symfony\Component\Security\Core\Authentication\Token\AbstractToken) => boolean true
    private 'attributes' (Symfony\Component\Security\Core\Authentication\Token\AbstractToken) => 
        array (size=0)
           empty

以下示例描述了您在初始代码示例中出错的原因。

如何共享安全令牌?

要在多个防火墙之间共享安全令牌,您必须设置相同的Firewall Context

SecurityServiceProvider您使用 pattern 声明的受保护防火墙注册上下文侦听器security.context_listener.<name>在您的示例中,它注册为security.context_listener.admin. 因此,您要使用的上下文名为admin

此外,一个防火墙上下文键存储在会话中,因此每个使用它的防火墙都必须将其stateless选项设置false.

更重要的是,要在登录页面上调用身份验证,该anonymous选项必须设置为true

'security.firewalls' => array(
    'login' => array(
        'context' => 'admin',
        'stateless' => false,
        'anonymous' => true,
        'pattern' => '^/login$',
    ),
    'admin' => array(
        'context' => 'admin',
        'stateless' => false,
        'pattern' => '^/admin',
        'http' => true,
        'form' => array(
            'login_path' => '/login',
            'check_path' => '/admin/login'
        ),
        'logout' => array(
            'logout_path' => '/admin/logout',
            'invalidate_session' => true
        ),
        'users' => ...
    ),
)

更改后,如果您登录管理面板和登录页面,您将获得一个Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken作为令牌的实例,Symfony\Component\Security\Core\Authentication\Token\AnonymousToken如果您未登录。

因此,您可以安全地检查权限$app['security.authorization_checker']->isGranted('ROLE_ADMIN')并在两个防火墙上获得相同的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该如何检查用户是否在MVC5中进行了身份验证?

来自分类Dev

Flask-Login检查是否在没有装饰器的情况下对用户进行了身份验证

来自分类Dev

客户端检查是否在Firebase中进行了身份验证

来自分类Dev

检查是否在 ApplicationController 中进行了身份验证,导致“参数数量错误(给定 1,预期为 0)”

来自分类Dev

如何知道用户是否通过 firebase 的第一个请求进行了身份验证

来自分类Dev

为什么基于MAC的身份验证不安全?

来自分类Dev

即使在注册流程中对用户进行了身份验证,如何解决Firebase“用户未授权”错误?

来自分类Dev

检查用户是否对范围进行了投票

来自分类Dev

jQuery验证:确定字段是否在表单提交或差异上进行了验证。事件?

来自分类Dev

在处理POST请求时找出谁在Node上通过basicAuth进行了身份验证

来自分类Dev

FB朋友列表已对同一应用程序进行了身份验证

来自分类Dev

通过javascript AND凭证提供程序对AWS API Gateway进行了身份验证

来自分类Dev

无密钥身份验证的无Pasword Rsync over SSH [不安全]

来自分类Dev

在Firebase上进行用户身份验证,显示受限内容

来自分类Dev

错误:7 PERMISSION_DENIED:您的应用已使用Google Cloud SDK中的最终用户凭据进行了身份验证

来自分类Dev

不安全的md5如何使用md5获取用于身份验证的用户名和密码

来自分类Dev

检查用户是否使用 PHP 在服务器上通过 Firebase 身份验证进行身份验证?

来自分类Dev

如何检查用户是否在AngularJS路由器中通过了身份验证?

来自分类Dev

角度ui路由器用户身份验证检查

来自分类Dev

与表单身份验证相比,JWT在不安全网络上的安全性

来自分类Dev

如何检查电子邮件是否已在Firebase中使用参数进行了验证?

来自分类Dev

检查用户登录的页面是否在Angular 2中进行了更改

来自分类Dev

Google Play应用内审核API。如何检查用户是否对该应用进行了评分?

来自分类Dev

如何检查用户是否在24小时滑轨之前进行了投票4

来自分类Dev

使用Google登录进行身份验证之前,请检查用户是否已登录-Flutter

来自分类Dev

客户端身份验证方案“匿名”对HTTP请求进行了未经授权的访问(通过C#基本身份验证写入)

来自分类Dev

检查用户今天是否已通过身份验证

来自分类Dev

播放框架。如何检查用户是否通过身份验证?

来自分类Dev

检查经过身份验证的用户是否可以访问 URL

Related 相关文章

  1. 1

    我应该如何检查用户是否在MVC5中进行了身份验证?

  2. 2

    Flask-Login检查是否在没有装饰器的情况下对用户进行了身份验证

  3. 3

    客户端检查是否在Firebase中进行了身份验证

  4. 4

    检查是否在 ApplicationController 中进行了身份验证,导致“参数数量错误(给定 1,预期为 0)”

  5. 5

    如何知道用户是否通过 firebase 的第一个请求进行了身份验证

  6. 6

    为什么基于MAC的身份验证不安全?

  7. 7

    即使在注册流程中对用户进行了身份验证,如何解决Firebase“用户未授权”错误?

  8. 8

    检查用户是否对范围进行了投票

  9. 9

    jQuery验证:确定字段是否在表单提交或差异上进行了验证。事件?

  10. 10

    在处理POST请求时找出谁在Node上通过basicAuth进行了身份验证

  11. 11

    FB朋友列表已对同一应用程序进行了身份验证

  12. 12

    通过javascript AND凭证提供程序对AWS API Gateway进行了身份验证

  13. 13

    无密钥身份验证的无Pasword Rsync over SSH [不安全]

  14. 14

    在Firebase上进行用户身份验证,显示受限内容

  15. 15

    错误:7 PERMISSION_DENIED:您的应用已使用Google Cloud SDK中的最终用户凭据进行了身份验证

  16. 16

    不安全的md5如何使用md5获取用于身份验证的用户名和密码

  17. 17

    检查用户是否使用 PHP 在服务器上通过 Firebase 身份验证进行身份验证?

  18. 18

    如何检查用户是否在AngularJS路由器中通过了身份验证?

  19. 19

    角度ui路由器用户身份验证检查

  20. 20

    与表单身份验证相比,JWT在不安全网络上的安全性

  21. 21

    如何检查电子邮件是否已在Firebase中使用参数进行了验证?

  22. 22

    检查用户登录的页面是否在Angular 2中进行了更改

  23. 23

    Google Play应用内审核API。如何检查用户是否对该应用进行了评分?

  24. 24

    如何检查用户是否在24小时滑轨之前进行了投票4

  25. 25

    使用Google登录进行身份验证之前,请检查用户是否已登录-Flutter

  26. 26

    客户端身份验证方案“匿名”对HTTP请求进行了未经授权的访问(通过C#基本身份验证写入)

  27. 27

    检查用户今天是否已通过身份验证

  28. 28

    播放框架。如何检查用户是否通过身份验证?

  29. 29

    检查经过身份验证的用户是否可以访问 URL

热门标签

归档