Silex SecurityServiceProvider, анонимная настройка не работает

Сейчас я разрабатываю простой 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/, он все равно перенаправляет меня на страницу входа в систему, хотя, как вы можете видеть, анонимно => правда.

Я могу переместить брандмауэр для /api вверху и удалить анонимную строку, но тогда у меня нет доступа к объекту SecurityContext, чтобы проверить, аутентифицирован ли пользователь.


person nvartolomei    schedule 09.12.2013    source источник


Ответы (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,
        ...
    )
),
person Ralf Hertsch    schedule 09.12.2013
comment
Я хочу защитить все, кроме /api/. - person nvartolomei; 09.12.2013
comment
В этом случае определите два брандмауэра (см. пример выше). - person Ralf Hertsch; 09.12.2013
comment
Он по-прежнему перенаправляет на страницу входа. Я сказал это в первоначальном вопросе. Я могу получить доступ к /api без входа в систему без этой строки «anonymous» =› true, но после ее добавления Silex перенаправляет на /login. - person nvartolomei; 09.12.2013
comment
хорошо - это, кажется, неправильный путь. Итак, как создать пользователя «API_USER» для всех, кто не аутентифицирован, и автоматически входить в систему? Вы можете назначить им роль API_USER и обрабатывать KEY, проверив роль? - person Ralf Hertsch; 10.12.2013