
RBACã¯ãWebã¢ããªã±ãŒã·ã§ã³ãžã®ã¢ã¯ã»ã¹ãéäžç®¡çããããã®ã·ã³ãã«ã§åŒ·åãªæ¹æ³ã§ãã äž»ãªå©ç¹ã¯ãæ¿èªéå±€ãæ£ããç解ããŠé©çšããããšã§ãã³ã³ãããŒã©ãŒã®ã³ãŒããå€æŽããã«éåžžã«æè»ã«ã¢ã¯ã»ã¹ãå¶åŸ¡ã§ããããšã§ãã
æ®å¿µãªãããYIIã®æšæºRBACããã¥ã¢ã«ã«ã¯åçãããå€ãã®è³ªåãæ®ãããŠããŸãã ãã®ç¶æ³ãä¿®æ£ããã€ããã§ãã
ãæ£ãããéå±€ã®äœæã«ã€ããŠèª¬æããŸãããã®æ¹æ³ã¯äŸ¡å€ããããŸããã ãããŠæåŸã«ãLDAPæ¿èªïŒActiveDirectoryããïŒãYiiãšRBACãšåéã«ããæ¹æ³ã«é¢ããæ瀺ãä¿åããŸããã
èå³ã®ããæ¹ãç«ãžããããïŒ
RBAC ïŒåœ¹å²ããŒã¹ã®ã¢ã¯ã»ã¹å¶åŸ¡ïŒåœ¹å²ããŒã¹ã®ã¢ã¯ã»ã¹å¶åŸ¡ ã Yiiã®ãã®ã·ã¹ãã ã®åºæ¬ã¯ã3ã€ã®äž»èŠãªãªã³ã¯ã§ãïŒ
- 圹å²
- ã¿ã¹ã¯
- æäœïŒæäœïŒ
èªè ã¯ãã§ã«å ¬åŒã®YIIæç§æžã®ããŒãžãç°¡åã«ã¬ãã¥ãŒããŠãããYiiã®èªå¯ã¡ã«ããºã ã®åºæ¬ååãç¥ã£ãŠãããšæããŸãã
ãããã£ãŠãæ¿èªèŠçŽ ã®æ£ããéå±€ã®æ§ç¯ã«ããã«é²ã¿ãŸãã
ããŒã«ã®éå±€ã
æãéèŠã§ç解ãã«ããã®ã¯ãRBACã®èŠçŽ ã®éå±€ã§ãã ãããã©ãã»ã©ããèããããŠãããã¯ãã·ã¹ãã å ã®ããŒã«ãã©ãã ãæè»ã«ç®¡çã§ããããããã³ã³ã³ãããŒã©ãŒã³ãŒããå€æŽããå¿ èŠãããé »åºŠã«ãã£ãŠç°ãªããŸãã
åæ¿èªèŠçŽ ã«ã€ããŠããã«è©³ããèããŠã¿ãŸãããã
- æäœã¯ãæ¿èªã®æãäœãèŠçŽ ã§ãã ããã¯ãã³ã³ãããŒã©ãŒã®ã³ãŒãã§ç¢ºèªããå¿ èŠããããã®ã§ãã èšãæããã°ãæäœã¯ã³ãŒãã«ããã¿ã€ããã®ã§ãã
- å察ã«ã 圹å²ã¯ãæäœãšã¿ã¹ã¯ãã°ã«ãŒãåããæ¿èªã®æé«ã®èŠçŽ ã§ãã ãããŠãããããŠãŒã¶ãŒã«ã¢ã¿ããããªããã°ãªããªã圹å²ã§ãã
- ã¿ã¹ã¯ -ããã¯ãæäœãšããŒã«ã®éã®ãªãã·ã§ã³èŠçŽ ã§ãããbizRuleã䜿çšããŠæäœã®æš©éãå¶éããŸãã ç解ã容æã«ããããã«ã ãã£ã«ã¿ãŒãšåŒã³ãŸãããã

äžã®å³ã¯ãã³ã³ãããŒã©ãŒãæäœããã§ãã¯ããããŒã«ããŠãŒã¶ãŒã«å²ãåœãŠãããŠããäžè¬çãªéå±€ã瀺ããŠããŸãã ãã ããYIIã¯ããŠãŒã¶ãŒããŒã«ãªã©ãã³ã³ãããŒã©ãŒå ã®ä»ã®ãã®ããã§ãã¯ããããšã劚ããŸããã
ãã ããããã¯èª€ãã§ãããéäžç®¡çã®å©ç¹ã倱ããšããäºå®ã«ã€ãªããããšãèŠããŠããå¿ èŠããããŸãã
äŸãèããŠã¿ãŸãããïŒ
ç§ãã¡ã¯ã管çè ã«å¯ŸããŠã¢ã¯ã»ã¹ãå·®å¥åããããã¥ãŒã¹ãæã£ãŠããŸãã
RBACãèšèšããéã«æåã«ãã¹ãããšã¯ãå¯èœãªæäœïŒäžèŠãããšãŠãŒã¶ãŒããŒã«ã§ã¯ãªãïŒãæ€èšããããšã§ãã
éåžžããã¥ãŒã¹ã¯åé€ ã äœæ ã èªã¿åã ã ç·šéã§ããŸãã ãããã®ã¢ã¯ã·ã§ã³ãdeleteNews ã createNews ã readNews ã updateNewsã® ãªãã¬ãŒã·ã§ã³ã«å€æããŸãã
ã³ãŒãã§ã¯ã次ã®æäœã®ããããã確èªã§ããŸãã
if(Yii::app()->user->checkAccess('createNews')) { // } // if(Yii::app()->user->checkAccess('updateNews')) { // }
æäœãæ€èšãããåŸãããŒã«ã«é²ãããšãã§ããŸãïŒã¿ã¹ã¯ãæå³çã«ã¹ãããããŸãããããã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãïŒã
å©çšå¯èœãªæäœããã次ã®åœ¹å²ãåºå¥ã§ããŸãã
newsReader ã newsManager ã newsAuthor ã
èŠçŽ ã®éå±€ã¯æ¬¡ã®ãšããã§ãã
- newsReader
- readNews
- ãã¥ãŒã¹
- readNews
- createNews
- newsManager
- readNews
- createNews
- deleteNews
- updateNews
ãããã®ããŒã«ã¯ãç¹å®ã®ãŠãŒã¶ãŒã«é¢é£ä»ããããšãã§ããŸãã ããããããäžè¬åããã圹å²ã®å¥ã®æœè±¡åãäœæããããããŠãŒã¶ãŒã«æ·»ä»ããæ¹ãè¯ãã§ããããäŸãã°ïŒ
- ã²ã¹ã
- newsReader
- èªå¯ããã
- ãã¥ãŒã¹
- ã¢ãã¬ãŒã¿ãŒ
- newsManager
ãã®ãããªæœè±¡åã¯ããã¥ãŒã¹ã ãã§ãªãããã©ãã®ã£ã©ãªãŒã®åçãåºå ã®ååã管çããå¿ èŠãããå Žåã«äŸ¿å©ã§ãã 次ã«ãã·ã¹ãã ã®ãã®ãããªã»ã¯ã·ã§ã³ããšã«ã photoReaderïŒshowPhotoïŒ ã photographerïŒshowPhoto ã addPhoto ïŒ ã photoManagerïŒshowPhotoãaddPhotoãdeletePhotoïŒãªã©ã®ç¬èªã®ãäžéãããŒã«ãäœæããäžè¬åãããããŒã«ã«ã¢ã¿ããããå¿ èŠããããŸãã
- ã²ã¹ã
- newsReader
- ãã©ããªãŒããŒ
- èªå¯ããã
- ãã¥ãŒã¹
- åç家
- ã¢ãã¬ãŒã¿ãŒ
- newsManager
- photoManager
ã€ãŸã ã²ã¹ãã¯ãã¥ãŒã¹ãèªã¿ãåçãèŠãããšãã§ããŸãã æ¿èªããããŠãŒã¶ãŒã¯ããã¥ãŒã¹ãæžããŠåçãè¿œå ã§ããŸãã ã¢ãã¬ãŒã¿ãŒã¯äžèšã®ãã¹ãŠãå®è¡ã§ããã ãã§ãªããä»ã®äººã®åçããã¥ãŒã¹ãç·šéããã³åé€ã§ããŸãã
ãããããæŽæ°æäœã¯newsAuthorããŒã«ãšPhotographerããŒã«ã§ã¯äœ¿çšã§ããªãããšã«æ°ã¥ããã§ãããã ããã§ãããã®æ®µéã§updateNewsãŸãã¯updatePhotoã®æäœãäžãããšããã¹ãŠã®åçãç¡å·®å¥ã«ç®¡çã§ããããã«ãªãããã§ãã ãããŠãèè ã¯èªåã®èŠçŽ ã®ã¿ãç·šéã§ããå¿ èŠããããŸãã
ãã®ããã«ã¿ã¹ã¯ãäœæãããŸãã ã¿ã¹ã¯ã¯ãæš©éãæå®ã§ãããã£ã«ã¿ãŒã§ãã updateOwnNewsã¿ã¹ã¯ãäœæããŸãããã ãã®ã¿ã¹ã¯ã®åå«ã¯updateNewsãå²ãåœãŠãŸã ã ã¿ã¹ã¯ã®ååãããããã¯ããªããããªãèªèº«ã®ãã¥ãŒã¹ãç·šéããããšãå¯èœã«ããããšã¯æããã§ãããbizRuleã¯ããã§ç§ãã¡ãå©ããŸãã
bizRuleã¯ããçš®ã®PHPã³ãŒãã§ããããã®çµæãçãã§ãããã®ãŠãŒã¶ãŒã«ãã®ã«ãŒã«ãé©çšãããã©ããã§ãã
updateOwnNewsã¿ã¹ã¯ã®bizRuleã¯æ¬¡ã®ããã«ãªããŸãã
$bizRule='return Yii::app()->user->id==$params["news"]->authID;';
äœæè ã®IDãçŸåšã®æ¿èªæžã¿ãŠãŒã¶ãŒã®ãã¥ãŒã¹ãšäžèŽãããã©ããã確èªããŸãã
ããžãã¹ã«ãŒã«ã§çŸåšã®ãã¥ãŒã¹ã¢ã€ãã ãååŸããã«ã¯ããŸãããã«æž¡ãå¿ èŠããããŸãã
$params=array('news'=>$post); if(Yii::app()->user->checkAccess('updateNews',$params)) { // }
ç¹å®ã®ã¿ã¹ã¯ïŒ updateOwnNews ïŒã§ã¯ãªãã updateNewsæäœïŒéå±€ã®æäžäœèŠçŽ ïŒããã§ãã¯ããŠããããšã«æ³šæããŠãã ããã
ã¿ã¹ã¯ã®äœæåŸã«updateOwnNewsã次ã®ããã«ãªã£ãéå±€ã®ãããã§ãã
- ãã¥ãŒã¹
- readNews
- createNews
- updateOwnNews
- updateNews
Yiiã¯äžããã¢ã¯ã»ã¹å¶åŸ¡ãéå§ããéå±€ãäžã«ç§»åããŸãã updateNewsã確èªããupdateOwnNewsã«ç§»åããŸãã ãã§ãã¯ã®å段éã§ãYiiã¯ãã§ãã¯ããŸããbizRuleã«ãŒã«ãèšå®ãããŠããå Žåãèšå®ãããŠããå ŽåãcheckAccessé¢æ°ã§æå®ããããã©ã¡ãŒã¿ãŒãæž¡ããŸãã
ãã§ãã¯ã¯ã次ã®ããã«æŠç¥çã«è¡šãããšãã§ããŸãã

ãã®å³ã¯ã3ã€ã®ãã¹ãã·ããªãªã瀺ããŠããŸãã
æåã®ã·ããªãªã¯ãæ¿èªããããŠãŒã¶ãŒãèªåã®ãã¥ãŒã¹ãç·šéããããšããå Žåã§ãã ãã®å Žåãäžããäžãžã®ãã§ãã¯ã¯updateOwnNewsãééããŸã ã ãŸãããŠãŒã¶ãŒIDã¯åãã§ãããããæåããŸãã
2çªç®ã®ã±ãŒã¹ã§ã¯ããŠãŒã¶ãŒã¯ã¢ãã¬ãŒã¿ãŒã®åœ¹å²ãæã£ãŠããŸãã éå±€ã«ã¯updateOwnNewsã¿ã¹ã¯ããªããããupdateNewsæäœã®ååšã®ã¿ããã§ãã¯ãããŸãã
æ€èšŒã«æåããŸããã
3çªç®ã®ã±ãŒã¹ã§ã¯ãèš±å¯ããããŠãŒã¶ãŒãä»ã®äººã®èšäºãç·šéããããšããŸããã updateOwnNewsã¹ããŒãžã§ã¯ãã§ãã¯ã倱æããŸãã æºããããŠããªãbizRuleã¿ã¹ã¯ã
äžèšã®äŸã¯ãéäžç®¡çãããæš©å©ç®¡çã瀺ããŠããŸãã
æäœãå®äºããããã«ã³ã³ãããŒã©ãŒã«1åãã§ãã¯ãæžã蟌ã¿ãããã§ãã©ã¡ãŒã¿ãŒãæž¡ãããšã«ãããã¢ã¯ã»ã¹å¶åŸ¡ã«é¢ãã以éã®äœæ¥ã¯ãã¹ãŠRBACã«ä»»ãããŸãã
ãããã£ãŠãå¯èœãªå Žåã¯åžžã« ãcheckAccessé¢æ°ã«ãã©ã¡ãŒã¿ãŒãæž¡ããŠïŒãã§ãã¯å¯Ÿè±¡ã®ã¢ã€ãã ã«bizRuleããªãå Žåã§ãïŒãããŒã«ã§ã¯ãªãæäœããã§ãã¯ããå¿ èŠããããŸãã
ã³ã³ãããŒã©ãŒå ã§1ã€ã®æ¡ä»¶ã§è€æ°ã®ãã§ãã¯ãäœæããå Žå-ééã£ãæ¹åã«é²ãã§ããããšãããã£ãŠãã-éå±€ã®ç·šæã«åé¡ãããå Žåã
äŸïŒ
if(Yii:app()->user->checkAccess('moderator') && Yii:app()->user->checkAccess('administrator')) { //delete smth }
ããã¯ééã£ãŠããŸãã ãã®ã¢ãããŒãã§ã¯ãæš©éãäžå 管çã§ããŸããã æ¯åã³ãŒããç·šéããããã«æ°ããæ¡ä»¶ãè¿œå ããå¿ èŠããããŸãã
ã³ã³ãããŒã©ãŒã®æš©éã確èªããæ¹æ³
æš©å©ã確èªããã«ã¯2ã€ã®æ¹æ³ããããŸãã
ãã§ã«æ€èšããæåã®æ¹æ³ã ããã¯ã CWebUserã³ã³ããŒãã³ãã®checkAccessïŒïŒã¡ãœããã§ãã
ããããèªåã®ã³ã³ãããŒã©ãŒãã倪ã£ãŠããªããããšãæ°ã«ãã人ã«ã¯ãæš©å©ããã§ãã¯ããå¥ã®ã¢ã¹ãã¯ãæåã®æ¹æ³ããããŸãã
ãã®æ¹æ³ã¯ããaccessControlããã£ã«ã¿ãŒãã³ã³ãããŒã©ãŒã«æ¥ç¶ããããšã§ãã
ãã®ãã£ã«ã¿ãŒã¯ãã¹ãŠã®æ±ããäœæ¥ãè¡ããŸããã¢ã¯ã»ã¹æš©ã確èªããå¿ èŠã«å¿ããŠãŠãŒã¶ãŒãããŒãž403ã«éä¿¡ããŸãããããã£ãŠãåã¢ã¯ã·ã§ã³ã§æ€èšŒã³ãŒããè€è£œããå¿ èŠã¯ãããŸããã
ãã¥ãŒã¹ã³ã³ãããŒã©ãŒã®äŸã«ãããã£ã«ã¿ãŒãæ€èšããŠãã ããã
class NewsController extends CController { ⊠public function filters() { return array( 'accessControl', ); } public function accessRules() { return array( array('allow', 'actions'=>array('create'), 'roles'=>array('createNews'), ), array('allow', 'actions'=>array('delete'), 'roles'=>array('deleteNews'), ), array('allow', 'actions'=>array('view'), 'roles'=>array('readNews'), ), array('allow', 'actions'=>array('update'), 'roles'=>array('updateNews'), ), ); } ... }
accessRulesé¢æ°ã§ã¯ã4ã€ã®ã«ãŒã«ãæå®ããŸããåã«ãŒã«ã¯é åã§ãã ã¢ã¯ã·ã§ã³ããŒãã«ãŒã«ãé©çšããã¢ã¯ã·ã§ã³ãšããŒã«ã®ããŒã瀺ãå Žæã
ããŒããããŒã«ããšåŒã°ãããšããäºå®ã«ãããããããæäœãŸãã¯ã¿ã¹ã¯ã§ãããã«é¢ä¿ãªããããã«ä»»æã®èš±å¯èŠçŽ ãå ¥åã§ããããšã«æ³šæããå¿ èŠããããŸãã ãããããåç¥ã®ããã«ãã³ã³ãããŒã©ãŒã§ã¯æäœã®ã¿ããã§ãã¯ããå¿ èŠããããããäžèšã®äŸã«èšèŒãããŠããã®ã¯ãã®ããã§ãã
ãã®ãã£ã«ã¿ãŒã¯ãã¢ã¯ã·ã§ã³ã®ããã¹ã¹ã«ãŒãã³ãŒãã®å€ãã®è¡ãåãé€ãã®ã«åœ¹ç«ã¡ãŸãã ãã ããåé¡ããããŸããupdateOwnNewsã§å®çŸ©ãããbizRuleãæ£ããæ©èœããããã«ããupdateNewsãã§çŸåšã®ãã¥ãŒã¹ãéä¿¡ããå¿ èŠããããŸãã
ãã©ã¡ãŒã¿ãŒããã£ã«ã¿ãŒã«æž¡ãæ¹æ³ãç解ããããã«ããã¬ãŒã ã¯ãŒã¯ã³ãŒããååŸãããããèŠãå¿ èŠããããŸããã 幞ããªããšã«ãããŒãžã§ã³1.1.11ãããã®ãããªæ©äŒãçŸããŸããã
ãã©ã¡ãŒã¿ãæž¡ãã«ã¯ã次ã®ãããªã«ãŒã«ãèšè¿°ããå¿ èŠããããŸãã
'roles'=>array('newsUpdate'=>array('news'=>$news))
ããããåé¡ã¯ããã ãã§ã¯çµãããŸããã ãã£ã«ã¿ã¯ãã¢ã¯ã·ã§ã³ã®åã«å®è¡ãããŸããã€ãŸããéä¿¡ã§ãããã¥ãŒã¹ãªããžã§ã¯ãããŸã äœæããŠããªãããšãæå³ããŸãã
解決çã¯æ¬¡ã®ã¢ãããŒãã§ãã
protected $model; public function accessRules() { return array( ... array('allow', 'actions' => array('update'), 'roles' => array( 'updateNews' => array( 'news' => $this->news )), ), ... ); } public function getNews() { if ($this->actionParams['id']) { return $this->loadModel($this->actionParams['id']); } } public function loadModel($id) { if ($this->model === null) $this->model = News::model()->findByPk($id); if ($this->model === null) throw new CHttpException(404, 'The requested page does not exist.'); return $this->model; }
ããã§ã¯ãloadModelé¢æ°ã䜿çšããŠããã¥ãŒã¹ã¢ãã«çšã®ãã¥ãŒã¹ãã£ãŒã«ãã®ã²ãã¿ãŒãäœæããŸãã ããããããŒã¿ããŒã¹ãæ°åãã«ããªãããã«ïŒæš©éããã§ãã¯ããæåãšã¢ã¯ã·ã§ã³èªäœã§ïŒãã¢ãã«ããã£ãã·ã¥ããããã©ã€ããŒããã£ãŒã«ã$ã¢ãã«ãäœæããŸããã次ã«loadModelé¢æ°ã«ã¢ã¯ã»ã¹ãããšãããããã£ããã¢ãã«ãååŸãããŸããããŒã¹ããã§ã¯ãããŸããã
æ®å¿µãªãããååãšããŠãããè€éãªããžãã¯ãå¿ èŠãšãããã©ã¡ãŒã¿ãŒãéä¿¡ããå¿ èŠãããå Žåããã®æ¹æ³ã¯é©ããŠããŸããã ãããã£ãŠããã®ãããªå ŽåãcheckAccessïŒïŒã䜿çšããããšã¯æ®ããŸãã
RBAC Yiiããã³LDAP
LDAPã¯ã軜éãã£ã¬ã¯ããªã¢ã¯ã»ã¹ãããã³ã«ã§ãããã軜éãã£ã¬ã¯ããªã¢ã¯ã»ã¹ãããã³ã«ãã§ãã ãã®å ŽåããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã䜿çšããŠäŒæ¥ãããã¯ãŒã¯ãããŠãŒã¶ãŒãèªèšŒããããã«ãActiveDirectoryãã£ã¬ã¯ããªã«ã¢ã¯ã»ã¹ããŸãã
PHPã«ã¯LDAPãµããŒããçµã¿èŸŒãŸããŠãããããäœãçºæããå¿ èŠã¯ãããŸããããŸãããã£ã¬ã¯ããªã«ã¢ã¯ã»ã¹ããããã®äŸ¿å©ãªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããæ¢è£œã®ã³ã³ããŒãã³ããå€æ°ãããŸãã
adLdapã³ã³ããŒãã³ãã䜿çšããŸããã ActiveDirectoryçšã«ç¹å¥ã«èšèšãããŠãããã·ã³ãã«ã§äŸ¿å©ãªOOP APIãæäŸããŸãããŸããããã䜿çšããã®ã¯çŽ æŽãããããšã§ãã
å§ããããã«ãadLdapãã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ããšããŠYiiã«æ¥ç¶ããŸããã
//protected/config/main.php 'components' => array( ... 'ldap' => array( 'class' => 'LdapComponent', 'baseDn' => 'DC=example,DC=org', //example.org 'accountSuffix' => '@example.org', 'domainControllers' => array('dc.example.org'), 'adminUsername' => 'username', 'adminPassword' => 'password' ), .. )
LdapComponentã¯ã©ã¹èªäœïŒ
//protected/components/LdapComponent.php Yii::import('application.vendors.adLDAP.adLDAP'); class LdapComponent extends adLDAP { public $baseDn; public $accountSuffix; public $domainControllers; public $adminUsername; public $adminPassword; public function __construct() { } public function init() { parent::__construct(); } }
AdLdapã¯ããã®ããããã£ããªãŒããŒã©ã€ãããããšã«ããæ§æãããŸãã Yiiããã°ã©ããŒã«éŠŽæã¿ã®ãã圢åŒã§configã®ãã®ã³ã³ããŒãã³ãã®èšå®ãè¡ãããã®ã§ãå¯èŠå±æ§ãå€æŽããŠïŒYiiãã³ã³ããŒãã³ããæ§æã§ããããã«ïŒå¿ èŠãªãã£ãŒã«ããåå®çŸ©ããã³ã³ã¹ãã©ã¯ã¿ãŒãinitïŒïŒã¡ãœããã«è»¢éããŠã³ã³ã¹ãã©ã¯ã¿ãŒãAFTERãšåŒã°ããããã«ããŸãããªããžã§ã¯ããæ§æãããŸãïŒãã£ãŒã«ãããã£ã±ãã«ãªããŸãïŒã
ããã«ããã®ã³ã³ããŒãã³ããYiiã®ä»ã®ãã¹ãŠã®ã³ã³ããŒãã³ããšåãããã«äœ¿çšã§ããŸãã
Yii::app()->ldap
LDAPã䜿çšããèªå¯ã®å ŽåãYiiã§èªå¯ã«å¿ èŠãªæšæºã³ã³ããŒãã³ãUserIdentityããã³WebUserãäœæããå¿ èŠããããŸãã
//protected/components/LdapIdentity.php class LdapIdentity extends CUserIdentity { protected $_id; /** * Authenticates a user via LDAP. * @return boolean whether authentication succeeds. */ public function authenticate() { $ldap = Yii::app()->ldap; $result = $ldap->authenticate($this->username, $this->password); $ldapUserInfo = $ldap->user()->infoCollection($this->username, array("mail", "displayname")); $this->setState('fullname', $ldapUserInfo->displayname); $this->setState('email', $ldapUserInfo->mail); if (!$result) { $this->errorCode = self::ERROR_USERNAME_INVALID; } else { $dbUser = User::model()->findByAttributes(array('ldap' => $this->username)); if (!$dbUser) { $dbUser = new User(); $dbUser->ldap = $this->username; $dbUser->save(); } $this->_id = $dbUser->primaryKey; $this->errorCode = self::ERROR_NONE; } return !$this->errorCode; } public function getId() { return $this->_id; } }
äžèšã®ã³ãŒãã§ã¯ãæ¿èªããžãã¯ãå®è£ ããããã«ãCUserIdentityã¯ã©ã¹ã®èªèšŒã¡ãœãããåå®çŸ©ããŠããŸãã adLdapãä»ããŠADã§ãã®ãŠãŒã¶ãŒãèªèšŒããããšããŠããŸããæåããå Žåã¯ããŠãŒã¶ãŒã®ååãšã¡ãŒã«ãæ°žç¶çãªã¹ãã¬ãŒãžã«æ ŒçŽããŸãã
LDAPã«å ããŠããŠãŒã¶ãŒã«é¢ããè¿œå æ å ±ãããŒã¿ããŒã¹ã«ä¿åããããšã«ããŸããããã®ãããèªèšŒã«æåããåŸããã§ãã¯ãããŸãããã®ãŠãŒã¶ãŒã®ããŒã¿ããŒã¹ã«ãã§ã«è¡ããããããã§ãªãå Žåã¯äœæãããŸãã
//protected/components/LdapUser.php class LdapUser extends CWebUser { protected $_groups = null; protected $_model; /** * * @return type */ public function getGroups() { if ($this->_groups === null) { if ($user = $this->getModel()) { $this->_groups = Yii::app()->ldap->user()->groups($user->ldap); } } return $this->_groups; } /** * * @return User */ public function getModel() { if (!$this->isGuest && $this->_model === null) { $this->_model = User::model()->findByPk($this->id); } return $this->_model; } }
LdapUserã¯ã©ã¹ã¯ãéèŠãªæ©èœã§ããLdapUser :: getGroupsïŒïŒãé€ããŠãæšæºãšã»ãšãã©å€ãããŸããã ãæ³åã®ãšããããã®é¢æ°ã¯ADãããã®ãŠãŒã¶ãŒã®ãã¹ãŠã®ã°ã«ãŒããè¿ããŸãã
Yiiã¢ããªã±ãŒã·ã§ã³ã®ActiveDirectoryããŒã«ã§ãŠãŒã¶ãŒã°ã«ãŒããäœæããããšã«ããŸããã
ã€ãŸã ç¹å®ã®ãŠãŒã¶ãŒã§ã¯ãªãã°ã«ãŒãã«ããŒã«ãå²ãåœãŠãŸãã ãããŠãã©ã®ã°ã«ãŒããADãéããŠäžå çã«èª°ã«å²ãåœãŠãããŸãã
äŒæ¥ããŒã¿ã«ãä»ã®å éšãªãœãŒã¹ã§ã¯éåžžã«äŸ¿å©ã§ãã ããªã³ã¿ãŒããã©ã«ããŒãããã³ãã®ä»ã®ãªãã£ã¹ã€ã³ãã©ã¹ãã©ã¯ãã£ã«å¯Ÿããæš©éãšå ±ã«ããŠãŒã¶ãŒã«ã¯äŒæ¥Webãµã€ãã®ã»ã¯ã·ã§ã³ã«å¯Ÿããæš©éãçŽã¡ã«ä»äžãããŸãã åæã«ãITéšéã®ã¹ãã·ã£ãªã¹ãã¯äœã説æããå¿ èŠã¯ãªããããã€ãã®ããã«ãäœæ¥ãè¡ãã ãã§ãã
ãŠãŒã¶ãŒã«ããŒã«ãå²ãåœãŠãããã«ãCPhpAuthManagerã¯ã©ã¹ãåå®çŸ©ããŸããã
class PhpAuthManager extends CPhpAuthManager { public function init() { // auth.php config if ($this->authFile === null) { $this->authFile = Yii::getPathOfAlias('application.config.auth') . '.php'; } parent::init(); // guest. if (!Yii::app()->user->isGuest) { // AD $existingRoles = $this->getRoles(); if (Yii::app()->user->groups) { foreach (Yii::app()->user->groups as $group) { if ($existingRoles[$group]) { $this->assign($group, Yii::app()->user->id); } } } } } }
äžèšã®ã³ãŒãã§ã¯ããŠãŒã¶ãŒãå±ããã°ã«ãŒãã®ãªã¹ããååŸããåãååã®ããŒã«ãååšãããã©ããã確èªããŸããååšããå Žåã¯ããŠãŒã¶ãŒã«ããŒã«ãå²ãåœãŠãŸãã
LDAPã䜿çšããèš±å¯æ§æãã¡ã€ã«ã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
... /************************************ ***************ROLES**************** ************************************/ 'newsReader' => array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 0 => 'readNews', ), ), 'newsAuthor' => array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 'newsReader', 'createNews', 'updateOwnNews', 'deleteOwnNews' ), ), 'newsManager' => array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 'newsReader', 'createNews', 'updateNews', 'deleteNews', ), ), // 'requestCreator' => array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 0 => 'createRequest', ), ), 'requestManager' => array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 'createRequest', 'viewRequests', 'manageRequests', ), ), /************************************ **********ROLES ASSIGMENTS********** ************************************/ 'developers' => array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 'newsManager', 'requestManager', ), ), 'departamentBoss'=> array( 'type' => CAuthItem::TYPE_ROLE, 'description' => '', 'bizRule' => NULL, 'data' => NULL, 'children' => array( 'requestCreator' , ), ),
ROLESã»ã¯ã·ã§ã³ã§ã¯ããäžéãããŒã«ã«ã€ããŠèª¬æããŸãã 次ã«ãã圹å²ã®å²ãåœãŠãã»ã¯ã·ã§ã³ã§ãADã®ã°ã«ãŒãã«ã€ããŠèª¬æãããããã«äžéã®åœ¹å²ãå²ãåœãŠãŸãã
äžèšã®èšå®ã¯æ¬¡ã®ããã«èªãããšãã§ããŸãïŒ
éçºè ã°ã«ãŒãã®å Žåããã¥ãŒã¹ïŒnewsManagerïŒããã³ã¢ããªã±ãŒã·ã§ã³ïŒrequestManagerïŒãå«ããã¹ãŠã®ã¢ã¯ã·ã§ã³ã䜿çšå¯èœã«ãªãã departamentBossã°ã«ãŒãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®äœæã®ã¿ã䜿çšå¯èœã«ãªããŸãã
ãããã«
Yiiã®ããŒã«ã¡ã«ããºã ã¯ãé©åã«äœ¿çšããã°æ¬åœã«æè»ã§ãã
å°æ¥ã®èšç»ã«ã¯ãGUIããŒã«ç®¡çãœãªã¥ãŒã·ã§ã³ã®äœæãŸãã¯é©å¿ãå«ãŸããŸãã å°æ°ã®ã¢ã¯ã·ã§ã³ã§ããã·ã¹ãã ã¯æ··ä¹±ããæžã蟌ã¿ã®éã¯äžåœã«ãªããŸãã
ãã¹ãŠã®ãŠãŒã¶ãŒã«ãYiiãããžã§ã¯ãã§æš©å©ç®¡çã·ã¹ãã ãã©ã®ããã«å®è£ ãããããããŠå人çãªçµéšããåŸãã©ã®ãããªãã³ããä»ã®äººã«åœ¹ç«ã€ããè°è«ããããšããå§ãããŸãã
ä»ã«èªããã®ïŒ
- Yiiå ¬åŒã¬ã€ã
- æš©å©ã®éå±€+ä»ã®äººã®çµéšãã©ã®ããã«æ©èœãããã«ã€ããŠã®è¯ãèšäº
- ãã©ãŒã©ã ã§ã®è°è«ãããäžåºŠã¯å€ãã®æçšãªããšãåŠã³ãŸããïŒã¯ã¬ãªã³ãŒããŒã®æçš¿ãèªãã§ãã ããïŒ
- ãŠã£ãããã£ã¢ã®LDAP
- AdLdapã¬ã€ã