Silex SecurityServiceProvider,匿名设置不起作用

时间:2013-12-09 12:46:51

标签: php silex

现在我正在为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 / pages时,它仍然会将我重定向到登录页面,尽管你可以看到anonymous =>真。

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

1 个答案:

答案 0 :(得分:3)

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

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