Java 如何在Spring应用程序中存储从另一个系统检索到的令牌?

Java 如何在Spring应用程序中存储从另一个系统检索到的令牌?,java,kotlin,spring-security,Java,Kotlin,Spring Security,我正在使用客户提供的凭据从另一个系统检索令牌。检索令牌后,我将创建一个UsernamePasswordAuthenticationToken,并将其放入SecurityContextHolder中 我也想存储令牌,因为我需要它来执行API调用。我把令牌放在哪里?我不喜欢把令牌放在用户名密码身份验证令牌的密码属性中 您可以在下面找到代码: override fun authenticate(authentication: Authentication?): Authentication {

我正在使用客户提供的凭据从另一个系统检索令牌。检索令牌后,我将创建一个
UsernamePasswordAuthenticationToken
,并将其放入SecurityContextHolder中

我也想存储令牌,因为我需要它来执行API调用。我把令牌放在哪里?我不喜欢把令牌放在
用户名密码身份验证令牌的
密码属性中

您可以在下面找到代码:

override fun authenticate(authentication: Authentication?): Authentication {
    authentication?.let {
        val email = authentication.name
        val password = authentication.credentials.toString()

        val token = authenticationSource.getAuth(email, password) //  I want to store it somewhere!
        return UsernamePasswordAuthenticationToken(email, password, listOf(SimpleGrantedAuthority("USER")))
    }

    throw AuthenticationServiceException("Authentication object is equal null")
}

为了解决这个问题,我提供了自己的
主体
实现:

data class UserInfo(val email: String, val token: String) : Principal {
    override fun getName(): String = email
}
然后将
UserInfo
的实例传递给
UsernamePasswordAuthenticationToken
构造函数:

UsernamePasswordAuthenticationToken(UserInfo(email, token), password, listOf(SimpleGrantedAuthority("USER")))
如果您需要此令牌,您可以通过一行简单的代码从
SecurityContext

(SecurityContextHolder.getContext().authentication.principal as UserInfo).token

什么样的代币?对于JWT,您可以使用
JwtAuthenticationToken
class@AivarasPrudnikovas,我们只是从外部系统接收作为字符串的令牌,它不是JWT。外部系统向我们返回这样的信息:
#Tue Nov 30 13:08:11 PST 2010 AUTHTOKEN=a8b6de25b5bf481824c9c4173c56231a RESULT=TRUE
调用API时,令牌将如何验证?若它是jwt令牌,那个么您需要在头文件中将它设置为承载令牌。请提供有关令牌验证将如何在API端进行的信息。您是否有任何限制,您必须在哪里存储它,我的意思是您可以存储在其中的任何一个:数据库、会话、安全上下文?顺便说一句,您当前的安全上下文是否已经使用了其他一些身份验证详细信息,或者这个令牌是实际的用户身份验证?我会将令牌传递回客户端,因为据我所知,它需要在以后重用它。然后,客户端可以使用该令牌发出请求。