Skip to content

私密文章

私密文章需要一个登录页进行登录,如果你想先体验登录页的效果,在导航栏 功能页 ->登录页点击查看。

您也可以通过 teek-login-page插槽自定义登录页。

vue
<scriptsetuplang="ts"name="TeekLayoutProvider">importTeek from"vitepress-theme-teek";importYourLoginPageComponent from"./YourLoginPageComponent";</script><template><Teek.Layout><template#teek-login-page><YourLoginPageComponent/></template></Teek.Layout></template>

前言

私密文章功能默认没有和后端集成,因此只能 防君子不防小人

当然 Teek 也提供了一些钩子函数,支持您自定义登录逻辑和加密解密,此时您可以全部重写 Teek 的登录逻辑,比如集成后端。

当然如果全部重写登录逻辑,那么就要思考一个问题:为什么不完全自己写一个呢?毕竟去完全熟悉 Teek 的登录逻辑也许比自己实现耗费的精力更多 🐶。

安全检测代码

因为 VitePress 是静态页面,所以我们无法往后端获取登录信息,那么也就有一个问题,如果用户禁用 JavaScript,那么私密文章将不会进行验证,也就可以直接浏览私密文章内容,那么如何处理这个问题呢?

打开 .vitepress/config.mts文件,给 head 模块添加如下信息:

js
["noscript",{},'<meta http-equiv="refresh"content="0;url={your link}">'];

{your link}不要填写自己博客的任意地址,而是填写博客以外的地址,因为博客的页面总会触发这段代码,导致反复跳转该页面。

开启私密文章认证功能

这一步是必须的,请阅读 功能页配置来开启私密文章认证功能。

文章开启私密功能

如果你想给某篇文章开启私密功能,请在 frontmatter中添加如下内容:

yml
---private:true---

这是 最基本也是必须的步骤,开启了私密文章后,还需要配置对应的用户名和密码,看下面。

认证级别

私密文章认证有 4 种级别:

  1. 单文章级别,每个文章有自己的用户名和密码
  2. 领域文章级别,可以给多个文章设置一个领域(组织),在该领域认证后,则该领域的其他所有文章都可以访问,它是一个组织的概念,理解就行
  3. 全局文章级别,在任意全局文章登录认证后,其他全局文章都可以访问
  4. 站点级别,在进入站点的时候需要进行认证,该级别和私密文章认证没有关系

如果同时设置多个文章级别的认证信息,那么有如下规则:

  • 一个文章同时设置 单文章级别认证信息领域文章级别认证信息,则这两个级别的认证信息都对该文章 生效
  • 一个文章同时设置 单文章级别认证信息全局文章级别认证信息,则 全局文章级别认证信息对该文章 失效
  • 一个文章同时设置 领域文章级别认证信息全局文章级别认证信息,则 全局文章级别认证信息对该文章 失效
  • 一个文章同时设置 单文章级别认证信息领域文章级别认证信息全局文章级别认证信息,则 全局文章级别认证信息对该文章 失效,另外两个认证信息都对该文章 生效

从上面可以看出,全局文章级别认证信息优先级是最低的,是一个兜底的配置。

站点级别认证有一个角色的概念,默认为 common,即当进入站点并登录认证后,访问任何私密文章仍然需要重新进行认证,而如果是 admin角色,则进入站点后,所有文章都可以访问。

单文章级别

在某个私密文章的 frontmatter中设置用户名和密码等配置:

yml
---private:true# 开启文章私密username:teek# 用户名password:teek# 密码expire:2d# 可选,登录失效时间,如果不填则以全局配置为准,全局设置默认为 1dsession:false# 可选,开启是否在网页关闭或刷新后,清除登录状态,这样再次访问网页,需要重新登录,默认为 falsestrategy:once# 可选,登录策略,once 代表一次登录,always 代表每次访问都登录,默认为 onceloginInfo:[{username:"teek1",password:"teek1"},{username:"teek2",password:"teek2"}]

警告

usernamepassword不允许是纯数字,如果您只想配置纯数字,则用引号起来,如 "1234"'1234'

可以看到 frontmatter出现了 usernamepassword,并且 loginInfo里也出现多个 usernamepassword

这两种方式没有什么区别,无论是以 usernamepassword登录,还是 loginInfo里的多个 usernamepassword都可以登录。

领域文章级别

有的时候,我们并不需要给每一个文章设置用户名和密码,而是按「组」的概念设置。

比如我们有 指南配置两个专题的文章,那么我可以对这两个专题进行认证,在 .vitepress/config.mts文件配置如下:

ts
import{defineTeekConfig } from"vitepress-theme-teek/config";constteekConfig=defineTeekConfig({private:{enabled:true,realm:{guide:[{username:"teek-guide-1",password:"teek"},{username:"teek-guide-2",password:"teek"},],config:[{username:"teek-config-1",password:"teek"},{username:"teek-config-2",password:"teek"},],},},});

指南的各个文章 frontmatter配置绑定对于的 realm

yaml
private:trueprivateRealm:guide

配置的各个文章 frontmatter配置绑定对于的 realm

yaml
private:trueprivateRealm:config

全局文章级别

有时候我们想直接提供一些用户名和密码,它能访问页面的所有文章,那么可以使用全局文章级别配置:

ts
import{defineTeekConfig } from"vitepress-theme-teek/config";constteekConfig=defineTeekConfig({private:{enabled:true,pages:[{username:"tee-pages-1",password:"teek"},{username:"tee-pages-1",password:"teek"},],},});

此时可以访问 非单文章级别、非领域文章级别的其他任何私密文章。

站点级别

站点级别的认证主要是卡控站点的访问,而不是文章的访问。

.vitepress/config.mts里开启站点级别认证并设置认证信息:

ts
import{defineTeekConfig } from"vitepress-theme-teek/config";constteekConfig=defineTeekConfig({private:{enabled:true,siteLogin:true,site:[{username:"teek-site-1",password:"teek"},{username:"teek-site-2",password:"teek"},],},});

这些用户名和密码默认是 common角色,即只适用于进入站点时登录,当访问任意私密文章时,仍需单独对私密文章认证。

如果想登录站点后可以访问所有私密文章,则给账号开启 admin角色进行如下配置:

ts
import{defineTeekConfig } from"vitepress-theme-teek/config";constteekConfig=defineTeekConfig({private:{enabled:true,siteLogin:true,site:[{username:"teek-site-1",password:"teek"},{username:"teek-site-2",password:"teek"},{username:"teek-site-2",password:"teek",role:"admin"},],},});

其他配置

除了用户名和密码之外,Teek 也有其他的配置项来加强私密文章功能,更多配置请阅读 功能页配置

最近更新