OpenID Connect 的 Spring Security 5 XML 配置

Posted

技术标签:

【中文标题】OpenID Connect 的 Spring Security 5 XML 配置【英文标题】:Spring Security 5 XML configuration for OpenID Connect 【发布时间】:2019-09-13 22:12:49 【问题描述】:

我们需要一个 Spring Security 5 XML 配置来使用 OpenID Connect 提供程序在 Web 应用程序中进行身份验证,但我只找到了 Spring Boot 的 Java 配置示例。 对于 OpenID(没有连接!)、旧的 oauth Spring Security 扩展、oauth 2 Login(没有 OpenID)或第 3 方实现,Web 上有很多令人困惑的信息。 目前我正在尝试将代码从 OAuth2LoginConfigurer 转换为 XML,但这并不明显。例如,似乎没有 AuthenticationEntryPoint。任何人都可以为 OpenID Connect 提供有效的 XML 配置吗?

【问题讨论】:

【参考方案1】:

确实,Spring Security 5 不支持 OAuth2Login 配置的 XML 命名空间,并且可能不支持 5.2 版。

与此相关的open issue 没有得到太多支持,所以如果您希望看到它得到修复,我建议您表达您的支持。

很遗憾,即将发布的 5.2 版本中不会添加此支持。我们针对 5.2 定位了其他优先级更高的项目。作为一个仅供参考,我们根据用户需求对任务进行优先级排序,并且鉴于在这个问题上只有 2 个赞成票,因此对它的需求并不多。这并不意味着我们不会添加支持,只是意味着它在较低优先级列表中。

与此同时,我通过关注reference implementation MITREid Connect 为我当前的项目添加了 Open ID Connect 1.0 支持。虽然该项目是使用 Spring 4 实现的,但我们已经能够将客户端与 Spring Security 5 和 Spring Security OAuth 2.3.4 结合使用。

【讨论】:

该问题现已关闭。在 Spring Security 5.3 中添加了 XML 配置支持【参考方案2】:

直到 github issue 在 Spring Security 中得到解决,我们混合使用 Java 配置和 XML 配置,以便能够在不编译的情况下更改参数并切换 XML 配置文件以进行特定部署。

    <!-- Enable auto-wiring -->
    <context:annotation-config/>
    <!-- Scan for auto-wiring classes in spring oauth2 packages -->
    <context:component-scan base-package="org.springframework.security.oauth2"/>

    <bean class="org.mypackage.OAuth2LoginConfig"/>
    <bean class="org.mypackage.OidcRegistrationProperties">
        <property name="clientId" value="$clientId" />
        <property name="clientSecret" value="$clientSecret" />
        <property name="clientAuthenticationMethod" value="basic" />
        <property name="authorizationGrantType">
            <value type="org.springframework.security.oauth2.core.AuthorizationGrantType">authorization_code</value>
        </property>
        <property name="redirectUri" value="baseUrl/login/oauth2/code/registrationId" />
        <property name="scopes">
            <array>
                <util:constant static-field="org.springframework.security.oauth2.core.oidc.OidcScopes.OPENID" />
            </array>
        </property>
        <property name="authorizationUri" value="$authorizationUri" />
        <property name="tokenUri" value="$tokenUri" />
        <property name="userInfoUri" value="$userInfoUri" />
        <property name="userNameAttributeName">
            <util:constant static-field="org.springframework.security.oauth2.core.oidc.IdTokenClaimNames.SUB" />
        </property>
        <property name="jwkSetUri" value="$jwkSetUri" />
        <property name="clientName" value="$clientName" />
    </bean>

【讨论】:

【参考方案3】:

其他答案参考this issue,在 Spring Security 5.3 中已解决。 XML 配置记录在 5.3.1 reference 例如:

<http>
    <oauth2-login client-registration-repository-ref="clientRegistrationRepository"
              authorized-client-repository-ref="authorizedClientRepository"
              authorized-client-service-ref="authorizedClientService"
              authorization-request-repository-ref="authorizationRequestRepository"
              authorization-request-resolver-ref="authorizationRequestResolver"
              access-token-response-client-ref="accessTokenResponseClient"
              user-authorities-mapper-ref="userAuthoritiesMapper"
              user-service-ref="oauth2UserService"
              oidc-user-service-ref="oidcUserService"
              login-processing-url="/login/oauth2/code/*"
              login-page="/login"
              authentication-success-handler-ref="authenticationSuccessHandler"
              authentication-failure-handler-ref="authenticationFailureHandler"
              jwt-decoder-factory-ref="jwtDecoderFactory"/>
</http>

测试用例中的一些例子:

Minimal example

<http auto-config="true">
    <oauth2-client/>
</http>

<client-registrations>
    <client-registration registration-id="google"
                         client-id="google-client-id"
                         client-secret="google-client-secret"
                         redirect-uri="http://localhost/callback/google"
                         scope="scope1,scope2"
                         provider-id="google"/>
</client-registrations>

Custom login page

<http auto-config="true">
    <intercept-url pattern="/**" access="authenticated"/>
    <oauth2-login  login-page="/custom-login"/>
</http>

Google & GitHub client registrations

<client-registrations>
     <client-registration registration-id="google-login" client-id="google-client-id"
                     client-secret="google-client-secret" client-authentication-method="basic"
                     authorization-grant-type="authorization_code"
                     redirect-uri="baseUrl/login/oauth2/code/registrationId" scope="openid,profile,email"
                     client-name="Google" provider-id="google"/>
    <client-registration registration-id="github-login" client-id="github-client-id"
                     client-secret="github-client-secret" client-authentication-method="basic"
                     authorization-grant-type="authorization_code"
                     redirect-uri="baseUrl/login/oauth2/code/registrationId" scope="read:user"
                     client-name="Github" provider-id="github"/>
    <provider provider-id="google" authorization-uri="https://accounts.google.com/o/oauth2/v2/auth"
          token-uri="https://www.googleapis.com/oauth2/v4/token"
          user-info-uri="https://www.googleapis.com/oauth2/v3/userinfo" user-info-authentication-method="header"
          user-info-user-name-attribute="sub" jwk-set-uri="https://www.googleapis.com/oauth2/v3/certs"/>
    <provider provider-id="github" authorization-uri="https://github.com/login/oauth/authorize"
          token-uri="https://github.com/login/oauth/access_token" user-info-uri="https://api.github.com/user"
          user-info-authentication-method="header" user-info-user-name-attribute="id"/>
</client-registrations>

【讨论】:

以上是关于OpenID Connect 的 Spring Security 5 XML 配置的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端

Spring Boot OAuth2/OpenID Connect Client 尝试解码 Jwt: Malformed Jwk set 时出错

QQ connect client request's parameters are invalid, invalid openid 问题的解决

使用带有 OpenID Connect 提供程序的 spring-security-oauth2 客户端时如何访问“id_token”和“refresh_token”?

@EnableOAuth2Sso 注释 OpenID Connect 是不是兼容?

OpenID Connect webfinger 端点是用户帐户到 OpenID Connect 提供者的映射吗?