Spring Security Kotlin@Value不会设置变量spingboot安全性

jv2fixgn  于 2023-05-07  发布在  Spring
关注(0)|答案(1)|浏览(97)

尝试通过从application.properties获取值来设置SpringBootSecurityAuthenticationManager中的一些参数,但这些值仅为默认设置的值,而不是www.example.com文件中的值application.properties
在我的应用程序的其他地方使用过@Value没有问题,但是在这个类中有些东西是错误的...无论我在application.properties中设置什么,值总是默认值。例如,refreshTokenExpiredDays应该是4(参见下面的applicationproperties文件),但实际上是1

import org.springframework.beans.factory.annotation.Value
class ApplicationAuthenticationFilters(
          authenticationManager: AuthenticationManager
    ):UsernamePasswordAuthenticationFilter(authenticationManager) {
    
        @Value("\${security-json-token-secret}")
        private val jsonTokenSecret: String = "secret"
    
        @Value("\${security-access-token-expired-mns}")
        private val accessTokenExpiredMns: Int = 10
    
        @Value("\${security-refresh-token-expired-days}")
        private val refreshTokenExpiredDays: Int = 1
    
        @Value("\${security-tokens-in-header}")
        private val tokensInHeader: Boolean=false

    ...
    ...}

应用.属性

cors-origin-patterns=http://localhost:3000,https://localhost,http://localhost:8080

security-json-token-secret=secret
security-access-token-expired-mns=20
security-refresh-token-expired-days=4
security-tokens-in-header=true

**[编辑]**想知道为什么有人设置-1到我的问题...顺便说一句,是的,在WebSecurityConfigurerAdapter中覆盖configure函数时会调用这个过滤器类

override fun configure(http: HttpSecurity) {

        val applicationAuthenticationFilter:ApplicationAuthenticationFilters = ApplicationAuthenticationFilters(authenticationManagerBean())

    applicationAuthenticationFilter.setFilterProcessesUrl("/auth/login")

    http.csrf().disable();
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    http.authorizeRequests().antMatchers("/auth/login/**", "/auth/token/refresh/**").permitAll();
    http.authorizeRequests().anyRequest().authenticated()
    // filtre ici pour gérer la JWT vai authentificationManager
    http.addFilter(applicationAuthenticationFilter)
}

[编辑2]我的解决方案最后创建了一个数据类,我注入到所有需要application.properties变量的构造函数中

@Component
data class EnvVariables(
    @Value("\${security-json-token-secret}")
    val jsonTokenSecret: String = "secret",

    @Value("\${security-access-token-expired-mns}")
    val accessTokenExpiredMns: Int = 10,

    @Value("\${security-refresh-token-expired-days}")
    val refreshTokenExpiredDays: Int = 1,

    @Value("\${security-tokens-in-header}")
    val tokensInHeader: Boolean = false
)
b4wnujal

b4wnujal1#

您可以执行以下操作:

@Value("\${security-json-token-secret:secret}")
lateinit var jsonTokenSecret: String

@Value("\${security-access-token-expired-mns:10}")
lateinit var accessTokenExpiredMns: Int

@Value("\${security-refresh-token-expired-days:1}")
lateinit var refreshTokenExpiredDays: Int
    
@Value("\${security-tokens-in-header: false}")
lateinit var tokensInHeader: Boolean

**注意:您的类(过滤器或其他)需要是@Bean@Component才能将值注入其中。在您的[EDIT]**中,您似乎正在手动构建它,在这种情况下,Spring将不会处理您的属性。

此外,存在其他技术来代替@Value,例如使用@ConfigurationProperties

相关问题