【问题标题】:Verify if user is authenticated in symfony2验证用户是否在 symfony2 中通过身份验证
【发布时间】:2015-04-24 06:26:56
【问题描述】:

我试图在 symfony2 中创建一个简单的登录应用程序,但我什么都不懂。 我的路由文件:

shop_show_login_page:
path: /login
defaults: { _controller: ShopDesktopBundle:User:loginPage }

shop_login_user:
path: /loginUser
defaults: { _controller: ShopDesktopBundle:User:loginCheck }

我的控制器有这两种方法:

public function loginPageAction(){
    return $this->render('ShopDesktopBundle:User:loginPage.html.twig');
}
public function loginCheckAction(Request $request){
    $request = $this->get('request');
    $password = $request->request->get('password');
    $login    = $request->request->get('username');
    $em = $this->getDoctrine()->getEntityManager();
    $repository = $em->getRepository('ShopDesktopBundle:Customer');
    $user = $repository->findOneBy(array('customer_login'=> $login, 'customer_password'=> $password));
    if($user){
        return $this->redirect($this->generateUrl('shop_desktop_homepage'));
    }else{
        return $this->render('ShopDesktopBundle:User:loginPage.html.twig',array('message_failed' => 'Error'));
    }
}

我的表单在视图中:

 <form action="{{ path('shop_login_user') }}" method="post">
                <div class="form-group">
                    <div class="input-group">
                        <span class="input-group-addon"><i class="fa fa-user"></i></span>
                        <input type="text" class="form-control" placeholder="Username" name="username">
                    </div>
                </div>
                <div class="form-group">
                    <div class="input-group">
                        <span class="input-group-addon"><i class="fa fa-lock"></i></span>
                        <input type="text" class="form-control" placeholder="Password" name="password">
                    </div>
                </div>
                <div class="form-group">
                    <button type="submit" class="button">Autentificare</button>
                </div>
            </form>

这个系统在登录时工作正常,但问题出在 layout.html.twig:

{% if app.user %}
     <p>Test</p>
{% elseif not app.user %}
     <span><a href="{{ path('shop_show_login_page') }}" style="color: #ffffff;">Login / Register</a></span>
{% endif %}

我的 security.yml:

security:
# http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password
encoders:
    Symfony\Component\Security\Core\User\User: plaintext

# http://symfony.com/doc/current/book/security.html#hierarchical-roles
role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
    in_memory:
        memory:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }

# the main part of the security, where you can set up firewalls
# for specific sections of your app
firewalls:
    # disables authentication for assets and the profiler, adapt it according to your needs
    secured_area:
        pattern:    ^/
        form_login:
            check_path: shop_login_user
            login_path: shop_show_login_page
        logout:
            path:   _demo_logout
            target: _demo
        #anonymous: ~
        #http_basic:
        #    realm: "Secured Demo Area"

# with these settings you can restrict or allow access for different parts
# of your application based on roles, ip, host or methods
# http://symfony.com/doc/current/cookbook/security/access_control.html
access_control:
    #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

所以我想在页面“测试”中查看用户是否通过成功的身份验证,如果身份验证失败则登录/注册。我尝试了“if app.user”,但我不明白原理。

【问题讨论】:

标签: php symfony symfony-forms symfony-2.1 symfony-2.3


【解决方案1】:

有几种方法可以检查用户是否已通过身份验证。

您尝试过使用app.user,如下所示:

{% if app.user is not empty %}

这将检查您的用户对象是否填充了数据。

您也可以使用is_granted()

{% if is_granted('IS_AUTHENTICATED_FULLY') %}

- 更新-

您在 cmets 中提供的错误可能是由于您在未位于防火墙后面时尝试使用 is_granted 函数引起的。如果是这种情况,您可以在使用if app.security.token is not empty 调用is_granted 之前先检查是否有安全令牌。你会包含你的 security.yml 文件吗?

- 更新-

您的安全文件需要正确设置,您的身份验证才能正常工作。默认行为设置为给您一个起点,但您必须配置防火墙。看看并仔细阅读 Symfony 中关于Security 的章节。

【讨论】:

  • 提交表单后调试工具栏是否显示您已登录?
  • 我收到错误:在呈现模板期间抛出异常(“令牌存储不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙。”
  • @Gigel,添加了更多信息。
  • 我添加了security.yml,我没有更改它们,它是默认的
  • @Gigel,您还需要配置安全性。我添加了您应该阅读的章节的链接。
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2017-09-11
  • 2012-02-10
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多