Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,19 @@ title: 认证安全过滤器
description: 提供 Security WebFilter 扩展点,插件可实现自定义认证逻辑,例如:用户名密码认证,JWT 认证,匿名认证。
---

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

目前,Halo 提供了三种认证扩展点:表单登录认证、普通认证和匿名认证。
目前,Halo 提供了以下认证相关的扩展点:

- 表单登录认证
- HTTP Basic 认证
- OAuth2 授权码认证
- 普通认证
- 匿名认证
- Security 前置过滤器
- Security 后置过滤器

我们在实现扩展点的时候需要注意:如果当前请求不满足认证条件,请一定要调用 `chain.filter(exchange)`,给其他 filter 留下机会。

## 表单登录(FormLogin)

Expand All @@ -27,8 +36,52 @@ public class MyFormLoginSecurityWebFilter implements FormLoginSecurityWebFilter
// Do your logic here
return chain.filter(exchange);
}

}
```

## HTTP Basic 认证

示例如下:

```java
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import run.halo.app.security.HttpBasicSecurityWebFilter;

@Component
public class MyHttpBasicSecurityWebFilter implements HttpBasicSecurityWebFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// Do your logic here
return chain.filter(exchange);
}
}
```

## OAuth2 授权码认证

示例如下:

```java
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import run.halo.app.security.OAuth2AuthorizationCodeSecurityWebFilter;

@Component
public class MyOAuth2SecurityWebFilter implements OAuth2AuthorizationCodeSecurityWebFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// Do your logic here
return chain.filter(exchange);
}
}
```

## 普通认证(Authentication)
Expand Down Expand Up @@ -76,6 +129,46 @@ public class MyAnonymousAuthenticationSecurityWebFilter
}
```

我们在实现扩展点的时候需要注意:如果当前请求不满足认证条件,请一定要调用 `chain.filter(exchange)`,给其他 filter 留下机会。
## Security 前置过滤器(Before Security)

在 Security 过滤器链最前面执行的过滤器,可用于在认证之前处理请求。

```java
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import run.halo.app.security.BeforeSecurityWebFilter;

@Component
public class MyBeforeSecurityWebFilter implements BeforeSecurityWebFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// Do your logic here
return chain.filter(exchange);
}
}
```

## Security 后置过滤器(After Security)

在 Security 过滤器链最后面执行的过滤器,可用于在认证之后处理请求。

```java
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
import run.halo.app.security.AfterSecurityWebFilter;

后续会根据需求实现其他认证相关的扩展点。
@Component
public class MyAfterSecurityWebFilter implements AfterSecurityWebFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// Do your logic here
return chain.filter(exchange);
}
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: 元素标签后置处理器
description: 提供对 Thymeleaf 元素标签进行后置处理的扩展点。
---

元素标签后置处理器扩展点用于在 Thymeleaf 模板渲染过程中对元素标签进行后置处理,例如:为图片标签添加缩略图属性、修改链接标签等。

```java
public interface ElementTagPostProcessor extends ExtensionPoint {

Mono<IProcessableElementTag> process(
ITemplateContext context,
final IProcessableElementTag tag
);
}
```

- `process` 方法用于处理元素标签,参数 `context` 为模板上下文,`tag` 为当前处理的元素标签。
- 返回值为 `Mono<IProcessableElementTag>`,即处理后的新标签。如果不需要处理,返回 `Mono.empty()`。
- 注意:`IProcessableElementTag` 是不可变的,所有修改需要通过 `context.getModelFactory()` 创建新标签。

`ElementTagPostProcessor` 对应的 `ExtensionPointDefinition` 如下:

```yaml
apiVersion: plugin.halo.run/v1alpha1
kind: ExtensionPointDefinition
metadata:
name: element-tag-post-processor
spec:
className: run.halo.app.theme.dialect.ElementTagPostProcessor
displayName: "元素标签后置处理器"
type: MULTI_INSTANCE
description: "提供用于对 Thymeleaf 元素标签进行后置处理的扩展方式"
```

即声明 `ExtensionDefinition` 自定义模型对象时对应的 `extensionPointName` 为 `element-tag-post-processor`。

使用案例可以参考:[缩略图图片标签处理器](https://github.com/halo-dev/halo/blob/main/application/src/main/java/run/halo/app/core/attachment/thumbnail/ThumbnailImgTagPostProcessor.java)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
title: 搜索文档提供者
description: 为搜索引擎提供可索引文档数据的扩展点。
---

搜索文档提供者扩展点用于为 Halo 搜索引擎提供可索引的文档数据,例如:文章、页面等。当重建搜索索引时,Halo 会收集所有启用的文档提供者,获取它们提供的文档数据并写入搜索引擎。

```java
public interface HaloDocumentsProvider extends ExtensionPoint {

Flux<HaloDocument> fetchAll();

String getType();
}
```

- `fetchAll` 方法用于获取所有文档数据,返回 `Flux<HaloDocument>`。`HaloDocument` 包含标题、内容、分类、标签等字段。
- `getType` 方法返回文档类型标识,例如 `post.content.halo.run`、`singlepage.content.halo.run`。

`HaloDocumentsProvider` 对应的 `ExtensionPointDefinition` 如下:

```yaml
apiVersion: plugin.halo.run/v1alpha1
kind: ExtensionPointDefinition
metadata:
name: halo-documents-provider
spec:
className: run.halo.app.search.HaloDocumentsProvider
displayName: "搜索文档提供者"
type: MULTI_INSTANCE
description: "提供用于重建搜索索引的文档数据"
```

即声明 `ExtensionDefinition` 自定义模型对象时对应的 `extensionPointName` 为 `halo-documents-provider`。

使用案例可以参考:

- [文章搜索文档提供者](https://github.com/halo-dev/halo/blob/main/application/src/main/java/run/halo/app/search/post/PostHaloDocumentsProvider.java)
- [Meilisearch 搜索插件](https://github.com/halo-sigs/plugin-meilisearch)
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: 用户创建处理器
description: 提供在用户创建前后执行自定义逻辑的扩展点。
---

用户创建处理器扩展点用于在用户创建前后执行自定义逻辑,例如:初始化用户配置、发送欢迎通知、同步到第三方系统等。

## 用户创建前处理器

```java
public interface UserPreCreatingHandler extends ExtensionPoint {

Mono<Void> preCreating(User user);
}
```

- `preCreating` 方法在用户创建之前执行,参数 `user` 为即将创建的用户对象,可在此方法中修改用户属性。
- 返回 `Mono.empty()` 表示处理成功。

## 用户创建后处理器

```java
public interface UserPostCreatingHandler extends ExtensionPoint {

Mono<Void> postCreating(User user);
}
```

- `postCreating` 方法在用户创建成功之后执行,参数 `user` 为已创建的用户对象。
- 返回 `Mono.empty()` 表示处理成功。

## 扩展点定义

`UserPreCreatingHandler` 对应的 `ExtensionPointDefinition` 如下:

```yaml
apiVersion: plugin.halo.run/v1alpha1
kind: ExtensionPointDefinition
metadata:
name: user-pre-creating-handler
spec:
className: run.halo.app.core.user.service.UserPreCreatingHandler
displayName: "用户创建前处理器"
type: MULTI_INSTANCE
description: "提供在用户创建之前执行自定义逻辑的扩展方式"
```

`UserPostCreatingHandler` 对应的 `ExtensionPointDefinition` 如下:

```yaml
apiVersion: plugin.halo.run/v1alpha1
kind: ExtensionPointDefinition
metadata:
name: user-post-creating-handler
spec:
className: run.halo.app.core.user.service.UserPostCreatingHandler
displayName: "用户创建后处理器"
type: MULTI_INSTANCE
description: "提供在用户创建之后执行自定义逻辑的扩展方式"
```

使用案例可以参考 Halo 核心代码中相关实现。
5 changes: 5 additions & 0 deletions sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -295,11 +295,16 @@ module.exports = {
"developer-guide/plugin/extension-points/server/attachment",
"developer-guide/plugin/extension-points/server/comment-subject",
"developer-guide/plugin/extension-points/server/comment-widget",
"developer-guide/plugin/extension-points/server/element-tag-post-processor",
"developer-guide/plugin/extension-points/server/excerpt-generator",
"developer-guide/plugin/extension-points/server/halo-documents-provider",
"developer-guide/plugin/extension-points/server/notifier",
"developer-guide/plugin/extension-points/server/search-engine",
"developer-guide/plugin/extension-points/server/template-head-processor",
"developer-guide/plugin/extension-points/server/template-footer-processor",
"developer-guide/plugin/extension-points/server/post-content",
"developer-guide/plugin/extension-points/server/singlepage-content",
"developer-guide/plugin/extension-points/server/user-creating-handler",
"developer-guide/plugin/extension-points/server/username-password-authentication-manager",
],
},
Expand Down
Loading