#124. 페이지 모듈에 열람/관리 권한 추가 및 이를 위해서 zbxe module 설정에 permission 속성 추가

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2601 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-09-18 05:30:25 +00:00
parent dc24001d46
commit ce4afeaa13
16 changed files with 229 additions and 24 deletions

View file

@ -19,6 +19,7 @@
var $act = NULL; ///< action
var $mid = NULL; ///< 모듈의 객체명
var $document_srl = NULL; ///< 문서 번호
var $module_srl = NULL; ///< 모듈의 번호
var $module_info = NULL; ///< 모듈의 정보
@ -31,7 +32,7 @@
* 인자를 넘겨주지 않으면 페이지 요청받은 Request Arguments를 이용하여
* 변수를 세팅한다.
**/
function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '') {
function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') {
// 설치가 안되어 있다면 install module을 지정
if(!Context::isInstalled()) {
$this->module = 'install';
@ -52,6 +53,9 @@
if(!$document_srl) $this->document_srl = (int)Context::get('document_srl');
else $this->document_srl = (int)$document_srl;
if(!$module_srl) $this->module_srl = (int)Context::get('module_srl');
else $this->module_srl = (int)$module_srl;
// 기본 변수들의 검사 (XSS방지를 위한 기초적 검사)
if($this->module && !eregi("^([a-z0-9\_\-]+)$",$this->module)) die(Context::getLang("msg_invalid_request"));
if($this->mid && !eregi("^([a-z0-9\_\-]+)$",$this->mid)) die(Context::getLang("msg_invalid_request"));
@ -70,13 +74,17 @@
$oModuleModel = &getModel('module');
// document_srl이 있으면 document_srl로 모듈과 모듈 정보를 구함
if($this->document_srl && !$this->mid) $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl);
if($this->document_srl && !$this->mid && !$this->module_srl) $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
// 아직 모듈을 못 찾았고 $mid값이 있으면 $mid로 모듈을 구함
if(!$module_info && $this->mid) $module_info = $oModuleModel->getModuleInfoByMid($this->mid);
if($this->module && $module_info->module != $this->module) unset($module_info);
// 모듈을 여전히(;;) 못 찾고 $module_srl이 있으면 해당 모듈을 구함
if(!$module_info && $this->module_srl) $module_info = $oModuleModel->getModuleInfoByModuleSrl($this->module_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
// 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄
if(!$module_info && !$this->module) $module_info = $oModuleModel->getModuleInfoByMid();

View file

@ -92,15 +92,7 @@
$grant->is_admin = false;
}
// act값에 admin이 들어 있는데 관리자가 아닌 경우 오류 표시
if(substr_count($this->act, 'Admin')) {
if(!$is_logged) {
$this->setAct("dispMemberLoginForm");
} elseif(!$grant->is_admin) {
return $this->stop('msg_not_permitted_act');
}
}
// module.xml 에 있는 권한 정보를 정리
if($module_info->grants) {
foreach($module_info->grants as $key => $val) {
if(!$xml_info->grant->{$key}) {
@ -160,6 +152,26 @@
}
}
// act값에 admin이 들어 있는데 관리자가 아닌 경우 오류 표시
if(substr_count($this->act, 'Admin')) {
// 로그인 되어 있지 않다면 무조건 금지
if(!$is_logged) $this->setAct("dispMemberLoginForm");
else {
$permitted = false;
// 최고관리자이면 무조건 패스~
if($grant->is_admin) $permitted = true;
// 최고관리자가 아니더라도 module.xml에서 permission에 등록된 권한이 있으면 허용
$permission_target = $xml_info->permission->{$this->act};
if($permission_target && $grant->{$permission_target}) $permitted = true;
if(!$permitted) return $this->stop('msg_not_permitted_act');
}
}
// 권한변수 설정
$this->grant = $grant;
Context::set('grant', $grant);

View file

@ -301,6 +301,7 @@
if(!count($xml_obj->module)) return; ///< xml 내용중에 module 태그가 없다면 오류;;
$grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음)
$permissions = $xml_obj->module->permissions->permission; ///< 권한 대행 (없는 경우도 있음)
$actions = $xml_obj->module->actions->action; ///< action list (필수)
$default_index = $admin_index = '';
@ -323,6 +324,21 @@
}
}
// 권한 허용 정리
if($permissions) {
if(is_array($permissions)) $permission_list = $permissions;
else $permission_list[] = $permissions;
foreach($permission_list as $permission) {
$action = $permission->attrs->action;
$target = $permission->attrs->target;
$info->permission->{$action} = $target;
$buff .= sprintf('$info->permission->%s = \'%s\';', $action, $target);
}
}
// actions 정리
if($actions) {
if(is_array($actions)) $action_list = $actions;

View file

@ -43,6 +43,7 @@
if($module_info->module_srl != $module_args->module_srl) {
$output = $oModuleController->insertModule($module_args);
$msg_code = 'success_registed';
$module_info->module_srl = $output->get('module_srl');
} else {
$output = $oModuleController->updateModule($module_args);
$msg_code = 'success_updated';

View file

@ -47,3 +47,29 @@ function doChangeCategory(fo_obj) {
}
return true;
}
/* 권한 관련 */
function doSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked=true;
}
}
function doUnSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked = false;
}
}

View file

@ -1,6 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants />
<grants>
<grant name="view" default="guest">
<title xml:lang="ko">열람</title>
<title xml:lang="zh-CN">浏览</title>
<title xml:lang="jp">閲覧</title>
<title xml:lang="en">view</title>
</grant>
<grant name="manager" default="root">
<title xml:lang="ko">관리</title>
<title xml:lang="zh-CN">管理</title>
<title xml:lang="jp">管理</title>
<title xml:lang="en">manager</title>
</grant>
</grants>
<permissions>
<permission action="procPageAdminRemoveWidgetCache" target="manager" />
<permission action="dispPageAdminContentModify" target="manager" />
<permission action="procPageAdminInsert" target="manager" />
</permissions>
<actions>
<action name="dispPageIndex" type="view" index="true" />
<action name="dispPageAdminContent" type="view" admin_index="true" standalone="true" />

View file

@ -42,6 +42,7 @@
if($module_info->module_srl != $args->module_srl) {
$output = $oModuleController->insertModule($args);
$msg_code = 'success_registed';
$module_info->module_srl = $output->get('module_srl');
} else {
$output = $oModuleController->updateModule($args);
$msg_code = 'success_updated';
@ -49,6 +50,24 @@
if(!$output->toBool()) return $output;
/**
* 권한 저장
**/
// 현 모듈의 권한 목록을 저장
$grant_list = $this->xml_info->grant;
if(count($grant_list)) {
foreach($grant_list as $key => $val) {
$group_srls = Context::get($key);
if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls);
}
$grants = serialize($arr_grant);
}
$oModuleController = &getController('module');
$oModuleController->updateModuleGrant($module_info->module_srl, $grants);
$this->add("module_srl", $args->module_srl);
$this->add("page", Context::get('page'));
$this->setMessage($msg_code);

View file

@ -27,6 +27,15 @@
// 템플릿 경로 구함 (page의 경우 tpl에 관리자용 템플릿 모아놓음)
$this->setTemplatePath($this->module_path.'tpl');
// 권한 그룹의 목록을 가져온다
$oMemberModel = &getModel('member');
$group_list = $oMemberModel->getGroups();
Context::set('group_list', $group_list);
// module.xml에서 권한 관련 목록을 구해옴
$grant_list = $this->xml_info->grant;
Context::set('grant_list', $grant_list);
}
/**

View file

@ -23,6 +23,9 @@
* @brief 일반 요청시 출력
**/
function dispPageIndex() {
// 권한 체크
if(!$this->grant->view) return $this->stop('msg_not_permitted');
// 템플릿에서 사용할 변수를 Context::set()
if($this->module_srl) Context::set('module_srl',$this->module_srl);

View file

@ -1,10 +1,12 @@
{$page_content}
<!--@if($grant->is_admin)-->
<!--@if($grant->manager)-->
<!--%import("./js/page_admin.js")-->
<div class="tRight gap1 clear">
<a href="#" onclick="doRemoveWidgetCache({$module_info->module_srl}); return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a>
<!--@if($grant->is_admin)-->
<a href="{getUrl('act','dispPageAdminInfo','module_srl',$module_info->module_srl)}" class="button"><span>{$lang->cmd_setup}</span></a>
<!--@end-->
<a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a>
</div>
<!--@end-->

View file

@ -10,6 +10,8 @@
<param name="layout_srl" target="layout_srl" />
<param name="browser_title" target="browser_title" />
<param name="is_default" target="is_default" />
<param name="view" target="view" />
<param name="manager" target="manager" />
</parameter>
<response callback_func="completeInsertPage">
<tag name="error" />

View file

@ -12,6 +12,8 @@
<param name="content" target="content" />
<param name="browser_title" target="browser_title" />
<param name="is_default" target="is_default" />
<param name="view" target="view" />
<param name="manager" target="manager" />
</parameter>
<response callback_func="completeInsertPageContent">
<tag name="error" />

View file

@ -83,3 +83,28 @@ function completeRemoveWidgetCache(ret_obj) {
alert(message);
location.reload();
}
/* 권한 관련 */
function doSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked=true;
}
}
function doUnSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked = false;
}
}

View file

@ -15,6 +15,9 @@
<input type="hidden" name="module_category_srl" value="{$module_info->module_category_srl}" />
<input type="hidden" name="browser_title" value="{$module_info->browser_title}" />
<input type="hidden" name="layout_srl" value="{$module_info->layout_srl}" />
<!--@foreach($grant_list as $key => $val)-->
<input type="hidden" name="{$key}" value="<!--@if(is_array($module_info->grants[$key]))-->{implode('|@|',$module_info->grants[$key])}<!--@end-->" />
<!--@end-->
<div class="widget_list">
<!--@foreach($widget_list as $widget)-->

View file

@ -59,17 +59,46 @@
<p>{$lang->about_layout}</p>
</td>
</tr>
<tr>
<td colspan="2" class="tRight">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
<a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a>
<!--@if($module=="admin")-->
<a href="{getUrl('act','dispPageAdminContent','module_srl','')}" class="button"><span>{$lang->cmd_list}</span></a>
<!--@else-->
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_back}</span></a>
<!--@end-->
</td>
</tr>
</table>
<!-- 권한 출력 -->
<table cellspacing="0" class="tableType3 gap1">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<thead>
<tr>
<th scope="col">{$lang->grant}</th>
<th scope="col" colspan="3">{$lang->target}</th>
</tr>
</thead>
<tbody>
<!--@foreach($grant_list as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@foreach($group_list as $k => $v)-->
<input type="checkbox" class="checkbox" name="{$key}" value="{$v->group_srl}" id="grant_{$key}_{$v->group_srl}" <!--@if(is_array($module_info->grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"<!--@end-->/>
<label for="grant_{$key}_{$v->group_srl}">{$v->title}</label>
<!--@end-->
</td>
<td><a href="#" onclick="doSelectAll(this, '{$key}')" class="blue">{$lang->cmd_select_all}</a></td>
<td><a href="#" onclick="doUnSelectAll(this, '{$key}')" class="red">{$lang->cmd_unselect_all}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<div class="tRight gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
<a href="{getUrl('','module','page','act','dispPageAdminContentModify','module_srl',$module_info->module_srl)}" onclick="window.open(this.href,'PageEdit','width=850,height=650,scrollbars=yes,resizable=yes,toolbars=no');return false;" class="button"><span>{$lang->cmd_page_modify}</span></a>
<!--@if($module=="admin")-->
<a href="{getUrl('act','dispPageAdminContent','module_srl','')}" class="button"><span>{$lang->cmd_list}</span></a>
<!--@else-->
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_back}</span></a>
<!--@end-->
</div>
</form>

View file

@ -60,6 +60,36 @@
</tr>
</table>
<!-- 권한 출력 -->
<table cellspacing="0" class="tableType3 gap1">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<thead>
<tr>
<th scope="col">{$lang->grant}</th>
<th scope="col" colspan="3">{$lang->target}</th>
</tr>
</thead>
<tbody>
<!--@foreach($grant_list as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@foreach($group_list as $k => $v)-->
<input type="checkbox" class="checkbox" name="{$key}" value="{$v->group_srl}" id="grant_{$key}_{$v->group_srl}" <!--@if(is_array($module_info->grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"<!--@end-->/>
<label for="grant_{$key}_{$v->group_srl}">{$v->title}</label>
<!--@end-->
</td>
<td><a href="#" onclick="doSelectAll(this, '{$key}')" class="blue">{$lang->cmd_select_all}</a></td>
<td><a href="#" onclick="doUnSelectAll(this, '{$key}')" class="red">{$lang->cmd_unselect_all}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<div class="tRight gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
</div>