我正在尝试为我的Symfony3网站构建自定义防火墙。我一直在关注documentation,并且能够让它适用于main
防火墙。我想要的功能是用户使用Symfony的本机类使用他们的用户名和密码登录的能力。这是我的SecurityController
:
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class SecurityController extends Controller
{
/**
* @Route("/m/login", name="model_login")
*/
public function loginAction(Request $request)
{
$authenticationUtils = $this->get("security.authentication_utils");
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('Model/login.html.twig', [
"error" => $error,
"lastUsername" => $lastUsername
]);
}
}
正如您所看到的,除了路由设置已更改之外,完全与示例代码相同。我的登录表单呈现得很好。我提交表单时没有错误,我将表单发布到这个确切的控制器。我的视图效果非常好,因为当我的安全设置在" main之下时,我能够进行身份验证。"这是我的security.yml
:
security:
providers:
in_memory:
memory: ~
doctrine_provider:
entity:
class: AppBundle:Model
property: username
encoders:
AppBundle\Entity\Model:
algorithm: bcrypt
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
model_area:
anonymous: ~
provider: doctrine_provider
pattern: ^/m/
form_login:
login_path: model_login
check_path: model_login
access_control:
- { path: ^/m/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/m/, roles: ROLE_MODEL }
我的提供商和编码器功能正常,例如我在" main"防火墙。但是,当我尝试将我的设置置于" model_area,"提交我的表单只是将我重定向到登录表单,没有身份验证。我只添加了pattern: ^/m/
和- { path: ^/m/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
,因此我不会阻止访问我的登录表单。其他一切都保持不变(甚至是路线名称!)。
我有一个路由/m/model_dashboard
,它会抛出一个错误,说" 需要完全身份验证才能访问此资源。"很明显我的访问控制设置工作正常,但是当我尝试访问受保护资源时,它没有重定向到我的登录表单。
我有什么遗失的东西吗?我非常困惑的是,为什么身份验证在main
下可以正常工作,但在我的自定义防火墙下却没有,后者具有相同的确切设置。
答案 0 :(得分:2)
问题出在我的main
防火墙上。我不知道防火墙的确定与路线类似,从上到下。每个请求都是在“主”防火墙(没有form_login)下提交的,这就是我的登录代码无效的原因。我删除了main
防火墙,它运行得很漂亮。以下是我更新的security.yml
现在的样子:
security:
providers:
in_memory:
memory: ~
doctrine_provider:
entity:
class: AppBundle:Model
property: username
encoders:
AppBundle\Entity\Model:
algorithm: bcrypt
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
model_area:
anonymous: ~
provider: doctrine_provider
pattern: ^/m/
form_login:
login_path: model_login
check_path: model_login
access_control:
- { path: ^/m/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/m/, roles: ROLE_MODEL }