# 配置
应用程序配置位于 config
文件夹中。所有配置文件都在启动时加载,可以通过配置提供程序访问。
当你有一个 ./config/server.js
文件,配置如下:
module.exports = {
host: '0.0.0.0',
};
你可以通过以下方式访问它:
strapi.config.get('server.host', 'defaultValueIfUndefined');
使用点符号可以访问嵌套键 dot-notation
。
注意
文件名用作访问配置的前缀。
# 所需配置
# 数据库
此文件允许您定义用于存储应用程序内容的数据库连接。
注意
您可以在本地安装过程中找到 受支持的数据库和版本 。
Path — ./config/database.js
.
TIP
请参阅 数据库指南 以获得更多细节。
# 数据库配置
配置文件对多服务器不友好。因此,我们为配置创建了一个数据存储,您希望在生产中进行更新。
# Get settings
environment
(string): 设置要存储数据的环境。默认情况下,它的当前环境(如果您的配置是环境不可知的,则可以是空字符串).type
(string): 设置配置是否为api
,plugin
orcore
. 默认是core
.name
(string): 你必须设置插件或 api 名称, 如果type
是api
或者plugin
.key
(string, required): 要存储的密钥的名称.
// strapi.store(object).get(object);
// create reusable plugin store variable
const pluginStore = strapi.store({
environment: strapi.config.environment,
type: 'plugin',
name: 'users-permissions',
});
await pluginStore.get({ key: 'grant' });
# Set settings
value
(any, required): 要存储的值.
// strapi.store(object).set(object);
// create reusable plugin store variable
const pluginStore = strapi.store({
environment: strapi.config.environment,
type: 'plugin',
name: 'users-permissions'
});
await pluginStore.set({
key: 'grant',
value: {
...
}
});
# 数据库安装指南
Strapi 为您提供了为您的项目选择最合适的数据库的选项。它目前支持 PostgreSQL, MongoDB, SQLite, MySQL 和 MariaDB。下面的文档介绍了如何在本地(出于开发目的)和各种托管服务器或云服务器解决方案(出于登台或生产目的)上安装这些数据库。
提示
部署指南 中包含了部署 Strapi 本身。
# 服务器
# Available options
Property | Description | Type | Default |
---|---|---|---|
host | 主机名 | string | localhost |
port | 服务器应在其上运行的端口 | integer | 1337 |
socket | 提供此选项时,对套接字进行侦听。Listens on a socket. Host and port are cosmetic when this option is provided and likewise use url to generate proper urls when using this option. This option is useful for running a server without exposing a port and using proxy servers on the same machine (e.g Heroku nginx buildpack (opens new window)) | string | integer | /tmp/nginx.socket |
emitErrors | 允许将错误发送到 koa 当它们发生时,以便附加自定义逻辑或使用错误报告服务. | boolean | false |
url | 服务器的公共 url。Public url of the server. Required for many different features (ex: reset password, third login providers etc.). Also enables proxy support such as Apache or Nginx, example: https://mywebsite.com/api . The url can be relative, if so, it is used with http://${host}:${port} as the base url. An absolute url is however recommended. | string | '' |
proxy | 代理,设置 koa 变量 app.proxy . When true , proxy header fields will be trusted. | boolean | false |
cron | 计划任务 Cron configuration (powered by node-schedule (opens new window)) | Object | |
cron.enabled | 是否启用计划任务 启用或禁用 CRON tasks to schedule jobs at specific dates. | boolean | false |
admin | 管理面板配置 | Object | |
admin.auth | 认证配置 | Object | |
admin.auth.secret | 用于对 JWT 令牌进行编码 | string | undefined |
admin.auth.events | 为身份验证注册的所有事件订阅者的记录 | object | {} |
admin.auth.events.onConnectionSuccess | 当管理用户成功登录到管理面板时调用 | function | undefined |
admin.auth.events.onConnectionError | 当管理员用户未能登录到管理面板时调用 | function | undefined |
admin.url | 管理面板的网址。Default value: /admin . Note: If the url is relative, it will be concatenated with url . | string | /admin |
admin.autoOpen | 启动时启用或禁用管理打开 | boolean | true |
admin.watchIgnoreFiles | 添加在开发过程中不应该被监视的自定义文件. See more 这里 (opens new window) (property ignored ). | Array(string) | [] |
admin.host | 对管理面板使用不同的主机. Only used along with strapi develop --watch-admin | string | localhost |
admin.port | 对管理面板使用不同的端口. Only used along with strapi develop --watch-admin | string | 8000 |
admin.serveAdminPanel | 如果为 false,将不会提供管理面板. Note: the index.html will still be served, see defaultIndex option | boolean | true |
admin.forgotPassword | 设置自定义忘记密码的电子邮件 (更多信息: Forgot Password Email) | Object | {} |
admin.forgotPassword.emailTemplate | 定义的电子邮件模板 email plugin | Object | Default template (opens new window) |
admin.forgotPassword.from | 发件人邮件地址 | string | 默认值 defined in your provider configuration |
admin.forgotPassword.replyTo | 要求接收者回复的默认地址或地址 | string | 默认值 defined in your provider configuration |
# 格式
您可以使用 .js
或 .json
文件来配置您的应用程序。
当使用 .js
时,你可以导出一个对象:
module.exports = {
mySecret: 'someValue',
};
或者一个返回配置对象的函数(推荐用法)。该函数将访问 env
utility 。
module.exports = ({ env }) => {
return {
mySecret: 'someValue',
};
};
# 可选配置
# 环境
如果您需要特定环境的特定静态配置,并且使用环境变量会变得单调乏味,那么可以在 ./config/env/{env}/{filename}
。
这些配置将合并到 ./config
文件夹。该环境基于 NODE_ENV
环境变量(默认为 development
)。
当使用 NODE_ENV=production
启动 Strapi 时,它将从 ./config/*
和 ./config/env/production/*
生产配置中定义的所有内容都将覆盖默认配置。
结合环境变量,这种模式变得非常强大。
例子:
./config/server.js
module.exports = {
host: '127.0.0.1',
};
./config/env/production/server.js
module.exports = ({ env }) => ({
host: env('HOST', '0.0.0.0'),
});
启动应用程序时:
yarn start
# uses host 127.0.0.1
NODE_ENV=production yarn start
# uses host 0.0.0.0
HOST=10.0.0.1 NODE_ENV=production yarn start
# uses host 10.0.0.1
# 环境变量
# Strapi 环境变量列表
有些设置只能通过环境变量进行修改。下面是这些设置的相关环境变量名称:
name | description | type | default |
---|---|---|---|
STRAPI_DISABLE_UPDATE_NOTIFICATION | 不要在终端显示关于更新 strapi 的通知消息 | boolean | false |
STRAPI_HIDE_STARTUP_MESSAGE | 不要在终端显示启动消息 | boolean | false |
STRAPI_TELEMETRY_DISABLED | 不要向 Strapi 发送使用数据 | boolean | false |
STRAPI_LOG_TIMESTAMP | 在日志中添加时间戳信息 | boolean | false |
STRAPI_LOG_LEVEL | 选择日志级别 fatal , error , warn , info , debug , trace | string | 'info' |
STRAPI_LOG_FORCE_COLOR | 强制颜色即使在不允许启用颜色的环境中也要显示(例如: 在 TTY 之外) | boolean | true |
STRAPI_LOG_PRETTY_PRINT | 日志行显示为文本而不是对象 | boolean | true |
STRAPI_LICENSE | 激活企业版的许可证密钥 | string | undefined |
NODE_ENV | 应用程序运行的环境类型 | string | 'development' |
BROWSER | 启动后打开浏览器中的管理面板 | boolean | true |
ENV_PATH | 包含环境变量的文件的路径 | string | './.env' |
# 使用环境变量的配置
在大多数情况下,环境之间会有不同的配置。例如: 数据库凭据。
您可以在配置文件中定义这些变量,而不是将这些凭据写入配置文件。在应用程序的根目录下创建一个 .env
文件。
例子:**
Path — .env
DATABASE_PASSWORD=acme
如果要自定义。在启动应用程序之前,你可以设置一个叫做 ENV_PATH
的环境变量文件 .env
:
$ ENV_PATH=/absolute/path/to/.env npm run start
现在,您可以在配置文件和应用程序中访问这些变量。可以使用 process.env.{varName}
在任何地方访问这些变量。
在您的配置文件中,您可以访问一个 env
实用程序,该实用程序允许定义默认值和强制转换值。
Path — ./config/database.js
module.exports = ({ env }) => ({
connections: {
default: {
settings: {
password: env('DATABASE_PASSWORD'),
},
},
},
});
# 铸造环境变量
// Returns the env if defined without casting it
env('VAR', 'default');
// Cast to int (using parseInt)
env.int('VAR', 0);
// Cast to float (using parseFloat)
env.float('VAR', 3.14);
// Cast to boolean (check if the value is equal to 'true')
env.bool('VAR', true);
// Cast to js object (using JSON.parse)
env.json('VAR', { key: 'value' });
// Cast to an array (syntax: ENV_VAR=[value1, value2, value3] | ENV_VAR=["value1", "value2", "value3"])
env.array('VAR', [1, 2, 3]);
// Case to date (using new Date(value))
env.date('VAR', new Date());
# API
Path — ./config/api.js
.
module.exports = ({ env }) => ({
responses: {
privateAttributes: ['_v', 'id', 'created_at'],
},
rest: {
defaultLimit: 100,
maxLimit: 250,
},
});
# 可选方案
Property | Description | Type | Default |
---|---|---|---|
responses | 全局 API 响应配置 | Object | |
responses.privateAttributes | E.g. 一组全局定义的属性作为私有属性处理 _v 当使用 MongoDb 或时间戳时 created_at , updated_at 可以视为私有 | String array | [] |
rest | REST API 配置 | Object | |
rest.defaultLimit | 指定默认值 _limit API 调用中使用的参数 | Integer | 100 |
rest.maxLimit | 指定可以请求的最大允许数字 _limit . 默认为 null 所有结果都会出来 | Integer | null |
# 插件
插件就像一个小型的独立子应用程序。它有自己的业务逻辑,包括专用模型、控制器、服务、中间件或钩子。它还可以在管理面板中集成自己的 UI。
TIP
更多信息请参考 插件文档 。
# 钩子
钩子是向核心添加功能的模块,它们在服务器引导期间加载。
# 结构
# 文件结构
module.exports = strapi => {
const hook = {
/**
* Default options
*/
defaults: {
// config object
},
/**
* Initialize the hook
*/
async initialize() {
// await someAsyncCode()
// const settings = {...this.defaults, ...strapi.config.hook.settings.**};
},
};
return hook;
};
defaults
(object): 包含默认配置.initialize
(function): 在服务器引导期间调用.
钩子的 配置 可以通过 strapi.config.hook.settings.**
访问。
钩子可以通过 strapi.hook
变量访问。
# 节点模块
在 ./node_modules
文件夹中,遵循此名称模式 strapi-hook-*
的每个文件夹都将作为钩子加载。
钩子需要遵循下面的结构:
/strapi-hook-[...]
└─── lib
- index.js
- LICENSE.md
- package.json
- README.md
index.js
是钩子的入口点,它应该看起来像上面的例子。
# 自定义本地钩子
框架允许直接从项目加载钩子,而不必从 npm 安装钩子。这是一个很好的方法,可以利用钩子系统的特性来编写不需要在应用程序之间共享的代码。要做到这一点,你必须创建一个 ./hooks
文件夹放在项目的根目录下,并将 hooks 放入其中。
/project
└─── admin
└─── api
└─── config
│ - hook.js
└─── hooks
│ └─── strapi-documentation
│ - index.js
│ └─── strapi-server-side-rendering
│ - index.js
└─── public
- favicon.ico
- package.json
- server.js
# 配置和激活
要使用自定义选项激活和配置钩子,您需要添加/编辑您的 ./config/hook.js
文件放在 Strapi 应用程序中。钩子特定的 timeout
值将覆盖全局超时值,默认超时值为 1000 毫秒。
module.exports = {
timeout: 2000,
settings: {
'hook-name': {
enabled: true,
timeout: 3000,
},
},
};
# 中间件
中间件是根据请求以类似堆栈的方式组合和执行的函数。如果您不熟悉 Koa 的中间件堆栈,我们强烈建议您阅读 Koa 介绍文档 (opens new window) 。
# 结构
# 文件结构
module.exports = strapi => {
return {
// can also be async
initialize() {
strapi.app.use(async (ctx, next) => {
// await someAsyncCode()
await next();
// await someAsyncCode()
});
},
};
};
initialize
(function): 在服务器引导期间调用.
中间件可以通过 strapi.middleware
变量访问。
# NodeJS 模块
在 ./node_modules
文件夹中,遵循此名称模式的 strapi-middleware-*
每个文件夹都将作为中间件加载。
中间件需要遵循以下结构:
/middleware
└─── lib
- index.js
- LICENSE.md
- package.json
- README.md
index.js
是您的中间件的入口点,它应该类似于上面的例子。
# 自定义中间件
该框架允许应用程序覆盖默认中间件并添加新中间件。你必须创建一个 ./middlewares
文件夹放在项目的根目录下,并将中间件放入其中。
/project
└─── api
└─── config
└─── middlewares
│ └─── responseTime // It will override the core default responseTime middleware.
│ - index.js
│ └─── views // It will be added into the stack of middleware.
│ - index.js
└─── public
- favicon.ico
- package.json
- server.js
每一个中间件都将被注入到 Koa 堆栈中。要管理加载订单,请参阅 中间件订单部分 。
# 配置和激活
要配置应用程序的中间件,需要在 Strapi 应用程序中创建或编辑 ./config/middleware.js
文件。
默认情况下,这个文件不存在,您必须创建它。
可选方案
timeout
(integer): 定义加载中间件所允许的最大毫秒.load
(Object): 请参阅详细信息 这里settings
(Object): 每个中间件的配置{middlewareName}
(Object): 配置一个中间件enabled
(boolean): 告诉 Strapi 是否运行中间件
# 设置
例子:
Path — ./config/middleware.js
.
module.exports = {
//...
settings: {
cors: {
origin: ['http://localhost', 'https://mysite.com', 'https://www.mysite.com'],
},
},
};
# 加载顺序
中间件被异步注入到 Koa 堆栈中。有时候这些中间件需要按照特定的顺序加载。若要定义加载顺序,请创建或编辑文件 ./config/middleware.js
.
Path — ./config/middleware.js
.
module.exports = {
load: {
before: ['responseTime', 'logger', 'cors', 'responses'],
order: [
"Define the middlewares' load order by putting their name in this array in the right order",
],
after: ['parser', 'router'],
},
};
load
:before
: 首先需要加载的中间件数组。这个数组的顺序很重要.order
: 需要按特定顺序加载的中间件数组.after
: 需要在堆栈末尾加载的中间件数组。这个数组的顺序很重要.
# 核心中间件配置
Strapi 的核心包括了一小部分中间件,用于性能、安全和大错误处理。
- boom
- cors
- cron
- csp
- favicon
- gzip
- hsts
- ip
- language
- logger
- p3p
- parser
- public
- responses
- responseTime
- router
- session
- xframe
- xss
TIP
无法禁用下列中间件: responses, router, logger and boom.
# 全局中间件
favicon
path
(string): 图标文件的路径. 默认值:favicon.ico
.maxAge
(integer): Cache-control max-age 指令. 默认值 毫秒:86400000
.
public
path
(string): 公用文件夹的路径:./public
.maxAge
(integer): Cache-control max-age 指令. 默认值 毫秒:60000
.defaultIndex
(boolean): 将缺省索引页面显示为/
和/index.html
. 默认值:true
.
# 请求中间件
session
enabled
(boolean): 启用或禁用会话. 默认值:false
.
logger
level
(string): 默认日志级别. 默认值:debug
.exposeInContext
(boolean): Expose logger in context so it can be used throughstrapi.log.info(‘my log’)
. 默认值:true
.requests
(boolean): 在上下文中暴露日志记录器. 默认值:false
.
parser
(See koa-body (opens new window) 了解详情)enabled
(boolean): 启用或禁用 解析器. 默认值:true
.multipart
(boolean): 启用或禁用 multipart bodies 解析. 默认值:true
.jsonLimit
(string|integer): The byte (if integer) 限制 JSON body. 默认值:1mb
.formLimit
(string|integer): The byte (if integer) 限制 form body. 默认值:56k
.queryStringParser
(看 qs (opens new window) 以获取完整的选项列表).arrayLimit
(integer): 查询字符串中数组的最大长度。索引大于限制的任何数组成员都将转换为索引作为键的对象。默认值:100
.depth
(integer): 嵌套查询字符串对象的最大解析深度. 默认值:20
.
TIP
这个会话在 mongo
作为客户机时不起作用。我们应该使用的包现在已经坏了。
# 响应中间件
gzip
(opens new window)enabled
(boolean): 启用或不启用 GZIP 响应压缩.options
(Object): 允许从 koa-compress (opens new window).
responseTime
enabled
(boolean): 允许或不允许X-Response-Time header
to response. 默认值:false
.
poweredBy
enabled
(boolean): 允许或不允许X-Powered-By
header to response. 默认值:true
.value
(string): 头部的值. 默认值:Strapi <strapi.io>
TIP
通过 koa-compress
压缩的 gzip
在默认情况下使用 Brotli (opens new window) ,但在大多数情况下没有使用合理的默认配置。如果您在启用 gzip
时遇到响应速度慢的问题,可以考虑通过传递 {br: false}
作为一个选项来禁用 Brotli。还可以使用 {br: { params: { // YOUR PARAMS HERE } }}
传递更合理的 PARAMS
# 安全中间件
csp
(opens new window)enabled
(boolean): 启用或禁用 CSP 以避免 XSS 跨网站脚本攻击和数据注入攻击.policy
(string): 配置Content-Security-Policy
响应头. 如果没有指定,则使用默认值:undefined
.
p3p
(opens new window)enabled
(boolean): 启用或禁用 p3p.
hsts
(opens new window)enabled
(boolean): 启用或禁用 HSTS.maxAge
(integer): 生效的秒数 HSTS. 默认值:31536000
.includeSubDomains
(boolean): 将 HSTS 应用于主机的所有子域. 默认值:true
.
xframe
(opens new window)enabled
(boolean): 启用或禁用X-FRAME-OPTIONS
响应头.value
(string): 头部的值, e.g. DENY, SAMEORIGIN or ALLOW-FROM uri. 默认值:SAMEORIGIN
.
xss
(opens new window)enabled
(boolean): 启用或禁用 XSS 来防止旧版 IE 浏览器(IE8)中的跨网站脚本攻击.
cors
(opens new window)enabled
(boolean): 启用或禁用 CORS 以防止您的服务器从其他域请求.origin
(string or array): Allowed URLs (http://example1.com, http://example2.com
,['http://www.example1.com', 'http://example1.com']
or allows everyone*
). 默认值:*
.expose
(array): 配置Access-Control-Expose-Headers
CORS header. If not specified, no custom headers are exposed. 默认值:["WWW-Authenticate", "Server-Authorization"]
.maxAge
(integer): 配置Access-Control-Max-Age
CORS header. 默认值:31536000
.credentials
(boolean): 配置Access-Control-Allow-Credentials
CORS header. 默认值:true
.methods
(array)|String - 配置Access-Control-Allow-Methods
CORS header. 默认值:["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"]
.headers
(array): 配置Access-Control-Allow-Headers
CORS header. If not specified, defaults to reflecting the headers specified in the request's Access-Control-Request-Headers header. 默认值:["Content-Type", "Authorization", "X-Frame-Options"]
.
ip
enabled
(boolean): 启用或禁用 IP blocker. 默认值:false
.whiteList
(array): Whitelisted IPs. 默认值:[]
.blackList
(array): Blacklisted IPs. 默认值:[]
.
# 例子
创建自定义中间件.
Path — ./middlewares/timer/index.js
module.exports = strapi => {
return {
initialize() {
strapi.app.use(async (ctx, next) => {
const start = Date.now();
await next();
const delta = Math.ceil(Date.now() - start);
ctx.set('X-Response-Time', delta + 'ms');
});
},
};
};
在环境设置中启用中间件.
首先加载一个中间件
Path — ./config/middleware.js
module.exports = {
load: {
before: ['timer', 'responseTime', 'logger', 'cors', 'responses', 'gzip'],
order: [
"Define the middlewares' load order by putting their name in this array is the right order",
],
after: ['parser', 'router'],
},
settings: {
timer: {
enabled: true,
},
},
};
# 功能
./config/functions/
包含一组 JavaScript 文件,以便添加动态和基于逻辑的配置。
可以通过 strapi.config.functions['fileName']();
访问该文件夹中公开的所有函数;
# Bootstrap
Path — ./config/functions/bootstrap.js
.
bootstrap
函数在每个服务器启动时调用。您可以使用它在服务器生命周期的此时添加特定的逻辑。
下面是一些用例:
- 创建一个管理员用户,如果没有的话.
- 用一些必要的数据填充数据库.
- 加载一些环境变量.
引导函数可以是同步或异步的.
同步
module.exports = () => {
// some sync code
};
返回 promise 函数
module.exports = () => {
return new Promise(/* some code */);
};
异步
module.exports = async () => {
await someSetup();
};
# CRON 任务
CRON 任务允许您使用可选的循环规则为特定日期的执行调度作业(任意函数)。它在任何给定的时间只使用一个计时器(而不是每秒/分钟重新评估即将到来的作业)。
此功能由 node-schedule
(opens new window) 模块提供,点击了解详情。
WARNING
确保 enabled
的 cron 配置在 ./config/server.js
文件中设置为 true。
Cron 格式:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
要定义 CRON 作业,添加如下逻辑:
Path — ./config/functions/cron.js
.
module.exports = {
/**
* Simple example.
* Every monday at 1am.
*/
'0 0 1 * * 1': () => {
// Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
},
};
如果您的 CRON 任务需要基于特定的时区运行,那么您可以像下面这样配置任务:
module.exports = {
/**
* CRON task with timezone example.
* Every monday at 1am for Asia/Dhaka timezone.
* List of valid timezones: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
*/
'0 0 1 * * 1': {
task: () => {
// Add your own logic here (e.g. send a queue of email, create a database backup, etc.).
},
options: {
tz: 'Asia/Dhaka',
},
},
};
# 数据库 ORM 定制
当出现这些插件时,它们会被加载,以便您可以自定义数据库连接实例,例如添加一些插件、自定义参数等。
你需要使用正常的 npm install the-plugin-name
或者其他支持的包工具(比如 yarn)来安装插件,然后按照下面的例子来加载它们。
# 公共资产
公共资产是静态文件,如 images, video, css, etc,您希望外部世界可以访问这些文件。
因为 API 可能需要为静态资产服务,所以每个新的 Strapi 项目默认都包含一个名为 /public
的文件夹。如果请求的路径与任何其他已定义的路由不匹配,并且与公共文件名匹配,则可以访问位于此目录中的任何文件。
例子:
可以通过 /company-logo.png
URL 访问名为 company-logo.png
在 ./public/
目录下的图像。
TIP
如果请求对应于一个文件夹名称( /pictures
url 将尝试提供 public/pictures/index.html
文件) ,那么将提供 index.html
文件。
WARNING
.
开头的都是隐藏文件,不对外公开。例如 .htaccess
或 .gitignore
不能访问。
# 单点登录 Gold (opens new window)
Strapi 上的单点登录允许您为管理面板配置额外的登录和注册方法。
注意
目前不可能将唯一的 SSO 提供者与用于 Strapi 帐户的电子邮件地址关联,这意味着对 Strapi 帐户的访问不能仅限于一个 SSO 提供者。有关解决这个问题的更多信息和解决方法,请参考 专门的 GitHub issue (opens new window) 。
# 先决条件
- 需要在 3.5.0 或更高版本上运行 Strapi 应用程序.
- 要在应用程序上配置 SSO,您将需要一个带有 Gold 计划的 EE 许可证.
- 确保 Strapi 是您可以通过供应商访问的应用程序的一部分。例如,使用 Microsoft (Azure) Active Directory,您必须首先询问具有正确权限的人,以便将 Strapi 添加到允许的应用程序列表中。请参考您的提供商文档以了解更多相关信息
# 用法
SSO 配置存在于 /config/server.js
中应用程序的服务器配置中。
# 访问配置
提供者的配置应该在服务器配置的 admin.auth.providers
路径中编写。
admin.auth.providers
是以数组的方式配置 provider 配置.
module.exports = ({ env }) => ({
// ...
admin: {
// ...
auth: {
providers: [], // The providers' configuration lives there
},
},
});
# Provider 配置
Provider 提供者的配置是一个 Javascript 对象,它具有以下属性:
Name | Required | Type | Description |
---|---|---|---|
uid | true | string | 策略的 UID。它必须匹配策略的名称 |
displayName | true | string | 将在登录页面上用于引用提供程序的名称 |
icon | false | string | 一个图像 URL。如果指定,它将替换登录页面上的 displayName |
createStrategy | true | function | 工厂函数,它将为您的供应商构建并返回一个新的 passport 策略 |
TIP
uid
属性是每个 strategy 的唯一标识符,通常可以在 strategy 包中找到。如果您不确定它指的是什么,请与策略的维护人员联系。
# The createStrategy
Factory
Passport 策略通常使用两个参数实例化它: 配置对象和验证函数。
配置对象
配置对象取决于 strategy 需求,但通常要求在提供者端建立连接后将回调 URL 重定向到。
可以使用 getStrategyCallbackURL
方法为提供程序生成特定的回调 URL。这个 URL 也需要写在提供者端,以便允许从它重定向。
回调 URL 的格式如下: /admin/connect/<provider_uid>
。
TIP
strapi.admin.services.passport.getStrategyCallbackURL
是一个 Strapi 帮助器,您可以使用它获取特定提供者的回调 URL。它接受提供程序名称作为参数并返回 URL。
如果需要,这也是为 OAuth2 应用程序放置客户机 ID 和密钥的地方。
验证功能
这里使用 verify 函数作为中间件,允许用户对从提供者 API 返回的数据进行转换和额外处理。
这个函数总是以一个 done
方法作为最后的参数,用于将需要的数据传输到 SSO 的 Strapi 层。
它的签名如下:void done(error: any, data: object);
它遵循以下规则:
- 如果
error
没有设置null
, 然后发送的数据被忽略,控制器将抛出一个错误. - 如果 SSO 的自动注册特性被禁用,则
data
对象只需要由email
适配. - 如果启用了 SSO 的自动注册功能,那么您将需要(除了
email
之外)定义一个username
属性,或者在data
对象中定义firstname
和lastname
。
# 添加一个 provider
添加新的提供程序意味着为管理员添加登录的新方法。
为了获得更大的灵活性和更多的供应商选择,Strapi 使用了 Passport.js (opens new window) 。因此,任何不需要额外自定义数据的有效护照策略都应该与 Strapi 协同工作。
WARNING
像 ldapauth (opens new window) 这样的策略不能立即生效,因为它们需要从管理面板发送额外的数据。如果希望向应用程序添加 LDAP 提供程序,则需要编写 custom strategy (opens new window) 。你也可以使用 Okta
和 Auth0
等服务作为桥接服务。
# 配置 provider
要配置提供者,请遵循以下步骤:
- 请确保从已安装的包或本地文件导入服务器配置文件中的策略.
- 你需要添加一个新项到
admin.auth.providers
在服务器配置中使用匹配 format given above - 重新启动应用程序,提供商应该出现在您的管理员登录页面.
# 例子
# 高级定制
# 管理面板网址
如果管理面板所在的主机/端口与 Strapi 服务器不同,则需要修改管理 URL。为此,请转到 /config/server.js
配置文件并调整 admin.url
字段。
例如,如果你的管理应用程序是在 https://api.example.com
上启动的,那么你的配置如下所示:
/config/server.js
module.exports = () => ({
// ...
admin: {
// ...
url: 'https://api.example.com/admin',
},
});
# 自定义逻辑
在某些情况下,您需要为您的连接工作流编写额外的逻辑,例如:
- 限制特定域的连接和注册
- 触发连接尝试的动作
- 分析
最简单的方法是插入您的策略的 verify 函数并编写一些代码。
例如,如果你想只允许拥有官方 strapi.io 电子邮件地址的人,你可以这样实例化你的策略:
const strategyInstance = new Strategy(configuration, ({ email, username }, done) => {
// If the email ends with @strapi.io
if (email.endsWith('@strapi.io')) {
// Then we continue with the data given by the provider
return done(null, { email, username });
}
// Otherwise, we continue by sending an error to the done function
done(new Error('Forbidden email address'));
});
# 认证事件
SSO 特性添加了一个新的 身份验证事件: onSSOAutoRegistration
.
每当使用 SSO 添加的自动注册特性创建用户时,都会触发此事件。它包含创建的用户(event.user
)和用于进行注册的提供程序(event.provider)。
例子:
/config/server.js
module.exports = () => ({
// ...
admin: {
// ...
auth: {
// ...
events: {
onConnectionSuccess(e) {},
onConnectionError(e) {},
// ...
onSSOAutoRegistration(e) {
const { user, provider } = e;
console.log(
`A new user (${user.id}) has been automatically registered using ${provider}`
);
},
},
},
},
});