代码之家  ›  专栏  ›  技术社区  ›  Alexandre Corvino

如何使用symfony 4创建登录身份验证表单

  •  0
  • Alexandre Corvino  · 技术社区  · 8 年前

    首先,我很抱歉在这里提出这样的问题,但是如果您以前从未参与过symfony项目,symfony文档并没有提供太多完整的示例。

    所以 我已经安装了symfony/security包,我从本教程开始 https://symfony.com/doc/current/security/form_login_setup.html

    包/安全。亚马尔

    security:
        providers:
            users:
                entity:
                    class: Entity:Users
        firewalls:
            main:
                anonymous: ~
                form_login:
                    login_path: login
                    check_path: login
    

    Login\u path和check\u path是我的安全控制器使用的道路,但它们之间有什么区别?

    我不知道应该如何配置我的实体::用户喜欢哪一个

    https://symfony.com/doc/current/security.html#security-user-providers https://symfony.com/doc/current/doctrine/registration_form.html

    最重要的是,我永远无法自己检查登录名 (我想安全性应该使用特定的用户实现,但我感到困惑:()

    这是我的路

    配置/路由。亚马尔

    login:
        path: /
        controller: App\Controller\SecurityController::login
    
    logged:
        path: /
        controller: App\Controller\SecurityController::logged
    

    我的安全控制器

    src/控制器/安全控制器。php

    <?php  // src/Controller/SecurityController.php
    
    namespace App\Controller;
    
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
    
    
    class SecurityController extends Controller
    {
    
        public function logged(EntityManagerInterface $em, Request $request, AuthenticationUtils $authUtils) 
        {
    
            error_log(".OMG.");
    
    
            return $this->render('security/logged.html.twig', array(
                'username' => $username,
                'password' => $password,
            ));
        }
    
        public function login(Request $request, AuthenticationUtils $authUtils)
        {
            error_log(".Login.");
            $username = $request->get('_username');
            $password = $request->get('_password');
    
        // get the login error if there is one
            $error = $authUtils->getLastAuthenticationError();
    
        // last username entered by the user
            $lastUsername = $authUtils->getLastUsername();
    
            return $this->render('security/login.html.twig', array(
                'last_username' => $lastUsername,
                'error'         => $error,
            ));
        }
    
    }    
    

    还有我在里面调用的模板树枝

    模板/安全/登录。html。细枝

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="description" content="">
        <meta name="author" content="">
        <link rel="icon" href="../../../../favicon.ico">
    
        <title>Signin Template for Bootstrap</title>
    
        <!-- Bootstrap core CSS -->
        <link href="{{ asset('bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
    
        <!-- Custom styles for this template -->
        <link href="{{ asset('css/login.css') }}" rel="stylesheet">
    </head>
    
    <body>
    
        <div class="container">
    
    
            <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    
    
            {% if error %}
            <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
            {% endif %}
    
            <form action="{{ path('logged') }}" method="post" class="form-signin">
                <h2 class="form-signin-heading">Please sign in</h2>
    
                <label for="username" class="sr-only">Username:</label>
                <input type="text" id="username" name="_username" value="{{ last_username }}" class="form-control" required autofocus/>
    
                <label for="password" class="sr-only">Password:</label>
                <input type="password" id="password" name="_password"  class="form-control" placeholder="Password" required/>
    
                <div class="checkbox">
                    <label>
                        <input type="checkbox" value="remember-me"> Remember me
                    </label>
                </div>
    
                {#
                    If you want to control the URL the user
                    is redirected to on success (more details below)
                    <input type="hidden" name="_target_path" value="/account" />
                    #}
    
                <button type="submit">login</button>
            </form>
    
    
        </div> <!-- /container -->
    </body>
    </html>
    

    这里的问题是,当我使用表单操作{path('logged')}}时,我试图调用我的SecurityController::logged(),但无论发生什么,我都不会打印“.OMG”我总是打印“.Login”。

    我的目标只是提供一个好的身份验证用户表单。。。有人对我的一个问题有什么建议和答案吗?

    甚至是一个简单的例子,但在同一教程中,我们可以看到ORM/用户、包/安全、配置/路由、控制器/安全控制器和细枝文件?

    非常感谢您阅读了所有这些btw!

    1 回复  |  直到 7 年前
        1
  •  3
  •   Archi    8 年前

    你在一篇帖子里有很多问题。也许你可以为每个问题创建几个帖子。

    check\u path是由FOS bundle处理的登录帖子URL。为了避免混淆,我会让它与登录不同。

    您已经列出了提供商,但在登录方法中未提及该提供商。

    尝试以下代码,看看登录是否有效。

    security:
        providers:
            users:
                entity:
                    class: Entity:Users
        firewalls:
            main:
                anonymous: ~
                form_login:
                    provider: users
                    login_path: login
                    check_path: login_check
                    post_only:  true
                    default_target_path: logged
    

    还可以使用{{path('login\u check')}}}更改表单中的帖子url