spring security 5 xml属性占位符配置程序不工作

i1icjdpr  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(222)

我最近开始学习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或其他东西。谢谢你的帮助。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题