0

我正在用 symfony 2.2 开发一个网站。我使用 FOSUserBundle,我的网站基本上由主页、登录页面、注册页面和安全区域组成。

我想要做的是当用户输入我的网站地址时:

  • 如果匿名 -> 转到主页

  • 如果记得 -> 去安全区域

我尝试了 2 种不同的方法,但它们不起作用。

1)如果我将我的 url /放在安全区域中,我会正确重定向到 login_path。但是在 security.yml 中选择我的 login_path 时,我遇到了一个问题:

  • 如果我把/login,匿名重定向到登录而不是主页

  • 如果我放/homepage,匿名将被重定向到主页,但如果在登录表单中输入错误凭据,它们将被重定向到主页,而不是在/login中看到错误消息

2)如果我将我的 url /提供给与我的主页相对应的匿名用户,并且 login_path = /login它工作得很好,除了记住的用户也可以访问主页而不是安全区域。

在最后一种情况下,如果我发现它们被记住了,我会尝试将它们重定向到安全区域,但是我在论坛中找到的 2 个代码并且我在控制器中尝试过的代码不起作用......

public function indexAction()
    {
        $securityContext = $this->container->get('security.context');
        $user = $securityContext->getToken()->getUser();
        if (is_object($user) && $user instanceof UserInterface ) {
            return $this->redirect($this->generateUrl('tk_user_homepage'));
        }else if( $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') ){
            return $this->redirect($this->generateUrl('tk_user_homepage'));
        }else{
            return $this->render('TkWelcomeBundle:Default:index.html.twig');
        }
    }

当我回到我的网站时,我得到 $user 是一个非对象,第二个语句是错误的。但是我可以使用 url 访问安全区域。

这样做的正确方法是什么(1或2),在每种情况下我都缺少什么?

编辑

其实我做了这个测试:

从主页到安全区域来回移动并测试用户是否为 is_granted:

'role_user'、'is_authenticated_anonimously'、'is_authenticated_remembered' 和 'is_authenticated_fully'

在安全区域中,我得到了我期望的(1,0,1,1),但是当我进入主页时它是(0,0,0,0),我可以返回安全区域并检索(1,0, 1,1)。

所以我猜我的主页上没有安全上下文。有人对此有提示吗?

提前谢谢你,朱尔斯

4

1 回答 1

0

这似乎是有效的:

我需要有防火墙下的 url,它为用户提供访问用户的权限。所以我把我所有的网站都放在匿名授权的安全区域并玩访问控制:将访问主页/登录/注册的权限授予匿名,然后我只允许记住的用户访问整个网站。

这是我的security.yml

firewalls:
    secured_area:
        pattern: ^/
        anonymous: ~
        form_login:
            login_path: /login
            check_path: /login_check
            default_target_path: tk_user_homepage
            provider: fos_userbundle
            remember_me: true
            csrf_provider: form.csrf_provider
        remember_me:
            key: %secret%
        logout:
            path:   fos_user_security_logout
            target: fos_user_security_login

access_control:
    - { path: ^/$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
    - { path: ^/admin/, role: ROLE_ADMIN }

我希望这会有所帮助。

朱尔斯

于 2013-07-13T10:21:45.207 回答