アクセス許可管理

This commit is contained in:
2025-12-29 15:53:34 +09:00
parent decf69e8b4
commit 8c76fe2733
14 changed files with 127 additions and 12 deletions

View File

@@ -16,7 +16,7 @@ class Atom extends BlogPost {
public function feed(array $params): void {
try {
// 最新の投稿を取得
$posts = $this->getPosts('/blog/');
$posts = $this->getPosts('/blog/', null);
// 最新の5件に制限
$posts = array_slice($posts, 0, 5);

View File

@@ -7,9 +7,11 @@ class BlogPost {
*
* @return array 投稿の配列
*/
public function getPosts(string $section): array {
public function getPosts(string $section, ?\stdClass $user): array {
$path = ROOT.$section;
$posts = [];
$isMember = $user !== NULL;
$isStaff = $user !== NULL && $user->role === 1;
if (!is_dir($path)) return $posts;
$files = glob($path.'/*.md');
@@ -51,7 +53,7 @@ class BlogPost {
'thumborient' => $metadata['thumborient'] ?? '',
'category' => $metadata['category'] ?? [],
'uuid' => $metadata['uuid'] ?? '',
'preview' => $preview,
'preview' => ((!$isMember && in_array('memberonly', $metadata['category'])) || (!$isStaff && in_array('staffonly', $metadata['category'])) ? '未許可' : $preview),
'slug' => $slug,
];
}

View File

@@ -86,7 +86,7 @@ class Fediverse extends BlogPost {
try {
header('Content-Type: application/activity+json');
$posts = $this->getPosts('/blog/');
$posts = $this->getPosts('/blog/', null);
$ap = new Activitypub($posts);
echo $ap->getActivity($uuid);
exit;
@@ -104,7 +104,7 @@ class Fediverse extends BlogPost {
public function apoutbox(array $params): void {
try {
header('Content-Type: application/activity+json');
$posts = $this->getPosts('/blog/');
$posts = $this->getPosts('/blog/', null);
$ap = new Activitypub($posts);
echo $ap->getOutbox();
exit;

View File

@@ -34,7 +34,11 @@ class Home extends BlogPost {
$description = 'テクニカル諏訪子ちゃんの個人ブログ';
$posts = $this->getPosts('/blog/');
// ユーザー
$auth = new Auth();
$user = $auth->getLoggedInUser();
$posts = $this->getPosts('/blog/', $user);
if (!is_array($posts)) $posts = [];
// 検索機能が使用されている場合
@@ -57,11 +61,7 @@ class Home extends BlogPost {
$postsPerPage
);
// ユーザー
$auth = new Auth();
$user = $auth->getLoggedInUser();
$tmpl->assign('user', $user);
$tmpl->assign('currentPage', $page);
$tmpl->assign('totalPages', $totalPages);
$tmpl->assign('posts', $currentPosts);
@@ -113,6 +113,8 @@ class Home extends BlogPost {
// ユーザー
$auth = new Auth();
$user = $auth->getLoggedInUser();
$isMember = $user !== NULL;
$isStaff = $user !== NULL && $user->role === 1;
$tmpl->assign('user', $user);
$tmpl->assign('pagetit', $pagetit);
@@ -130,10 +132,23 @@ class Home extends BlogPost {
}
}
if (!$isMember && in_array('memberonly', $meta->category)) goto denyaccess;
if (!$isStaff && in_array('staffonly', $meta->category)) goto denyaccess;
showpage:
$tmpl->addCss('news-article');
$tmpl->addCss('search');
$tmpl->addCss('blogtype');
$tmpl->render('article');
exit();
denyaccess:
unset($md, $meta, $pagetit, $article, $description);
$tmpl->assign('pagetit', 'Not found');
$tmpl->assign('curPage', '404');
$tmpl->assign('menu', $this->getMenu());
$tmpl->assign('description', '');
$tmpl->render('404');
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}

View File

@@ -32,6 +32,20 @@ trait Mods {
'text' => '秘密のページ',
'show' => false,
],
[
'class' => 'menu-item',
'href' => '/memberonly',
'page' => 'memberonly',
'text' => 'メンバー限定',
'show' => true,
],
[
'class' => 'menu-item',
'href' => '/staffonly',
'page' => 'staffonly',
'text' => 'スタッフ限定',
'show' => true,
],
];
}
}

View File

@@ -77,4 +77,54 @@ class Page {
throw new \Exception($e->getMessage());
}
}
public function memberonly(array $params): void {
try {
$tmpl = new Template('/');
$pagetit = 'サインインしたユーザー限定';
$description = 'PHPフレームワークについて';
// ユーザー
$auth = new Auth();
$user = $auth->getLoggedInUser();
$tmpl->assign('user', $user);
$tmpl->assign('pagetit', $pagetit);
$tmpl->assign('curPage', 'memberonly');
$tmpl->assign('custCss', false);
$tmpl->assign('menu', $this->getMenu());
$tmpl->assign('description', $description);
if ($user && $user->role != -1) $tmpl->render('memberonly');
else $tmpl->render('nopermission');
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}
}
public function staffonly(array $params): void {
try {
$tmpl = new Template('/');
$pagetit = 'スタッフ限定';
$description = 'PHPフレームワークについて';
// ユーザー
$auth = new Auth();
$user = $auth->getLoggedInUser();
$tmpl->assign('user', $user);
$tmpl->assign('pagetit', $pagetit);
$tmpl->assign('curPage', 'staffonly');
$tmpl->assign('custCss', false);
$tmpl->assign('menu', $this->getMenu());
$tmpl->assign('description', $description);
if ($user && $user->role == 1) $tmpl->render('staffonly');
else $tmpl->render('nopermission');
} catch (\Exception $e) {
throw new \Exception($e->getMessage());
}
}
}

View File

@@ -50,7 +50,7 @@ if (ACTIVITYPUB_ENABLED) {
$test->it('アクティビティを受け取れるはず', function($test): void {
$blog = new BlogPost;
$posts = $blog->getPosts('/blog/');
$posts = $blog->getPosts('/blog/', null);
$ap = new Activitypub($posts);
$res = $ap->getActivity('a8c04518-4181-4ec6-9ef0-3f88f23b84b6'); // /blog/feature-test
$test->assertNotNull($res);