基于sfGuardPlugin的symfony和CAS单点登录的集成

项目中碰到需要将symfony集成到CAS中,但是由于采用了sfGuardPlugin插件做为用户控制,google不得,经过试验以下代码可以满足实现单点登录及自动创建用户功能,不足之处请大家悉心指教,谢谢。

需要更改以下文件并将phpCAS客户端中CAS.php置于plugins/sfDoctrineGuardPlugin/modules/sfGuardAuth/lib/vendor,更改的文件列表:

1. 在应用的配置文件中,配置cas服务器的基本信息 apps/frontend/config/app.yml

  
  
  
  
  1. all: 
  2.   cas: 
  3.     host: your.cas.host 
  4.     port: 443 
  5.     context: /cas 
  6.     cacertpath: 
  7.     autoregister: true 

2. 在sfGuardAuth/actions/actions.class.php中新建login和logout的action

  
  
  
  
  1. class sfGuardAuthActions extends BasesfGuardAuthActions  
  2. {     
  3.     private $cas_host;  
  4.     private $cas_port;  
  5.     private $cas_context;  
  6.     private $cas_cacertpath;  
  7.       
  8.     public function __construct($context$moduleName$actionName) {                   
  9.         parent::__construct($context$moduleName$actionName);  
  10.         // 初始化参数  
  11.         $this->cas_host = sfConfig::get('app_cas_host');  
  12.         $this->cas_port = sfConfig::get('app_cas_port');  
  13.         $this->cas_context = sfConfig::get('app_cas_context');  
  14.         $this->cas_cacertpath = sfConfig::get('app_cas_cacertpath');  
  15.     }  
  16.       
  17.     public function executeLogin($request){      
  18.         // 获取当前用户,判断是否登录  
  19.         $user = $this->getUser();  
  20.         if($user->isAuthenticated()){  
  21.             return $this->redirect('@homepage');  
  22.         }else{         
  23.             $ticket = $request->getParameter('ticket');  
  24.             //匹配ticket参数  
  25.             if(preg_match('/^ST-\d+-[0-9a-zA-Z]{20}-cas$/',$ticket)){  
  26.                 $str = preg_split('/\?/',$_SERVER['REQUEST_URI']);  
  27.                 $service = 'http://'.$_SERVER['HTTP_HOST'].$str[0];  
  28.                 $cas_url = 'https://'.$this->cas_host.':'.strval($this->cas_port).$this->cas_context;         
  29.                 $url = $cas_url.'/serviceValidate?service='.$service.'&ticket='.$ticket;  
  30.                 // 获取验证结果并构建Dom树  
  31.                 $string = file_get_contents($url);  
  32.                 $result = new DOMDocument;  
  33.                 $result->loadXML($string);           
  34.                 $rf = $result->getElementsByTagName('authenticationFailure');  
  35.                 if($rf->length!=0){  
  36.                     echo '认证错误:'.$rf->item(0)->nodeValue;  
  37.                 }else{  
  38.                     $cas_user = $result->getElementsByTagName('user');  
  39.                     $user = Doctrine_Core::getTable('sfGuardUser')  
  40.                         ->createQuery('u')  
  41.                         ->where('u.username = ?'$cas_user->item(0)->nodeValue)  
  42.                         ->fetchOne();                      
  43.                     if(!$user){  
  44.                         if(sfConfig::get('app_cas_autoregister')){  
  45.                             // 自动注册用户  
  46.                             $newnewuserprofile = new ecPersonProfile;  
  47.                             $newuserprofile->setFirstName($result->getElementsByTagName('name')->item(0)->nodeValue);  
  48.                             $newuserprofile->save();  
  49.                             $newnewuser = new sfGuardUser();  
  50.                             $newuser->setIsSuperAdmin(FALSE);  
  51.                             $newuser->setUsername($cas_user->item(0)->nodeValue);  
  52.                             $newuser->setEmailAddress($result->getElementsByTagName('email')->item(0)->nodeValue);  
  53.                             $newuser->setProfileId($newuserprofile->getId());  
  54.                             $newuser->setIsActive(1);  
  55.                             $newuser->save();  
  56.                             $user = Doctrine_Core::getTable('sfGuardUser')  
  57.                                 ->createQuery('u')  
  58.                                 ->where('u.username = ?'$cas_user->item(0)->nodeValue)  
  59.                                 ->fetchOne();   
  60.                         }else{  
  61.                             echo '你的账户未在此系统内注册,请联系管理员!';  
  62.                         }  
  63.                     }  
  64.                     if($user){  
  65.                         $current_user = $this->getUser();  
  66.                         $current_user->signin($user);  
  67.                         if($current_user->isAuthenticated()){  
  68.                             $signinUrl = sfConfig::get('app_sf_guard_plugin_success_signin_url'$user->getReferer($request->getReferer()));  
  69.                             return $this->redirect('' != $signinUrl ? $signinUrl : '@homepage');  
  70.                         }  
  71.                     }else{  
  72.                         echo '你的账户未在此系统内注册,请联系管理员!';  
  73.                     }  
  74.                 }  
  75.             }else{                
  76.                 require_once(dirname(__FILE__).'/../lib/vendor/CAS.php');  
  77.                 // 启动Debug  
  78.                 phpCAS::setDebug();  
  79.                 // 初始化phpCAS                  
  80.                 phpCAS::client(CAS_VERSION_2_0, $this->cas_host, $this->cas_port, $this->cas_context);  
  81.                 phpCAS::setNoCasServerValidation();  
  82.                 phpCAS::forceAuthentication();  
  83.             }  
  84.         return sfView::NONE;  
  85.         }  
  86.     }  
  87.     public function executeLogout(){  
  88.         require_once(dirname(__FILE__).'/../lib/vendor/CAS.php');  
  89.         // 启动Debug  
  90.         phpCAS::setDebug();  
  91.         // 初始化phpCAS                  
  92.         phpCAS::client(CAS_VERSION_2_0, $this->cas_host, $this->cas_port, $this->cas_context);  
  93.         phpCAS::setNoCasServerValidation();   
  94.         $this->getUser()->signOut();  
  95.         phpCAS::logout();  
  96.         return sfView::NONE;  
  97.     }  

 

3.路由中的登入登出设置,apps/frontend/config/routing.yml

  
  
  
  
  1. sf_guard_signin: 
  2.   url:   /login 
  3.   param: { module: sfGuardAuth, action: login } 
  4.          
  5. sf_guard_signout: 
  6.   url:   /logout 
  7.   param: { module: sfGuardAuth, action: logout } 

4. 更改系统设置中的登入模块设置,apps/frontend/config/settings.yml

  
  
  
  
  1. # ecNote sfDoctrinePlugin插件设置登入登出动作 
  2. login_module:           sfGuardAuth 
  3. login_action:           login 

5. 添加模块中的安全设置,将登入登出动作设定为不需要通过认证,plugins/sfDoctrineGuardPlugin/modules/sfGuardAuth/config/security.yml

  
  
  
  
  1. login: 
  2.   is_secure: false 
  3.    
  4. logout: 
  5.   is_secure: false 

 

你可能感兴趣的:(cas,symfony)