Symfony安全防火墙

时间:2017-02-20 16:59:43

标签: symfony

我正在使用此框架启动Web应用程序。我的第一部分,登录有问题: 我有两个实体:

用户

<?php

namespace app\UsuariosBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

/**
 * Users
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Users implements UserInterface
{
//some properties and getters and setters

public function getPassword()
{
    return $this->password;
}

function eraseCredentials()
{
}
function getRoles(){
    return array('ROLE_USUARIO');
}
function getUsername(){
    return $this->getEmail();
}
function getSalt(){
    return 'my_salt';
}
}

客户

<?php

namespace app\ClientesBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

/**
 * Clients
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Clients implements UserInterface
{
//some properties and getters and setters

public function getPassword()
{
    return $this->password;
}

function eraseCredentials()
{
}
function getRoles(){
    return array('ROLE_USUARIO');
}
function getUsername(){
    return $this->getEmail();
}
function getSalt(){
    return 'my_salt';
}
}

我添加了这些最后的方法,因为在文档中它说我们需要。

现在我已经配置了security.yml文件

security:

    encoders:
        app\UsersBundle\Entity\Users: { algorithm: sha512 }
        app\Clients\Entity\Clients: { algorithm: sha512 }
    access_control:
        - { path: ^/users/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/users/registro, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/users/*, roles: ROLE_USUARIO }
    role_hierarchy:
        ROLE_ADMIN:     [ROLE_USER, ROLE_SONATA_ADMIN,ROLE_USUARIO]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 
    providers:
        chain_provider:
            chain:
                providers: [users, clients]
        users:
            entity: { class: app\UsersBundle\Entity\Users, property: email }
        clients:
            entity: { class: app\ClientsBundle\Entity\Clients, property: email }    
    firewalls:
        frontend:
            pattern:    ^/*
            provider:   chain_provider
            form_login:
                login_path: users_login
                check_path: users_login_check
            logout:
                path: users_logout

我不知道在这一点上我是否正确。有两种用户:USERS和CLIENTS(chain_provider在两种用户之间进行登录是否正确?)。

用户路由文件

users_login:
    pattern:  /login
    defaults: { _controller: UsersBundle:Default:login }

users_login_check:
    pattern:  /login_check

users_logout:
    pattern:   /logout

配置路由文件

users:
    resource: "@UsersBundle/Resources/config/routing.yml"
    prefix:   /users
home:      
    path:     /users/login
    defaults: { _controller:UsersBundle:Default:home}   

_home:
    path:     /
    defaults: { _controller FrameworkBundle:Redirect:redirect, route: home }

最后是UsersBundle控制器:

<?php

namespace app\UsersBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContext;

class DefaultController extends Controller
{
    public function homeAction(){
        return $this->render('UsuariosBundle:Default:login.html.twig');
    }

    public function loginAction(Request $peticion){

    }
}

如果我在浏览器中写入“localhost / app / web / app_dev.php”,它会将我重定向到“localhost / app / web / app_dev.php / users / login”,但我收到错误302,并说“太多的重定向“。如果我打开chrome控制台(F12),我会看到很多login.php文件每3秒“打开”一次。

enter image description here

1 个答案:

答案 0 :(得分:1)

您似乎忘记了anonymous ~参数。 改变你的代码:

frontend:
            pattern:    ^/*
            provider:   chain_provider
            form_login:
                login_path: users_login
                check_path: users_login_check
            logout:
                path: users_logout

就像那样:

frontend:
    anonymous: ~
    pattern:    ^/
    provider:   chain_provider
        form_login:
            login_path: users_login
            check_path: users_login_check
        logout:
            path: users_logout

我认为,匿名参数可以解决您的问题。