2013-12-11 17 views
7

Tôi đang phát triển một ứng dụng trong Symfony để quản lý nhiều trường học. Ứng dụng này có nhiều cơ sở dữ liệu, một cơ sở dữ liệu cho mỗi trường và nhiều máy chủ CAS.Nhiều tường lửa động và máy chủ CAS trong Symfony2

Nếu tôi chỉ quản lý một trường học, cấu hình sẽ như thế này:

# config.yml 
be_simple_sso_auth: 
    admin_sso: 
     protocol: 
      id: cas 
      version: 2 
     server: 
      id: cas 
      login_url: https://cas01.example.com/SCHOOLID/login 
      logout_url: https://cas01.example.com/SCHOOL_ID/logout 
      validation_url: https://cas01.example.com/SCHOOL_ID/serviceValidate 

# security.yml 
firewalls: 
    school: 
     pattern: ^/school/.*$ 
     trusted_sso: 
      manager: admin_sso 
      login_action: false 
      logout_action: false 
      create_users: true 
      created_users_roles: [ROLE_USER, ROLE_ADMIN] 
      login_path: /school/login 
      check_path: /school/login_check 
     logout: 
      path: /school/logout 
      target: /school 

Với một học tất cả mọi thứ hoạt động tốt.

Mỗi trường truy cập vào ứng dụng thông qua con đường app.com/school/ID, ví dụ app.com/school/29, app.com/school/54 ...

Tôi tự hỏi nếu có cách để có nhiều tường lửa động tùy thuộc vào ID. Và sử dụng ID này để chuyển hướng mỗi URL CAS:

https://cas01.example.com/school_29/login, https://cas01.example.com/school_54/login ...

----------- UPDATED 13/12/12 ------ -----

tôi tạo ra một tập tin mới: app/config/cas.php, và tôi đã thêm một số máy chủ thiết lập CAS

# CAS 14 
$container->loadFromExtension('be_simple_sso_auth', array(
    'cas_14' => array(
     'protocol' => array(
      'id' => 'cas', 
      'version' => '2' 
     ), 
     'server' => array(
      'id' => 'cas', 
      'login_url' => 'https://cas01.example.com/14/login', 
      'logout_url' => 'https://cas01.example.com/14/logout', 
      'validation_url' => 'https://cas01.example.com/14/serviceValidate', 
     ), 
    ), 

)); 

# CAS 15 
$container->loadFromExtension('be_simple_sso_auth', array(
    'cas_15' => array(
     'protocol' => array(
      'id' => 'cas', 
      'version' => '2' 
     ), 
     'server' => array(
      'id' => 'cas', 
      'login_url' => 'https://cas01.example.com/15/login', 
      'logout_url' => 'https://cas01.example.com/15/logout', 
      'validation_url' => 'https://cas01.example.com/15/serviceValidate', 
     ), 
    ), 

)); 

và tôi import file này trong config.yml

imports: 
    - { resource: parameters.yml } 
    - { resource: cas.php } 
    - { resource: security.yml } 

Và tôi thêm một tường lửa mới cho mỗi trường:

firewalls: 
    backend_14: 
     pattern: ^/backend/school/14/.*$ 
     trusted_sso: 
      manager: cas_14 
      login_action: false #BeSimpleSsoAuthBundle:TrustedSso:login 
      logout_action: false #BeSimpleSsoAuthBundle:TrustedSso:logout 
      create_users: true 
      created_users_roles: [ROLE_USER, ROLE_ADMIN] 
      login_path: /backend/school/14/login 
      check_path: /backend/school/14/login_check 
     logout: 
      path: /backend/school/logout 
      target: /backend 

    backend_15: 
     pattern: ^/backend/school/15/.*$ 
     trusted_sso: 
      manager: cas_15 
      login_action: false #BeSimpleSsoAuthBundle:TrustedSso:login 
      logout_action: false #BeSimpleSsoAuthBundle:TrustedSso:logout 
      create_users: true 
      created_users_roles: [ROLE_USER, ROLE_ADMIN] 
      login_path: /backend/school/15/login 
      check_path: /backend/school/15/login_check 
     logout: 
      path: /backend/school/logout 
      target: /backend 

Và mọi việc suôn sẻ đúng!

Bây giờ tôi đang cố tạo tất cả cấu hình cas.php động từ Trường thực thể. Đầu tiên tôi cố gắng tạo ra một phương pháp trong SchoolController

public function loadCasConfig() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $schools= $em->getRepository('SchoolBundle:School') 
        ->findBy(array(), array('name'=> 'ASC')); 


    foreach ($schools as $school) { 

     $cas_name = 'cas_'.$school->getId(); 

     $container->loadFromExtension('be_simple_sso_auth', array(
      "$cas_name" => array(
       'protocol' => array(
        'id' => 'cas', 
        'version' => '2' 
       ), 
       'server' => array(
        'id' => 'cas', 
        'login_url' => "https://cas01.example.com/$school->getId()/login", 
        'logout_url' => "https://cas01.example.com/$school->getId()/logout", 
        'validation_url' => "https://cas01.example.com/$school->getId()/serviceValidate", 
       ), 
      ), 

     )); 

    } 
} 

và gọi nó là trong hồ sơ cas.php

<?php 

use Comp\BackendBundle\Controller\SchoolController; 

SchoolController::loadCasConfig(); 

nhưng tôi có ngoại lệ này:.

FileLoaderLoadException: Cannot import resource  
"C:\wamp\www\comp\app/config\cas.php" from  
"C:\wamp\www\comp\app/config\config.yml". (Runtime Notice: Non-static method  
Comp\BackendBundle\Controller\SchoolController::loadCasConfig() should not be  
called statically, assuming $this from incompatible context in  C:\wamp\www\comp\app\config\cas.php line 5) 

:(Sau đó, tôi cố gắng để chèn mã phương thức vào tệp cas.php:

use Doctrine\ORM\EntityManager; 
use Comp\SchoolBundle\Entity\School; 

$em = $this->getDoctrine()->getManager(); 

$schools= $em->getRepository('SchoolBundle:School') 
       ->findBy(array(), array('name'=> 'ASC')); 


foreach ($schools as $school) { 

    $cas_name = 'cas_'.$school->getId(); 

    $container->loadFromExtension('be_simple_sso_auth', array(
     "$cas_name" => array(
      'protocol' => array(
       'id' => 'cas', 
       'version' => '2' 
      ), 
      'server' => array(
       'id' => 'cas', 
       'login_url' => "https://cas01.example.com/$school->getId()/login", 
       'logout_url' => "https://cas01.example.com/$school->getId()/logout", 
       'validation_url' => "https://cas01.example.com/$school->getId()/serviceValidate", 
      ), 
     ), 

    )); 

} 

và bây giờ tôi có:

FatalErrorException: Error: Call to undefined method 
Symfony\Component\DependencyInjection\Loader\PhpFileLoader::getDoctrine() in 
C:\wamp\www\comp\app\config\cas.php line 11 

Tôi muốn biết cách tự động tạo tệp cas.php, lấy dữ liệu từ cơ sở dữ liệu.

+1

Tại sao bạn cần nhiều tường lửa? Có thể không định tuyến mọi thông tin đăng nhập thông qua các trang đăng nhập/login_check giống nhau và sau đó định tuyến trả lời từ trang nhận không? – qooplmao

+0

** Hàm loadCasConfig() ** không phải là phương thức tĩnh. tạo một cuộc gọi tĩnh .. sau đó. Giống như: public static function callme() {$ my = new static; return $ my-> loadCasConfig(); } –

Trả lời

1

Chúng tôi đã vấn đề tương tự, khi một nền tảng được sử dụng bởi nhiều trang web, vì vậy chúng tôi có cách giải quyết cho nó và bây giờ mỗi trang web đã riêng của nó security.yml mà nhập khẩu chính security.yml

+0

Có, nhưng bạn phải viết security.yml này bằng tay khi bạn thêm trang web mới ?? Bạn có thể dán mã ví dụ? – JGrinon

+0

Có, bạn cần phải viết nó bằng tay (nhưng có lẽ bạn có thể có một số tập tin giả để tự động tạo) –

2

Mã số Ví dụ:

public function registerContainerConfiguration(LoaderInterface $loader) 
{ 
    $loader->load(__DIR__.'/config/sites/' . $this->_activeSite . '/config.yml'); 
    $configPath = __DIR__ . '/config/sites/' . $this->_activeSite . '/config_' . $this->getEnvironment() . '.yml'; 
    if (file_exists($configPath)) { 
     $loader->load($configPath); 
    } 

    $loader->load(__DIR__.'/config/servers/' . $this->getServer() . '.yml'); 
    $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 

    //per-site overrides 
    if (file_exists(__DIR__.'/config/sites/local_' . $this->_activeSite . '.yml')) { 
     $loader->load(__DIR__.'/config/sites/local_' . $this->_activeSite . '.yml'); 
    } 
} 
1

Hàm loadCasConfig() không phải là phương thức tĩnh. tạo một cuộc gọi tĩnh .. sau đó.

Như thế này:

public function loadCasConfig() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $schools= $em->getRepository('SchoolBundle:School') 
        ->findBy(array(), array('name'=> 'ASC')); 


    foreach ($schools as $school) { 

     $cas_name = 'cas_'.$school->getId(); 

     $container->loadFromExtension('be_simple_sso_auth', array(
      "$cas_name" => array(
       'protocol' => array(
        'id' => 'cas', 
        'version' => '2' 
       ), 
       'server' => array(
        'id' => 'cas', 
        'login_url' => "https://cas01.example.com/$school->getId()/login", 
        'logout_url' => "https://cas01.example.com/$school->getId()/logout", 
        'validation_url' => "https://cas01.example.com/$school->getId()/serviceValidate", 
       ), 
      ), 

     )); 

    } 
} 

public static function loadCasConfigStatic(){ 
    $my = new static; 
    return $my->loadCasConfig(); 
} 

Sau đó (cas.php của bạn):

<?php 

use Comp\BackendBundle\Controller\SchoolController; 

SchoolController::loadCasConfigStatic(); 
Các vấn đề liên quan