当前位置: 首页 > 知识库问答 >
问题:

symfony2仅匿名登录

潘宝
2023-03-14

我想限制登录用户的登录路径,

security.yml

security:
encoders:

    Site\Bundle\AdminBundle\Entity\Users:
        algorithm: md5
        iterations: 0
        encode_as_base64:   false

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]

providers:
    in_memory:
        memory:
             users:
                ryan:  { password: ryanpass, roles: 'ROLE_USER' }
                admin: { password: kitten, roles: 'ROLE_ADMIN' }
    administrators:
        entity: { class: SiteAdminBundle:Users , property: username}

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false


    secured_area:
        pattern:   ^/
        anonymous: ~
        http_basic:
            realm: "Secured Demo Area"
        form_login:
            login_path: /login
            check_path: /login_check
        logout:
            path:   /logout
        provider: administrators
access_control:
    - { path: ^/admin/*, roles: ROLE_ADMIN }
    - { path: /login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/*, role: IS_AUTHENTICATED_ANONYMOUSLY }

我的登录功能:

    public function loginAction(Request $request)
{
    $session = $request->getSession();

    // get the login error if there is one
    if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
        $error = $request->attributes->get(
            SecurityContextInterface::AUTHENTICATION_ERROR
        );
    } elseif (null !== $session && $session->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
        $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR);
        $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR);
    } else {
        $error = '';
    }

    // last username entered by the user
    $lastUsername = (null === $session) ? '' : $session->get(SecurityContextInterface::LAST_USERNAME);

    return $this->render(
        'SiteSecurityBundle:Default:login.html.twig',
        array(
            // last username entered by the user
            'last_username' => $lastUsername,
            'error'         => $error,
        )
    );
}

问题是它可以工作,例如,对于/admin,只有ROLE\u admin有访问权限,ROLE\u用户号。但是/login,如果我登录或不登录,我可以访问它,在symfony2开发工具中,我看到我是匿名的,我登录了stel。。。我没有主意

共有1个答案

公良照
2023-03-14

有许多方法可以限制用户对某些资源的访问。下面您将看到其中的两种方法:

1)安装了SensioFrameworkExtraBundle(包含在Symfony2全栈版本中),您可以像这样为控制器使用注释

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

class YourController extends Controller
{
    /**
     * @Security("is_granted('IS_AUTHENTICATED_ANONYMOUSLY')")
     */
    public function loginAction(Request $request)
    {
        // ...
    }
}

2)没有SensioFrameworkExtraBundle注释

use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class YourController extends Controller
    {
        public function loginAction(Request $request)
        {
            if (true === $this->get('security.context')->isGranted('ROLE_ADMIN')) {
                throw new AccessDeniedException('Unable to access this page!');

                # or you can do also a redirect instead of exception
                return $this->redirect($this->generateUrl('homepage'));
            }

            // ...
        }
    }

正如这里和这里的文档所解释的

 类似资料:
  • 问题内容: 我有一个示例,尝试使用Symfony2和FOSUserBundle创建AJAX登录。我设置我自己和在我的文件。 这是课程: 这对于处理成功和失败的AJAX登录尝试都非常有用。但是,启用后-我无法通过标准表单POST方法(非AJAX)登录。我收到以下错误: 我希望自己的重写和重写仅对XmlHttpRequests(AJAX请求)执行,如果没有,则将执行交还给原始处理程序。 有没有办法做到

  • 当使用Firebase身份验证匿名帐户时,它偶尔会在系统中创建一个新的用户ID,有时它会使用相同的用户ID。我真的希望每次都能创建相同的用户ID,这样匿名用户仍然可以在应用程序中维护相同的进度/数据。这实际上是我开始使用Firebase的原因。即使在重新启动应用程序等之后,我如何始终维护一个匿名帐户来保持相同的用户ID? 我希望用户每次以访客身份玩游戏时都能获得相同的ID。我看到有些应用程序在卸载

  • 你好我按照这个教程:http://symfony.com/doc/current/cookbook/security/entity_provider.html My security.yml: 在数据库中,我有: 用户: 角色: 用户角色: 每次我尝试用DB中的一个用户登录时,我都会得到“坏凭据”。但是,如果我使用内存中定义的“test”用户登录,没有问题 我想这是我的安全问题。但我做错了什么?

  • 应用程序类: application.yml:

  • 一个元素可以按照HTML元素的嵌套方式包含其他元素,大多数情况下,框都是由显式定义的元素所生成的。 然而,当把文本直接添加到一个块容器元素中(不是包含在行内元素)时,即便没有为这些文本显式定义元素,它们也会生成框。 没有被元素显式包含的文本,称作匿名文本,因为没有与之关联的元素。把匿名文本所生成框,称作匿名框。匿名框分为两种,一种是匿名块框,另一种是匿名行内框。 当把文本直接添加到一个块容器元素中

  • 匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。 匿名类有两种实现方式: 继承一个类,重写其方法。 实现一个接口(可以是多个),实现其方法。 下面通过代码来说明。 程序的输出结果如下: 从输出结果可以看出,匿名内部类有