我最近开始学习springsecurity和oauth2,我正在尝试将我以前基于spring的应用程序转换为使用springsecurity和oauth2集成。我使用的是SpringSecurity版本5.4.5。
我使用的是基于xml的方法,通过将所有客户端凭据和提供者配置url放在xml文件中,我得到了一个有效的解决方案。
由于客户机id和secret必须保密,所以我想使用自己的凭证存储bean来解析值,类似地,对于提供者url,由于它们在不同的环境中是不同的,所以我想将它们保存在属性文件中。
这是我的xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-5.4.xsd
">
<bean id="env" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>file:${APP_HOME}/conf/app.properties</value>
<value>file:${APP_HOME}/conf/user/app.properties</value>
</list>
</property>
</bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="env"/>
</bean>
<bean id="credentialStore"
class="com.demo.security.impl.tomcatvault.TomcatVaultStore"/>
<sec:client-registrations>
<sec:client-registration registration-id="forgerock"
client-id="#{new java.lang.String(@credentialStore.getCredential('forgerock_clientId'))}"
client-secret="#{new java.lang.String(@credentialStore.getCredential('forgerock_clientsecret'))}"
provider-id="forgerock"
authorization-grant-type="authorization_code"
scope="openid,profile"
redirect-uri="${app.sso.oauth2.forgerock.redirect.uri}"
/>
<sec:provider provider-id="forgerock"
authorization-uri="${app.sso.oauth2.forgerock.authorization.uri}"
token-uri="${app.sso.oauth2.forgerock.token.uri}"
user-info-uri="${app.sso.oauth2.forgerock.user-info.uri}"
jwk-set-uri="${app.sso.oauth2.forgerock.jwk-set.uri}"
user-info-user-name-attribute="sub"
/>
</sec:client-registrations>
<sec:http entry-point-ref="loginEntryPoint">
<sec:csrf token-repository-ref="csrfTokenRepository"/>
<sec:intercept-url pattern="/**" access="hasRole('all_users')" />
<sec:oauth2-login />
</sec:http>
<sec:authentication-manager>
<sec:authentication-provider>
<sec:user-service>
<sec:user name="jdoe" password="{noop}password1" authorities="ROLE_all_users"/>
</sec:user-service>
</sec:authentication-provider>
</sec:authentication-manager>
<bean id="defaultUserService"
class="org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService"></bean>
<bean id="csrfTokenRepository"
class="org.springframework.security.web.csrf.CookieCsrfTokenRepository">
<property name="cookiePath" value="/"/>
<property name="cookieHttpOnly" value="false"/>
</bean>
<bean id="loginEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<constructor-arg value="${app.sso.oauth2.forgerock.login-form.url}"/>
</bean>
<bean id="jwtGrantedAuthoritiesConverter"
class="org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter"
lazy-init="true">
<property name="authorityPrefix" value="ROLE_"/>
<property name="authoritiesClaimName" value="groups"/>
</bean>
<bean id="jwtAuthenticationConverter"
class="org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter"
lazy-init="true">
<property name="jwtGrantedAuthoritiesConverter" ref="jwtGrantedAuthoritiesConverter"/>
</bean>
</beans>
每当我用这个配置运行我的应用程序时,我看到它在设置客户机注册或提供者属性值时无法解析属性/或我的自定义bean调用。xml中的字符串按原样传递。我发现在5.4.0版本中有一些bug是在spring安全参考页上修复的,与客户机注册相关,所以它至少应该在客户机注册(id和secret)部分起作用。但事实并非如此,我尝试保留属性,而不是在客户机id和secret中保留bean调用,但没有成功。
我是错过了什么还是做错了什么?我是否需要创建其他bean或其他东西。谢谢你的帮助。
暂无答案!
目前还没有任何答案,快来回答吧!