Silex SecurityServiceProvider,匿名设置不';不起作用


Silex SecurityServiceProvider, anonymous setting doesn't work

现在我正在开发一个简单的API,用于Silex的持续集成服务器。现在,每个有密钥的人都应该可以访问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/pages上时,它仍然会将我重定向到登录页面,尽管您可以看到匿名=>true。

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

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

// 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,
        ...
    )
),