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”?