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 관련
define('SESSION_NAMES', [
'RETURN_URL' => "return_url",
'USER' => "user",
]);
//SESSION USER FIELD관련
define('SESSION_USER_FIELDS', [
'PK' => 'uid', 'TITLE' => 'name', 'ROLE' => 'role'
'ISLOGIN' => "islogined",
'AUTH' => 'auth'
]);
define('AUTH_FIELDS', ['id', 'title', 'role']);
//인증 관련
define('AUTH_ADAPTERS', [
'Local' => [
'DEBUG' => getenv("auth.loca.debug") ?? false,
'DEBUG' => getenv("auth.loca.debug") ?: false,
],
'Google' => [
'DEBUG' => getenv("auth.google.debug") ?? false,
'ICON' => getenv("auth.google.icon") ?? '<img src="/images/auth/google_login_button.png"/>',
'DEBUG' => getenv("auth.google.debug") ?: false,
'ICON' => getenv("auth.google.icon") ?: '<img src="/images/auth/google_login_button.png"/>',
'CLIENT_ID' => getenv("auth.google.client.id"),
'CLIENT_KEY' => getenv("auth.google.client.key"),
'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 관련
define('PATHS', [
'EXCEL' => getenv('path.excel') ?? "../writable/Excel",
'UPLOAD' => getenv('path.upload') ?? "../writable/uploads",
'DOWNLOAD' => getenv('path.download') ?? "../writable/download",
'API' => getenv('path.api') ?? "../writable/api",
'EXCEL' => getenv('path.excel') ?: "../writable/Excel",
'UPLOAD' => getenv('path.upload') ?: "../writable/uploads",
'DOWNLOAD' => getenv('path.download') ?: "../writable/download",
'API' => getenv('path.api') ?: "../writable/api",
]);
foreach (PATHS as $key => $path) {
if (!is_dir(APPPATH . $path)) {
@ -194,14 +192,14 @@ define('AUDIOS', [
//Default값 정의
define('DEFAULTS', [
'ROLE' => getenv('default.role') ?? "user",
'STATUS' => getenv('default.status') ?? "use",
'EMPTY' => getenv('default.empty') ?? "",
'PERPAGE' => getenv('default.perpage') ?? 20,
'ROLE' => getenv('default.role') ?: "user",
'STATUS' => getenv('default.status') ?: "use",
'EMPTY' => getenv('default.empty') ?: "",
'PERPAGE' => getenv('default.perpage') ?: 20,
]);
//UUID초기값 정의
define('UUIDS', [
'NAMESPACE' => getenv('uuid.namespace') ?? "8fc990b07418d5826d98de952cfb268dee4a23a3",
'SECRET' => getenv('uuid.secret') ?? "delftstack1",
'NAMESPACE' => getenv('uuid.namespace') ?: "8fc990b07418d5826d98de952cfb268dee4a23a3",
'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->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' => [],
];
//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['login_buttons'] = array();
@ -71,7 +71,7 @@ class AuthController extends BaseController
public function logout()
{
//로그인 여부 확인후 Session에 Login 정보 삭제
if ($this->_session->get(SESSION_NAMES['USER'])) {
if ($this->_session->get(SESSION_NAMES['ISLOGIN'])) {
session_destroy();
}
return redirect()->route('/');

View File

@ -66,6 +66,12 @@ abstract class BaseController extends Controller
'layout' => LAYOUTS['empty'],
'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용

View File

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

View File

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

View File

@ -46,12 +46,23 @@ abstract class Adapter
return $this->_userSNSModel;
}
protected function setUserSession(UserEntity $entity): void
protected function signin_process(UserEntity $entity): void
{
$datas = array(SESSION_NAMES['USER'] => array());
foreach (SESSION_USER_FIELDS as $key => $field) {
$datas[SESSION_NAMES['USER']][$field] = $entity->$field;
$this->_session->set(SESSION_NAMES['ISLOGIN'], true);
$auths = [];
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',
// 'verifiedEmail' => true,
// ))
//조건에 해당하는 사용자가 있는지 검사
//조건에 해당하는 이미 등록된 사용자가 있는지 검사
$snsEntity = $this->getUserSNSModel()->asObject(UserSNSEntity::class)->where(
array("site" => $this->getSiteName(), "id" => $result['id'])
)->first();
//snsEntity 없으면 신규등록
if (is_null($snsEntity)) {
$snsEntity = $this->getUserSNSModel()->create($this->getSiteName(), $result);
}
if (!$snsEntity->user_id) {
throw new \Exception($this->getSiteName() . "{$result['email']}:{$result['name']}님은 아직 사용자 지정이 되지 않았습니다.");
}
//상태가 use(승인완료)가 아니라면
if ($snsEntity->status !== DEFAULTS['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);
//Session에 인증정보 설정
$this->setUserSession($entity);
$this->signin_process($entity);
return $entity;
} catch (\Exception $e) {
throw new \Exception("관리자에게 문의하시기 바랍니다.<BR>{$e->getMessage()}");

View File

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

View File

@ -48,17 +48,27 @@ class BoardModel extends CommonModel
{
switch ($field) {
case 'passwd':
return password_hash($value, PASSWORD_DEFAULT);
return $value ? password_hash($value, PASSWORD_DEFAULT) : "";
break;
case 'content':
return htmlentities($value);
break;
case 'status':
return $value ?: DEFAULTS['STATUS'];
break;
default:
return $value;
break;
}
return $value;
}
public function create(array $formDatas): BoardEntity
{
$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) {
$entity->$field = $this->changeFormData($field, $value);
}

View File

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

View File

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

View File

@ -1,13 +1,12 @@
<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">
<li class="nav-item dropdown">
<?php if (session()->get(SESSION_NAMES['USER'])) : ?>
<?php $userSessions = session()->get(SESSION_NAMES['USER']); ?>
<?php if (SESSION_NAMES['ISLOGIN']) : ?>
<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>
<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>
<hr class="dropdown-divider">
</li>