将 Shiro 与 pac4j jax-rs 实现集成

Integrate Shiro with pac4j jax-rs implementation

我正在使用 pac4j 的 jsx-rs 实现来只为我的应用程序启用身份验证。对于授权,我想使用Shiro。但是我不确定如何将 Shiro 与 pac4j 集成。

目前,我有一个 Feature,它执行必要的 JAX-RS 配置,我已将其设为 Provider

以下是我注册的功能和提供商。

    featureContext
    .register(new JaxRsConfigProvider(config))
    .register(new Pac4JSecurityFeature())
    .register(new Pac4JValueFactoryProvider.Binder())
    .register(new ServletJaxRsContextFactoryProvider())
    .register(new Pac4JSecurityFilterFeature(false, null, "keycloakoidcclient", "callback", false))

我正在使用 Shiro 的 AuthorizationFilter 来完成身份验证部分。我的意思是我正在根据登录用户创建一个令牌。我已经使用 Guice 的 ServletModule 注册了这个过滤器。但我无法获得登录用户。我正在尝试使用 @Context 注入 Jersey 的 SecurityContext。但是过滤器顺序混乱了。 AuthorizationFilter 在身份验证完成之前被调用。因此 SecurityContext 始终为空。

有没有更好的方法将 Shiro 与 pac4j 集成?

Shiro 提供了自己的 Feature 实现与 JAX-RS 一起使用。将该模块依赖项添加到项目中就可以了。

为了从 pac-4j 获取用户上下文,我实现了一个 Authorizer,我在其中注入了 OIDC 配置文件。我创建了一个自定义用户配置文件并将其提供给 Shiro,如下所示:

SecurityUtils.getSubject().login(new DemoToken(profile));

这样Shiro就可以获取到用户资料,然后就可以进行授权了。