2014-11-04 49 views
1

搜索了2天后嘗試了許多不同的解決方案,但找不到答案。我按照教程(http://roberto.costumero.es/2011/08/15/creando-un-login-simple-con-symfony2/)的步驟來建立一個簡單的登錄過程,其中我有:登錄中的角色未存儲在安全上下文的用戶

  • 表用戶
  • 表的角色

很多他們之間有很多關係(user_rol )。所有的mysql表都被正確地創建了,並且我也有ORM Doctrine Classes。

如果我加載通過手的用戶,並加載它們的角色是工作完全正常,但是當我在被識別的用戶使用該自動登錄

{% block body %} 
{% if error %} 
    <div>{{ error.message }}</div> 
{% endif %} 

<form action="{{ path('login_check') }}" method="post"> 
    <label for="username">Usuario:</label> 
    <input id="username" type="text" name="_username" value="{{ last_username }}" /> 
    <label for="password">Contraseña:</label> 
    <input id="password" type="password" name="_password" /> 

    {# 
    If you want to control the URL the user 
    is redirected to on success (more details below) 
    <input type="hidden" name="_target_path" value="/account" /> 
    #} 

    <input type="submit" name="login" /> 
</form> 
{% endblock %} 

登錄後但在_profiler說一條警告消息「認證NO」(可能是因爲用戶沒有角色)

所以我做這個代碼:

$user = $this->get('security.context')->getToken()->getUser(); 
print_r(count($user->getRoles())) 

而且角色是空的。有任何想法嗎?

P.D:我試着覆蓋對象的序列化函數幷包括角色,但它沒有工作。

回答

0

El problema ha sido mezclarlo con or ORM que elige la base de datosdinámicamente。 El panel principal que cambiaba los datos deconfiguraciónpara seleccionar la base de datos dependiendo del subdominio no se vuelve a llamar antes de hacer un login_check,con lo cual consulta a una BBDDerrónea。

Por si a alguien le pasa losolucionéincluyendo un servicio que cambia de BBDDdinámicamenteyllamándoledes la lafunciónboot del Bundle que controla la parte de usuarios logeados。

迪登特魯德DataBundle \的Util \ Connection.php

public function initRuntimeConnection($company) { 
    // Choose the database 
    $this->database = "$company"; 

    // Get the default connection 
    $connection = $this->container->get(sprintf('doctrine.dbal.%s_connection', 'default')); 
    $connection->close(); 

    $refConn = new \ReflectionObject($connection); 
    $refParams = $refConn->getProperty('_params'); 
    $refParams->setAccessible('public'); //we have to change it for a moment 

    $params = $refParams->getValue($connection); 
    $params['dbname'] = $this->database; 

    $refParams->setAccessible('private'); 
    $refParams->setValue($connection, $params); 
    $this->container->get('doctrine')->resetManager('default'); // for sure (unless you like broken transactions) 
} 

迪登特魯德PanelBundle \ AcmePanelBundle.php

/** 
* Overwriting the boot call to select the database of the company 
*/ 
public function boot(){ 
    // Get the company attrs from the session. 
    $company = $this->container->get('session')->get('company'); 

    // TODO: Otherwise take it from the subdomain 
    if(!is_array($company)) $company = ''; 

    // Change the database 
    $this->container->get('acme.connection')->initRuntimeConnection($company); 
} 
0

只是幾個問題:

  1. 貴用戶的實體擴展的Symfony \分量\安全\核心\ User類?
  2. 您的getRoles()是否爲每個角色返回一個包含字符串的數組?

也許您需要強制在構造函數中設置用戶角色,因爲如果您使用另一個實體來管理角色,那麼角色對象不是標識角色的字符串數組。

+0

順便說一句,你按照文章是從2011年,和也許是使用Symfony 2.0,我認爲你必須閱讀你的版本的官方文檔(最新我猜)http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form Symfony有一個非常好的文檔。 – mangelsnc 2014-11-04 15:46:10

+0

1。它實現了以下Symfony \ Component \ Security \ Core \ User \ UserInterface 2.是的,我修改了該函數,爲每個角色返回一個包含字符串的數組。 – Javier 2014-11-04 16:03:41