Skip to content

Commit 6ec61ed

Browse files
authored
docs: add missing extension point documentation (#590)
- element-tag-post-processor - halo-documents-provider - user-creating-handler - extend authentication-webfilter with Before/After/HttpBasic/OAuth2
1 parent 930d951 commit 6ec61ed

5 files changed

Lines changed: 242 additions & 5 deletions

File tree

docs/developer-guide/plugin/extension-points/server/authentication-webfilter.md

Lines changed: 98 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,19 @@ title: 认证安全过滤器
33
description: 提供 Security WebFilter 扩展点,插件可实现自定义认证逻辑,例如:用户名密码认证,JWT 认证,匿名认证。
44
---
55

6-
此前,Halo 提供了 AdditionalWebFilter 作为扩展点供插件扩展认证相关的功能。但是近期我们明确了 AdditionalWebFilter
7-
的使用用途,故不再作为认证的扩展点。
6+
此前,Halo 提供了 AdditionalWebFilter 作为扩展点供插件扩展认证相关的功能。但是近期我们明确了 AdditionalWebFilter 的使用用途,故不再作为认证的扩展点。
87

9-
目前,Halo 提供了三种认证扩展点:表单登录认证、普通认证和匿名认证。
8+
目前,Halo 提供了以下认证相关的扩展点:
9+
10+
- 表单登录认证
11+
- HTTP Basic 认证
12+
- OAuth2 授权码认证
13+
- 普通认证
14+
- 匿名认证
15+
- Security 前置过滤器
16+
- Security 后置过滤器
17+
18+
我们在实现扩展点的时候需要注意:如果当前请求不满足认证条件,请一定要调用 `chain.filter(exchange)`,给其他 filter 留下机会。
1019

1120
## 表单登录(FormLogin)
1221

@@ -27,8 +36,52 @@ public class MyFormLoginSecurityWebFilter implements FormLoginSecurityWebFilter
2736
// Do your logic here
2837
return chain.filter(exchange);
2938
}
39+
40+
}
41+
```
42+
43+
## HTTP Basic 认证
44+
45+
示例如下:
46+
47+
```java
48+
import org.springframework.stereotype.Component;
49+
import org.springframework.web.server.ServerWebExchange;
50+
import org.springframework.web.server.WebFilterChain;
51+
import reactor.core.publisher.Mono;
52+
import run.halo.app.security.HttpBasicSecurityWebFilter;
53+
54+
@Component
55+
public class MyHttpBasicSecurityWebFilter implements HttpBasicSecurityWebFilter {
56+
57+
@Override
58+
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
59+
// Do your logic here
60+
return chain.filter(exchange);
61+
}
3062
}
63+
```
3164

65+
## OAuth2 授权码认证
66+
67+
示例如下:
68+
69+
```java
70+
import org.springframework.stereotype.Component;
71+
import org.springframework.web.server.ServerWebExchange;
72+
import org.springframework.web.server.WebFilterChain;
73+
import reactor.core.publisher.Mono;
74+
import run.halo.app.security.OAuth2AuthorizationCodeSecurityWebFilter;
75+
76+
@Component
77+
public class MyOAuth2SecurityWebFilter implements OAuth2AuthorizationCodeSecurityWebFilter {
78+
79+
@Override
80+
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
81+
// Do your logic here
82+
return chain.filter(exchange);
83+
}
84+
}
3285
```
3386

3487
## 普通认证(Authentication)
@@ -76,6 +129,46 @@ public class MyAnonymousAuthenticationSecurityWebFilter
76129
}
77130
```
78131

79-
我们在实现扩展点的时候需要注意:如果当前请求不满足认证条件,请一定要调用 `chain.filter(exchange)`,给其他 filter 留下机会。
132+
## Security 前置过滤器(Before Security)
133+
134+
在 Security 过滤器链最前面执行的过滤器,可用于在认证之前处理请求。
135+
136+
```java
137+
import org.springframework.stereotype.Component;
138+
import org.springframework.web.server.ServerWebExchange;
139+
import org.springframework.web.server.WebFilterChain;
140+
import reactor.core.publisher.Mono;
141+
import run.halo.app.security.BeforeSecurityWebFilter;
142+
143+
@Component
144+
public class MyBeforeSecurityWebFilter implements BeforeSecurityWebFilter {
145+
146+
@Override
147+
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
148+
// Do your logic here
149+
return chain.filter(exchange);
150+
}
151+
}
152+
```
153+
154+
## Security 后置过滤器(After Security)
155+
156+
在 Security 过滤器链最后面执行的过滤器,可用于在认证之后处理请求。
157+
158+
```java
159+
import org.springframework.stereotype.Component;
160+
import org.springframework.web.server.ServerWebExchange;
161+
import org.springframework.web.server.WebFilterChain;
162+
import reactor.core.publisher.Mono;
163+
import run.halo.app.security.AfterSecurityWebFilter;
80164

81-
后续会根据需求实现其他认证相关的扩展点。
165+
@Component
166+
public class MyAfterSecurityWebFilter implements AfterSecurityWebFilter {
167+
168+
@Override
169+
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
170+
// Do your logic here
171+
return chain.filter(exchange);
172+
}
173+
}
174+
```
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
title: 元素标签后置处理器
3+
description: 提供对 Thymeleaf 元素标签进行后置处理的扩展点。
4+
---
5+
6+
元素标签后置处理器扩展点用于在 Thymeleaf 模板渲染过程中对元素标签进行后置处理,例如:为图片标签添加缩略图属性、修改链接标签等。
7+
8+
```java
9+
public interface ElementTagPostProcessor extends ExtensionPoint {
10+
11+
Mono<IProcessableElementTag> process(
12+
ITemplateContext context,
13+
final IProcessableElementTag tag
14+
);
15+
}
16+
```
17+
18+
- `process` 方法用于处理元素标签,参数 `context` 为模板上下文,`tag` 为当前处理的元素标签。
19+
- 返回值为 `Mono<IProcessableElementTag>`,即处理后的新标签。如果不需要处理,返回 `Mono.empty()`
20+
- 注意:`IProcessableElementTag` 是不可变的,所有修改需要通过 `context.getModelFactory()` 创建新标签。
21+
22+
`ElementTagPostProcessor` 对应的 `ExtensionPointDefinition` 如下:
23+
24+
```yaml
25+
apiVersion: plugin.halo.run/v1alpha1
26+
kind: ExtensionPointDefinition
27+
metadata:
28+
name: element-tag-post-processor
29+
spec:
30+
className: run.halo.app.theme.dialect.ElementTagPostProcessor
31+
displayName: "元素标签后置处理器"
32+
type: MULTI_INSTANCE
33+
description: "提供用于对 Thymeleaf 元素标签进行后置处理的扩展方式"
34+
```
35+
36+
即声明 `ExtensionDefinition` 自定义模型对象时对应的 `extensionPointName` 为 `element-tag-post-processor`。
37+
38+
使用案例可以参考:[缩略图图片标签处理器](https://github.com/halo-dev/halo/blob/main/application/src/main/java/run/halo/app/core/attachment/thumbnail/ThumbnailImgTagPostProcessor.java)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: 搜索文档提供者
3+
description: 为搜索引擎提供可索引文档数据的扩展点。
4+
---
5+
6+
搜索文档提供者扩展点用于为 Halo 搜索引擎提供可索引的文档数据,例如:文章、页面等。当重建搜索索引时,Halo 会收集所有启用的文档提供者,获取它们提供的文档数据并写入搜索引擎。
7+
8+
```java
9+
public interface HaloDocumentsProvider extends ExtensionPoint {
10+
11+
Flux<HaloDocument> fetchAll();
12+
13+
String getType();
14+
}
15+
```
16+
17+
- `fetchAll` 方法用于获取所有文档数据,返回 `Flux<HaloDocument>``HaloDocument` 包含标题、内容、分类、标签等字段。
18+
- `getType` 方法返回文档类型标识,例如 `post.content.halo.run``singlepage.content.halo.run`
19+
20+
`HaloDocumentsProvider` 对应的 `ExtensionPointDefinition` 如下:
21+
22+
```yaml
23+
apiVersion: plugin.halo.run/v1alpha1
24+
kind: ExtensionPointDefinition
25+
metadata:
26+
name: halo-documents-provider
27+
spec:
28+
className: run.halo.app.search.HaloDocumentsProvider
29+
displayName: "搜索文档提供者"
30+
type: MULTI_INSTANCE
31+
description: "提供用于重建搜索索引的文档数据"
32+
```
33+
34+
即声明 `ExtensionDefinition` 自定义模型对象时对应的 `extensionPointName` 为 `halo-documents-provider`。
35+
36+
使用案例可以参考:
37+
38+
- [文章搜索文档提供者](https://github.com/halo-dev/halo/blob/main/application/src/main/java/run/halo/app/search/post/PostHaloDocumentsProvider.java)
39+
- [Meilisearch 搜索插件](https://github.com/halo-sigs/plugin-meilisearch)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
title: 用户创建处理器
3+
description: 提供在用户创建前后执行自定义逻辑的扩展点。
4+
---
5+
6+
用户创建处理器扩展点用于在用户创建前后执行自定义逻辑,例如:初始化用户配置、发送欢迎通知、同步到第三方系统等。
7+
8+
## 用户创建前处理器
9+
10+
```java
11+
public interface UserPreCreatingHandler extends ExtensionPoint {
12+
13+
Mono<Void> preCreating(User user);
14+
}
15+
```
16+
17+
- `preCreating` 方法在用户创建之前执行,参数 `user` 为即将创建的用户对象,可在此方法中修改用户属性。
18+
- 返回 `Mono.empty()` 表示处理成功。
19+
20+
## 用户创建后处理器
21+
22+
```java
23+
public interface UserPostCreatingHandler extends ExtensionPoint {
24+
25+
Mono<Void> postCreating(User user);
26+
}
27+
```
28+
29+
- `postCreating` 方法在用户创建成功之后执行,参数 `user` 为已创建的用户对象。
30+
- 返回 `Mono.empty()` 表示处理成功。
31+
32+
## 扩展点定义
33+
34+
`UserPreCreatingHandler` 对应的 `ExtensionPointDefinition` 如下:
35+
36+
```yaml
37+
apiVersion: plugin.halo.run/v1alpha1
38+
kind: ExtensionPointDefinition
39+
metadata:
40+
name: user-pre-creating-handler
41+
spec:
42+
className: run.halo.app.core.user.service.UserPreCreatingHandler
43+
displayName: "用户创建前处理器"
44+
type: MULTI_INSTANCE
45+
description: "提供在用户创建之前执行自定义逻辑的扩展方式"
46+
```
47+
48+
`UserPostCreatingHandler` 对应的 `ExtensionPointDefinition` 如下:
49+
50+
```yaml
51+
apiVersion: plugin.halo.run/v1alpha1
52+
kind: ExtensionPointDefinition
53+
metadata:
54+
name: user-post-creating-handler
55+
spec:
56+
className: run.halo.app.core.user.service.UserPostCreatingHandler
57+
displayName: "用户创建后处理器"
58+
type: MULTI_INSTANCE
59+
description: "提供在用户创建之后执行自定义逻辑的扩展方式"
60+
```
61+
62+
使用案例可以参考 Halo 核心代码中相关实现。

sidebars.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,11 +295,16 @@ module.exports = {
295295
"developer-guide/plugin/extension-points/server/attachment",
296296
"developer-guide/plugin/extension-points/server/comment-subject",
297297
"developer-guide/plugin/extension-points/server/comment-widget",
298+
"developer-guide/plugin/extension-points/server/element-tag-post-processor",
299+
"developer-guide/plugin/extension-points/server/excerpt-generator",
300+
"developer-guide/plugin/extension-points/server/halo-documents-provider",
298301
"developer-guide/plugin/extension-points/server/notifier",
302+
"developer-guide/plugin/extension-points/server/search-engine",
299303
"developer-guide/plugin/extension-points/server/template-head-processor",
300304
"developer-guide/plugin/extension-points/server/template-footer-processor",
301305
"developer-guide/plugin/extension-points/server/post-content",
302306
"developer-guide/plugin/extension-points/server/singlepage-content",
307+
"developer-guide/plugin/extension-points/server/user-creating-handler",
303308
"developer-guide/plugin/extension-points/server/username-password-authentication-manager",
304309
],
305310
},

0 commit comments

Comments
 (0)