servermgrv2 init...

This commit is contained in:
최준흠git config git config --helpgit config --global user.name 최준흠 2023-07-21 08:06:05 +09:00
parent 92dd690d35
commit 5d1ddc3c8b
13 changed files with 79 additions and 65 deletions

View File

@ -137,25 +137,23 @@ define('LAYOUTS', [
//SESSION 관련 //SESSION 관련
define('SESSION_NAMES', [ define('SESSION_NAMES', [
'RETURN_URL' => "return_url", 'RETURN_URL' => "return_url",
'USER' => "user", 'ISLOGIN' => "islogined",
]); 'AUTH' => 'auth'
//SESSION USER FIELD관련
define('SESSION_USER_FIELDS', [
'PK' => 'uid', 'TITLE' => 'name', 'ROLE' => 'role'
]); ]);
define('AUTH_FIELDS', ['id', 'title', 'role']);
//인증 관련 //인증 관련
define('AUTH_ADAPTERS', [ define('AUTH_ADAPTERS', [
'Local' => [ 'Local' => [
'DEBUG' => getenv("auth.loca.debug") ?? false, 'DEBUG' => getenv("auth.loca.debug") ?: false,
], ],
'Google' => [ 'Google' => [
'DEBUG' => getenv("auth.google.debug") ?? false, 'DEBUG' => getenv("auth.google.debug") ?: false,
'ICON' => getenv("auth.google.icon") ?? '<img src="/images/auth/google_login_button.png"/>', 'ICON' => getenv("auth.google.icon") ?: '<img src="/images/auth/google_login_button.png"/>',
'CLIENT_ID' => getenv("auth.google.client.id"), 'CLIENT_ID' => getenv("auth.google.client.id"),
'CLIENT_KEY' => getenv("auth.google.client.key"), 'CLIENT_KEY' => getenv("auth.google.client.key"),
'CALLBACK_URL' => getenv("auth.google.client.callback_url"), 'CALLBACK_URL' => getenv("auth.google.client.callback_url"),
'TOKEN_NAME' => getenv('auth.google.client.token_name') ?? "access_token", 'TOKEN_NAME' => getenv('auth.google.client.token_name') ?: "access_token",
], ],
]); ]);
//등급 관련 //등급 관련
@ -168,10 +166,10 @@ define('STATUS', ["use" => "사용", "unuse" => "사용않함",]);
//Upload , Download 관련 //Upload , Download 관련
define('PATHS', [ define('PATHS', [
'EXCEL' => getenv('path.excel') ?? "../writable/Excel", 'EXCEL' => getenv('path.excel') ?: "../writable/Excel",
'UPLOAD' => getenv('path.upload') ?? "../writable/uploads", 'UPLOAD' => getenv('path.upload') ?: "../writable/uploads",
'DOWNLOAD' => getenv('path.download') ?? "../writable/download", 'DOWNLOAD' => getenv('path.download') ?: "../writable/download",
'API' => getenv('path.api') ?? "../writable/api", 'API' => getenv('path.api') ?: "../writable/api",
]); ]);
foreach (PATHS as $key => $path) { foreach (PATHS as $key => $path) {
if (!is_dir(APPPATH . $path)) { if (!is_dir(APPPATH . $path)) {
@ -194,14 +192,14 @@ define('AUDIOS', [
//Default값 정의 //Default값 정의
define('DEFAULTS', [ define('DEFAULTS', [
'ROLE' => getenv('default.role') ?? "user", 'ROLE' => getenv('default.role') ?: "user",
'STATUS' => getenv('default.status') ?? "use", 'STATUS' => getenv('default.status') ?: "use",
'EMPTY' => getenv('default.empty') ?? "", 'EMPTY' => getenv('default.empty') ?: "",
'PERPAGE' => getenv('default.perpage') ?? 20, 'PERPAGE' => getenv('default.perpage') ?: 20,
]); ]);
//UUID초기값 정의 //UUID초기값 정의
define('UUIDS', [ define('UUIDS', [
'NAMESPACE' => getenv('uuid.namespace') ?? "8fc990b07418d5826d98de952cfb268dee4a23a3", 'NAMESPACE' => getenv('uuid.namespace') ?: "8fc990b07418d5826d98de952cfb268dee4a23a3",
'SECRET' => getenv('uuid.secret') ?? "delftstack1", 'SECRET' => getenv('uuid.secret') ?: "delftstack1",
]); ]);

View File

@ -86,21 +86,6 @@ $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'au
$routes->get('toggle/(:num)/(:hash)', 'BoardController::toggle/$1/$2', ['filter' => 'authFilter:master,director']); $routes->get('toggle/(:num)/(:hash)', 'BoardController::toggle/$1/$2', ['filter' => 'authFilter:master,director']);
$routes->post('batchjob', 'BoardController::batchjob', ['filter' => 'authFilter:master,director']); $routes->post('batchjob', 'BoardController::batchjob', ['filter' => 'authFilter:master,director']);
}); });
$routes->group('hpilo', static function ($routes) {
$routes->get('', 'HPILOController::index');
$routes->get('excel', 'HPILOController::excel');
$routes->get('insert', 'HPILOController::insert_form', ['filter' => 'authFilter:master,director']);
$routes->post('insert', 'HPILOController::insert', ['filter' => 'authFilter:master,director']);
$routes->get('update/(:num)', 'HPILOController::update_form/$1');
$routes->post('update/(:num)', 'HPILOController::update/$1');
$routes->get('view/(:num)', 'HPILOController::view/$1');
$routes->get('delete/(:num)', 'HPILOController::delete/$1', ['filter' => 'authFilter:master,director']);
$routes->get('toggle/(:num)/(:hash)', 'HPILOController::toggle/$1/$2', ['filter' => 'authFilter:master,director']);
$routes->post('batchjob', 'HPILOController::batchjob', ['filter' => 'authFilter:master,director']);
$routes->post('console/(:num)', 'HPILOController::console/$1', ['filter' => 'authFilter:master,director']);
$routes->post('reset/(:num)/(:alpah)', 'HPILOController::reset/$1/$2', ['filter' => 'authFilter:master,director']);
$routes->post('reload/(:num)', 'HPILOController::reload/$1', ['filter' => 'authFilter:master,director']);
});
}); });
/* /*
* -------------------------------------------------------------------- * --------------------------------------------------------------------

View File

@ -45,7 +45,7 @@ class AuthController extends BaseController
'hiddens' => [], 'hiddens' => [],
]; ];
//RETURN_URL 존재하면 추가 //RETURN_URL 존재하면 추가
if (!$this->_session->get(SESSION_NAMES['RETURN_URL'])) { if ($this->_session->get(SESSION_NAMES['RETURN_URL'])) {
$this->_viewDatas['forms']['hiddens'][SESSION_NAMES['RETURN_URL']] = $this->_session->get(SESSION_NAMES['RETURN_URL']); $this->_viewDatas['forms']['hiddens'][SESSION_NAMES['RETURN_URL']] = $this->_session->get(SESSION_NAMES['RETURN_URL']);
} }
$this->_viewDatas['login_buttons'] = array(); $this->_viewDatas['login_buttons'] = array();
@ -71,7 +71,7 @@ class AuthController extends BaseController
public function logout() public function logout()
{ {
//로그인 여부 확인후 Session에 Login 정보 삭제 //로그인 여부 확인후 Session에 Login 정보 삭제
if ($this->_session->get(SESSION_NAMES['USER'])) { if ($this->_session->get(SESSION_NAMES['ISLOGIN'])) {
session_destroy(); session_destroy();
} }
return redirect()->route('/'); return redirect()->route('/');

View File

@ -66,6 +66,12 @@ abstract class BaseController extends Controller
'layout' => LAYOUTS['empty'], 'layout' => LAYOUTS['empty'],
'title' => '' 'title' => ''
]; ];
//로그인정보처리
$this->_viewDatas[SESSION_NAMES['ISLOGIN']] = $this->_session->get(SESSION_NAMES['ISLOGIN']);
if ($this->_viewDatas[SESSION_NAMES['ISLOGIN']]) {
$this->_viewDatas[SESSION_NAMES['AUTH']] = $this->_session->get(SESSION_NAMES['AUTH']);
}
} }
//Field별 Form Option용 //Field별 Form Option용

View File

@ -18,6 +18,11 @@ class UserEntity extends CommonEntity
{ {
return $this->attributes['name']; return $this->attributes['name'];
} }
public function getRole()
{
return $this->attributes['role'];
}
public function getPassword() public function getPassword()
{ {
return $this->attributes['passwd']; return $this->attributes['passwd'];

View File

@ -26,16 +26,15 @@ class AuthFilter implements FilterInterface
public function before(RequestInterface $request, $arguments = null) public function before(RequestInterface $request, $arguments = null)
{ {
// 로그인을 했으면 // 로그인을 했으면
if (session()->get(SESSION_NAMES['USER'])) { if (session()->get(SESSION_NAMES['ISLOGIN'])) {
$userSessions = session()->get(SESSION_NAMES['USER']); $auth = session()->get(SESSION_NAMES['AUTH']);
// dd($auth);
// 회원 ROLE이 필요ROLE 목록에 존재하지 않으면(ACL) // 회원 ROLE이 필요ROLE 목록에 존재하지 않으면(ACL)
if (!in_array($userSessions[SESSION_USER_FIELDS['ROLE']], $arguments)) { if (!in_array($auth['role'], $arguments)) {
return redirect()->to('/login')->with( return redirect()->to('/login')->with(
'error', 'error',
sprintf( sprintf(
"%s 회원님은 %s로서 접속에 필요한 권한[%s]이 없습니다. ", "{$auth['role']},{$$auth['title']}회원님은 접속에 필요한 권한[%s]이 없습니다. ",
$userSessions[SESSION_USER_FIELDS['TITLE']],
$userSessions[SESSION_USER_FIELDS['ROLE']],
implode(",", $arguments) implode(",", $arguments)
) )
); );

View File

@ -46,12 +46,23 @@ abstract class Adapter
return $this->_userSNSModel; return $this->_userSNSModel;
} }
protected function setUserSession(UserEntity $entity): void protected function signin_process(UserEntity $entity): void
{ {
$datas = array(SESSION_NAMES['USER'] => array()); $this->_session->set(SESSION_NAMES['ISLOGIN'], true);
foreach (SESSION_USER_FIELDS as $key => $field) { $auths = [];
$datas[SESSION_NAMES['USER']][$field] = $entity->$field; foreach (AUTH_FIELDS as $field) {
switch ($field) {
case 'id':
$auths[$field] = $entity->getPrimaryKey();
break;
case 'title':
$auths[$field] = $entity->getTitle();
break;
case 'role':
$auths[$field] = $entity->getRole();
break;
}
} }
$this->_session->set($datas); $this->_session->set(SESSION_NAMES['AUTH'], $auths);
} }
} }

View File

@ -97,23 +97,25 @@ class GoogleAdapter extends Adapter
// 'picture' => 'https://lh3.googleusercontent.com/a/AAcHTteFSgefsdfsdRJBkJA2tBEmg4PQrvI1Ta_5IXu5=s96-c', // 'picture' => 'https://lh3.googleusercontent.com/a/AAcHTteFSgefsdfsdRJBkJA2tBEmg4PQrvI1Ta_5IXu5=s96-c',
// 'verifiedEmail' => true, // 'verifiedEmail' => true,
// )) // ))
//조건에 해당하는 사용자가 있는지 검사 //조건에 해당하는 이미 등록된 사용자가 있는지 검사
$snsEntity = $this->getUserSNSModel()->asObject(UserSNSEntity::class)->where( $snsEntity = $this->getUserSNSModel()->asObject(UserSNSEntity::class)->where(
array("site" => $this->getSiteName(), "id" => $result['id']) array("site" => $this->getSiteName(), "id" => $result['id'])
)->first(); )->first();
//snsEntity 없으면 신규등록
if (is_null($snsEntity)) { if (is_null($snsEntity)) {
$snsEntity = $this->getUserSNSModel()->create($this->getSiteName(), $result); $snsEntity = $this->getUserSNSModel()->create($this->getSiteName(), $result);
} }
if (!$snsEntity->user_id) { //상태가 use(승인완료)가 아니라면
throw new \Exception($this->getSiteName() . "{$result['email']}:{$result['name']}님은 아직 사용자 지정이 되지 않았습니다.");
}
if ($snsEntity->status !== DEFAULTS['STATUS']) { if ($snsEntity->status !== DEFAULTS['STATUS']) {
throw new \Exception($this->getSiteName() . "{$result['email']}:{$result['name']}님은 " . lang("Admin/UserSNS.label." . $snsEntity->status) . "입니다"); throw new \Exception($this->getSiteName() . "{$result['email']}:{$result['name']}님은 " . lang("Admin/UserSNS.label." . $snsEntity->status) . "입니다");
} }
//인증된 사용자 정보를 가져온후 세션 정보 처리 //user_id가 연결되어있지 않았다면
if (!$snsEntity->user_id) {
throw new \Exception($this->getSiteName() . "{$result['email']}:{$result['name']}님은 아직 사용자 지정이 되지 않았습니다. ");
}
//인증된 사용자 정보를 가져온후 로그인처리
$entity = $this->getUserModel()->getEntity($snsEntity->user_id); $entity = $this->getUserModel()->getEntity($snsEntity->user_id);
//Session에 인증정보 설정 $this->signin_process($entity);
$this->setUserSession($entity);
return $entity; return $entity;
} catch (\Exception $e) { } catch (\Exception $e) {
throw new \Exception("관리자에게 문의하시기 바랍니다.<BR>{$e->getMessage()}"); throw new \Exception("관리자에게 문의하시기 바랍니다.<BR>{$e->getMessage()}");

View File

@ -30,7 +30,7 @@ class LocalAdapter extends Adapter
throw new \Exception("암호가 맞지않습니다."); throw new \Exception("암호가 맞지않습니다.");
} }
//Session에 인증정보 설정 //Session에 인증정보 설정
$this->setUserSession($entity); $this->signin_process($entity);
return $entity; return $entity;
} }
} }

View File

@ -48,17 +48,27 @@ class BoardModel extends CommonModel
{ {
switch ($field) { switch ($field) {
case 'passwd': case 'passwd':
return password_hash($value, PASSWORD_DEFAULT); return $value ? password_hash($value, PASSWORD_DEFAULT) : "";
break; break;
case 'content': case 'content':
return htmlentities($value); return htmlentities($value);
break; break;
case 'status':
return $value ?: DEFAULTS['STATUS'];
break;
default:
return $value;
break;
} }
return $value;
} }
public function create(array $formDatas): BoardEntity public function create(array $formDatas): BoardEntity
{ {
$entity = new BoardEntity($formDatas); $entity = new BoardEntity($formDatas);
//로그인 여부 확인후 필요한 데이터 저장
if (session()->get(SESSION_NAMES['ISLOGIN'])) {
$auth = session()->get(SESSION_NAMES['AUTH']);
$entity->user_uid = $auth['id'];
}
foreach ($formDatas as $field => $value) { foreach ($formDatas as $field => $value) {
$entity->$field = $this->changeFormData($field, $value); $entity->$field = $this->changeFormData($field, $value);
} }

View File

@ -43,9 +43,9 @@ class LoggerModel extends CommonModel
{ {
$entity = new LoggerEntity($formDatas); $entity = new LoggerEntity($formDatas);
//로그인 여부 확인후 필요한 데이터 저장 //로그인 여부 확인후 필요한 데이터 저장
if (session()->get(SESSION_NAMES['USER'])) { if (session()->get(SESSION_NAMES['ISLOGIN'])) {
$userSessions = session()->get(SESSION_NAMES['USER']); $auth = session()->get(SESSION_NAMES['AUTH']);
$entity->user_uid = $userSessions[SESSION_USER_FIELDS['PK']]; $entity->user_uid = $auth['id'];
} }
return parent::create_process($entity); return parent::create_process($entity);
} }

View File

@ -6,6 +6,5 @@
<div class="accordion"> <div class="accordion">
<?= $this->include($layout['path'] . '/left_menu/base'); ?> <?= $this->include($layout['path'] . '/left_menu/base'); ?>
<?= $this->include($layout['path'] . '/left_menu/board'); ?> <?= $this->include($layout['path'] . '/left_menu/board'); ?>
<?= $this->include($layout['path'] . '/left_menu/hpilo'); ?>
</div> </div>
</div> </div>

View File

@ -1,13 +1,12 @@
<link href="/css/admin/member_link.css" media="screen" rel="stylesheet" type="text/css" /> <link href="/css/admin/member_link.css" media="screen" rel="stylesheet" type="text/css" />
<ul class="member-link navbar-nav me-auto mb-2 mb-lg-0"> <ul class="member-link navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<?php if (session()->get(SESSION_NAMES['USER'])) : ?> <?php if (SESSION_NAMES['ISLOGIN']) : ?>
<?php $userSessions = session()->get(SESSION_NAMES['USER']); ?>
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fa fa-id-card"></i>&nbsp;<?= $userSessions[SESSION_USER_FIELDS['TITLE']] ?> <i class="fa fa-id-card"></i>&nbsp;<?= $auth['title'] ?>
</a> </a>
<ul class="dropdown-menu dropdown-menu-end"> <ul class="dropdown-menu dropdown-menu-end">
<li><a href="/admin/user/update/<?= $userSessions[SESSION_USER_FIELDS['PK']] ?>"><i class="fa fa-cog"></i>내정보수정</a></li> <li><a href="/admin/user/update/<?= $auth['id'] ?>"><i class="fa fa-cog"></i>내정보수정</a></li>
<li> <li>
<hr class="dropdown-divider"> <hr class="dropdown-divider">
</li> </li>