允许用户和匿名用户查看网站,但要保护其中的一部分

时间:2015-11-13 10:47:05

标签: php silex

我遇到了问题:我想允许用户和匿名视图网站,并且只允许用户采取某些操作(我已经覆盖了)。问题是某些路径(/帐户等)应该只对已登录的用户可访问。 我真的很难配置我的secure.php但是,无论是匿名者都可以访问/帐户,或者我无法访问任何地方的用户,除了/ account /...

尝试了两个:

$app['security.firewalls'] = array(
'secured' => array(
    'pattern' => '/account',
    'form' => array('login_path' => '/login', 'check_path' => '/account/login_check'),
    'logout' => array('logout_path' => '/account/logout', 'invalidate_session' => true),
    'users' => $app->share(function () use ($app) {
        return new UserProvider($app['db']);
    }),
),
'unsecured' => array(
  'pattern'=> '/',
    'anonymous' => true,
)
);

$app['security.firewalls'] = array(
'secured' => array(
    'pattern' => '/account',
    'anonymous'=> true,
    'form' => array('login_path' => '/login', 'check_path' => '/account/login_check'),
    'logout' => array('logout_path' => '/account/logout', 'invalidate_session' => true),
    'users' => $app->share(function () use ($app) {
        return new UserProvider($app['db']);
    }),
),

);

2 个答案:

答案 0 :(得分:0)

您需要在授权步骤中执行此操作,因此您必须配置security.access_rules key

您可以通过在其中启用匿名和经过身份验证的用户来执行此操作,然后使用访问规则限制对/ accounts URI的访问,以仅允许经过身份验证的用户:

<?php

$app['security.firewalls'] = array(
'secured' => array(
    'pattern' => '^.*$',
    'anonymous' => true,
    'form' => array('login_path' => '/login', 'check_path' => '/account/login_check'),
    'logout' => array('logout_path' => '/account/logout', 'invalidate_session' => true),
    'users' => $app->share(function () use ($app) {
        return new UserProvider($app['db']);
    }),
);
// By using authorization the access to the /account/* is protected to
// users with the ROLE_USER (you can be more creative here if you want)
// and with the second rule the whole site is allowed to non authenticated
// users (remember the /login path must not be protected!)
$app['security.access_rules'] = array(
  // this could be also array('^/account', 'ROLE_USER')
  array('^/account', 'IS_AUTHENTICATED_FULLY'),
  array('^.*$', 'IS_AUTHENTICATED_ANONYMOUSLY')
);

有关授权的详情,请参阅Symfony doc。此外,如果您想了解有关没有角色check this out

的访问控制的更多信息

答案 1 :(得分:-1)

最简单的方法是在页眉中设置会话。

if(!isset($_SESSION["logged_in"])){
  header("Location: http://www.example.com/");
}

这很原始 - 您是否考虑过使用MVC框架?会节省你很多时间。

为什么不创建一个控制器?