我安装了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
的操作。
答案 0 :(得分:0)
在大多数情况下,symfony会通过它的身份验证侦听器自动处理登录。所以基本上,当您发布到/domo/login_check
路由时,表单登录身份验证侦听器将处理您的登录。但是,您可以将这些内容配置为security.yml
中app/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 }
因此,您可以在防火墙部分看到我配置了三个火焰,dev
,default
,admin_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
并自动处理