首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pac4j间接客户选择

Pac4j间接客户选择
EN

Stack Overflow用户
提问于 2022-06-01 21:44:28
回答 1查看 115关注 0票数 0

我想让用户选择几个(间接)认证选项,类似于堆栈溢出和许多其他网站提供的选项。将有一个表单登录以及OIDC选项。我可以通过设置不同间接客户端保护的不同端点来做到这一点,就像在jee-pac4j-demo中一样,但是我不知道如何处理原始请求的URL。

这是我的配置:

代码语言:javascript
复制
    <!-- form authentication -->
    <filter>
      <filter-name>FormFilter</filter-name>
      <filter-class>org.pac4j.jee.filter.SecurityFilter</filter-class>
      <init-param>
        <param-name>configFactory</param-name>
        <param-value>com.mycompany.authentication.Pac4jConfigFactory</param-value>
      </init-param>
      <init-param>
        <param-name>clients</param-name>
        <param-value>FormClient</param-value>
      </init-param>
      <init-param>
        <param-name>authorizers</param-name>
        <param-value>isAuthenticated</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>FormFilter</filter-name>
      <url-pattern>/formLogin</url-pattern>
      <url-pattern>/private-url</url-pattern>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <!-- google oidc authentication -->
    <filter>
      <filter-name>GoogleOidcFilter</filter-name>
      <filter-class>org.pac4j.jee.filter.SecurityFilter</filter-class>
      <init-param>
        <param-name>configFactory</param-name>
        <param-value>com.mycompany.authentication.Pac4jConfigFactory</param-value>
      </init-param>
      <init-param>
        <param-name>clients</param-name>
        <param-value>GoogleOidcClient</param-value>
      </init-param>
      <init-param>
        <param-name>authorizers</param-name>
        <param-value>isAuthenticated</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>GoogleOidcFilter</filter-name>
      <url-pattern>/googleOidcLogin</url-pattern>
      <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

如果用户调用受保护的url (/私有-url),他将被重定向到我的FormClient登录页面,其中我有用户名/密码字段以及指向/googleOidcLogin的链接。

如果用户使用用户名/密码登录,则一切正常,身份验证后将处理初始请求。但是,如果用户单击googleOidcLogin按钮,那么现在该页面被视为初始请求,并且是身份验证后恢复的请求。

如何用pac4j实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 03:46:24

好的,我找到了一种方法来实现这个。

由于在选择任何其他IndirectClient之前,我们总是要访问IndirectClient,所以我们所需要做的就是指示其他IndirectClient不要保存初始请求,因此不要覆盖FormClient记录的请求。这样,当另一个IndirectClient恢复初始url时,它将恢复FormClient保存的url。

为此,我们需要一个SavedRequestHandler的自定义实现,它只存储FormClient的原始url。

the FormClientOnlySavedRequestHandler

代码语言:javascript
复制
public class FormClientOnlySavedRequestHandler extends DefaultSavedRequestHandler {

    @Override
    public void save(WebContext webContext, SessionStore sessionStore) {
        // if oidcLogin, don't save anything, we will reuse the previous one (from form client)
        if (webContext.getPath().endsWith("/oidcLogin"))
            return;

        super.save(webContext, sessionStore);
    }
    
}

你在你的ConfigFactory上注册

代码语言:javascript
复制
        final Config config = new Config(clients);

        DefaultCallbackLogic callbackLogic = new DefaultCallbackLogic();
        callbackLogic.setSavedRequestHandler(new FormClientOnlySavedRequestHandler());
        config.setCallbackLogic(callbackLogic);

        DefaultSecurityLogic securityLogic = new DefaultSecurityLogic();
        securityLogic.setSavedRequestHandler(new FormClientOnlySavedRequestHandler());
        config.setSecurityLogic(securityLogic);

        return config;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72468386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档