# 客户端、授权器与安全配置

在之前的示例中,我们直接对接 pac4j,并让项目运行起来了。在 Pac4jConfig 中,我们最先的配置的即是客户端 Client。

        GitHubClient gitHubClient = new GitHubClient("a85f19ea0f51face127a", "84bf0695ea2a62674b8d5961a02a4c793bf23e2a");
        GiteeClient giteeClient = new GiteeClient("da28980047eb2c732b8bcee4be567c6a4f38c6459587063f2607084c9c33b957",
                "4cd81eac1dae28b698044ed5b55e2580da94aca7d872e11e5b47d6c8a3b0a26d");

代码中我们配置了两个客户端 GitHubClientGiteeClient。我们为客户端配置了其对应的协议所需要参数,如代码中所使用的 OAuth2.0 协议的 keysecret。而对应的服务端的协议相关 API 则封装在客户端的相关实现类中。

然后我们需要将客户端添加到安全配置 Config 中,如下:

        Clients clients = new Clients("http://localhost:8888/callback", gitHubClient, giteeClient);
        Config config = new Config(clients);

我们还可以为安全配置添加认证器 Authorizer,用于进一步细化认证配置,我们没有添加,使用默认的 csrfCheck

最后再依据不同的认证框架,将 Config 配置使用,如下:

        protected void configure(HttpSecurity http) throws Exception {
            final SecurityFilter filter = new SecurityFilter(config,"GiteeClient");
            http.antMatcher("/login/gitee")
                    .addFilterBefore(filter, BasicAuthenticationFilter.class)
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.ALWAYS);
        }

通过这几个配置就可以将整个认证对接起来。

# 匹配器

匹配器 Matcher 可以用来做细化扩展,比如我们使用的 SecurityFilter,如下:

final SecurityFilter filter = new SecurityFilter(config,"GiteeClient");

这个过滤器默认不会对请求的 URL 进行过滤,如果想细化控制,比如只针对某些 URL 生效,可以通过向 SecurityFilter 添加自定义 Matcher 来实现。当然,在特定的框架中,可以使用框架自己的特性来实现匹配,比如我们使用的 Spring Security 中,可以直接在 HttpSecurity 声明中配置。

# Profile

当 pac4j 成功认证用户时,将从认证提供者检索其数据,并构建用户配置文件,即 profile。用户配置文件包括:

  • 一个标识符 (getId())
  • 属性(getAttributes()、 getAttribute(name))
  • 认证相关属性 (getAuthenticationAttributes()、getAuthenticationAttribute(name))
  • 角色 (getRoles())
  • 权限 (getPermissions())
  • 客户端名称(getClientName())
  • 记住我 (isRemembered())
  • 一个关联标识符(getLinkedId())

每个客户端会自己定义一个对应的配置文件,这样当客户端获取到服务端响应的用户数据后,可以保存下来供项目代码使用。

# Web Context、Session Store

Web 上下文、会话存储,是比较全局的配置, 一般不需要在配置时指定。

# 结语

以上,就是 pac4j 的新手入门,通过这些简单的介绍,了解了 pac4j 的一些基础概念,并能基于 Spring Security 框架对接上 pac4j,还能照着现有的客户端实现,自定义一个客户端的实现。而实现一个自定义客户端,会是实际工作中最常做的事情。