# 自定义设置

pac4j 附带了一组满足各种需求的庞大组件,因此在进行任何定制之前,你应该仔细阅读客户端认证器授权者页面,以检查已经提供的内容。

# 1)自定义认证/授权组件:

确保清楚了解不同组件的作用:

覆盖或创建新组件应该很简单。

然而,构建 Client 需要额外的努力。注意:

  • 你确实需要了解你希望支持哪种身份验证机制:是针对界面(凭据只提供一次,认证几乎总是在外部认证提供者处进行)还是针对 web 服务(每个请求都会传递凭据)
  • 所有客户端都应实现 IndirectClientDirectClient 基类,并定义适当的 RedirectionActionBuilderCredentialExtractorAuthenticatorProfileCreator(以及可选的 LogoutActionBuilder
  • 可能需要创建新的 Credentials (opens new window) 类型(如果它不是由 TokenCredentials 设计的简单字符串或由 UsernamePasswordCredentials 指定的用户名/密码)。这些新凭据可能继承自受支持协议的基本凭据(如 OAuthCredentials
  • 通常,为新客户端创建新的配置文件(无论该配置文件是否具有特定数据)以能够区分所有用户配置文件是一种良好的做法。新的用户配置文件当然应该继承自协议支持的基本配置文件,如 OAuth20Profile。至少,它必须继承自 CommonProfile (opens new window)。认证提供者返回的数据可能需要转换(例如,将单个字符串转换为Java枚举),为此,需要转换器(扩展 AttributeConverter (opens new window) 的类)。转换器和返回的用户配置文件类都必须在 ProfileDefinition (opens new window) 中定义。

# 2)改变核心流程:

更改核心流覆盖或创建新组件允许您在常规 pac4j web 组件的定义逻辑边界内实现新行为。不过,在某些情况下,这可能还不够。因此,你可以决定中断流程,并通过请求一些额外的操作来更改所提供的行为。这可以通过抛出 HttpAction (opens new window)(像任何异常一样)来实现,因为大多数组件都允许这样做。

示例

public class ExampleAuthorizer implements Authorizer {

    @Override
    public boolean isAuthorized(WebContext context, SessionStore sessionStore, List<UserProfile> profiles) {
        if ("specificValue".equals(context.getRequestHeader("specificHeader")))
        {
            throw new FoundAction("/message.html");
        }
        return true;
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 3)自定义 web 集成:

pac4j 实现严重依赖 WebContextSessionStore 来处理 HTTP 请求、响应和会话。这些组件的默认实现可以被覆盖或替换。

以及默认的 ProfileManager(用于保存/恢复配置文件)或 GuavaStore(用于在缓存中保存数据)。

在所有情况下,没有什么比以现有组件为例更好的了。不要犹豫,在 pac4j 开发邮件列表 (opens new window)中提出任何问题。

原文链接 (opens new window)