2017-02-20 122 views
0

我開始使用此框架的Web應用程序。我有與第一部分的問題,登錄: 我有兩個實體:Symfony安全防火牆

USERS

<?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'; 
} 
} 

CLIENTS

<?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 

我不知道,如果在這一點上I'm權利。有兩種用戶: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){ 

    } 
} 

如果我在瀏覽器中寫「本地host/app/web/app_dev.php「,它會將我重定向到」localhost/app/web/app_dev.php/users/login「,但出現302錯誤,並顯示」太多重定向「。如果我打開Chrome控制檯(F12),我會每3秒鐘看到很多login.php文件「打開」。

enter image description here

+0

獨立測試每個部分,是否認證工作? 添加安全性:將虛假添加到防火牆的「前端」並嘗試登錄。 另外,您可能需要指定防火牆'前端'的提供商 – Strnm

回答

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 

我認爲,匿名參數將解決您的問題。

+0

非常感謝,我錯過了文檔,我想我必須刪除匿名:〜通過登錄訪問所有頁面,但登錄必須無需訪問用戶登錄。我的錯。 – SensacionRC