Symfony CMF管理员登录错误

时间:2015-06-22 13:44:41

标签: php symfony symfony-cmf

我安装了symfony CMF。当我想以管理员身份登录时,我收到此错误:

Unable to find the controller for path "/demo/login_check". The route is wrongly configured.

代码cmf/src/Acme/DemoBundle/Resources/config/routing.yml

_demo_security:
    resource: "@AcmeDemoBundle/Controller/SecurityController.php"
    type: annotation

_demo_login_check:
    path: /login_check

_demo_logout:
    path: /logout

代码SecurityController

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class SecurityController extends Controller
{
    /**
     * @Route("/login", name="_demo_login")
     * @Template
     */
    public function loginAction(Request $request)
    {
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $request->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
        }

        return array(
            'last_username' => $request->getSession()->get(SecurityContext::LAST_USERNAME),
            'error'         => $error,
        );
    }
}

安全控制器没有login_check的操作。

1 个答案:

答案 0 :(得分:0)

在大多数情况下,symfony会通过它的身份验证侦听器自动处理登录。所以基本上,当您发布到/domo/login_check路由时,表单登录身份验证侦听器将处理您的登录。但是,您可以将这些内容配置为security.ymlapp/config/security.yml文件的防火墙部分。下面是我使用的演示文件。

security:
providers:
    in_memory:
        memory:
            users:
                ryan:
                    password: ryanpass
                    roles: 'ROLE_USER'
                admin:
                    password: $2a$12$cyTWeE9kpq1PjqKFiWUZFuCRPwVyAZwm4XzMZ1qPUFl7/flCM3V0G
                    roles: 'ROLE_ADMIN'
    invetico.user_provider:
        entity:
            class: Bundle\UserBundle\Entity\User
            property: username
            # if you're using multiple entity managers
            # manager_name: customer
encoders:
    Bundle\UserBundle\Entity\User:
        algorithm: bcrypt
        cost: 12
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt|error)|css|images|js)/
        security: false
    default:
        pattern: ^/
        anonymous: ~
        http_basic: ~
        provider: invetico.user_provider
        form_login:
            login_path: _login
            check_path: _login_check
        logout:
            path: _logout
            target: /
        remember_me:
            key:      "%secret%"
            lifetime: 300 # 1 week in seconds
            path:     /
    # Super admin stuff
    admin_restricted_area:
        pattern:  ^/admin
        http_basic:
        provider: invetico.user_provider
access_control:
# require ROLE_ADMIN for /admin*
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/users, roles: IS_AUTHENTICATED_FULLY }
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/account, roles: ROLE_USER }

因此,您可以在防火墙部分看到我配置了三个火焰,devdefaultadmin_restricted_area

所以如果你看一下default防火墙,我告诉symfony使用form_login身份验证监听器来处理登录表单显示和登录检查。所以在你的情况下它将是

            form_login:
            login_path: _demo_login
            check_path: _demo_login_check

现在提供者部分告诉symfony使用我自己的用户提供者,其原因必须是Symfony\Component\Security\Core\User\UserProviderInterface

因此您无需为登录检查路由编写操作。 Symfony拦截您的_demo_login_check并自动处理