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.
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
** 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(); } –