【问题标题】:Silex SecurityServiceProvider, anonymous setting doesn't workSilex SecurityServiceProvider,匿名设置不起作用
【发布时间】:2013-12-09 12:46:50
【问题描述】:

现在我正在为使用 Silex 的持续集成服务器开发一个简单的 API。 现在每个人都应该可以使用密钥访问 api,但是对于已登录的用户,我希望 api 在没有任何密钥的情况下可用。

现在 SecurityServiceProvider 的配置如下所示:

'security.firewalls' => array(

    'login' => array(
        'pattern' => '^/auth/login'
    ),
    'secured' => array(
        'pattern' => '^/',
        'form' => array(
            'login_path' => "/auth/login",
            'check_path' => "/auth/dologin",
            'username_parameter' => 'login[username]',
            'password_parameter' => 'login[password]',
            "csrf_parameter" => "login[_token]",
            "failure_path" => "/auth/login",
        ),
        'logout' => array(
            'logout_path' => "/auth/logout",
            "target" => '/',
            "invalidate_session" => false
        ),
        'users' => array(
            // admin:foo
            'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg==')
        )
    ),'api' => array(
        'pattern' => '^/api',
        'anonymous' => true
    ),
)

可悲的是,当我在 /api/ 页面上时,它仍然会将我重定向到登录页面,尽管您可以看到匿名 => true。

我可以在顶部移动 /api 的防火墙并删除匿名行,但是我无权访问 SecurityContext 对象来检查用户是否经过身份验证。

【问题讨论】:

    标签: php silex


    【解决方案1】:

    一般允许匿名用户并使用访问规则来定义保护区:

    // init the firewall
    $app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'general' => array(
            'pattern' => '^/',
            'anonymous' => true,
            'form' => array(
                'login_path' => '/login',
                'check_path' => '/admin/login_check'
            ),
            'users' => $app->share(function  () use( $app)
            {
                return new UserProvider($app);
            }),
            'logout' => array(
                'logout_path' => '/admin/logout',
                'target_url' => '/goodbye'
            )
        )
    ),
    'security.access_rules' => array(
        array('^/admin', 'ROLE_ADMIN')
    ),
    'security.role_hierarchy' => array(
        'ROLE_ADMIN' => array('ROLE_USER', 'ROLE_ALLOWED_TO_SWITCH')
    )
    

    ));

    如果您想保护除 /api 之外的所有内容,只需定义两个防火墙:

    // init the firewall
    $app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'anonymous' => array(
            'pattern' => '^/api',
            'anonymous' => true
        ),
        'general' => array(
            'pattern' => '^/',
            'anonymous' => false,
            ...
        )
    ),
    

    【讨论】:

    • 我想保护一切,除了 /api/。
    • 在这种情况下定义两个防火墙(参见上面的示例)。
    • 它仍然重定向到登录页面。我在最初的问题中说过。我可以在没有“'anonymous' => true”这一行的情况下访问/api而不登录,但是添加它之后,Silex会重定向到/login。
    • 好的 - 这似乎是错误的方式。那么,如何为所有未通过身份验证的用户创建一个“API_USER”用户并自动登录呢?您可以为他们分配角色 API_USER 并通过检查角色来处理 KEY?
    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多