检索用户后,在Spring Security中向令牌添加声明

tquggr8v  于 2022-12-10  发布在  Spring
关注(0)|答案(1)|浏览(119)

我使用Spring Authorization Server v.1.0.0。在从数据库检索用户后,我想添加声明,如用户ID。我有自己的UserDetailsService实现:

override fun loadUserByUsername(username: String): IamUserDetails {
    return userRepository.findByEmail(username)
            ?.let { IamUserDetails(it) } ?: throw UsernameNotFoundException(username)
}

我的扩展用户模型如下所示:

data class IamUserDetails(
private val user: User,
) : UserDetails {

    override fun getAuthorities(): MutableCollection<out GrantedAuthority> = mutableListOf()
    
    override fun getPassword() = user.password
    
    override fun getUsername() = user.email
    
    override fun isAccountNonExpired() = true
    
    override fun isAccountNonLocked() = true
    
    override fun isCredentialsNonExpired() = true
    
    override fun isEnabled() = user.enabled
}

user属性包含数据库中用户的ID。当前标记如下所示:

{
"sub": "user@example.com",
"aud": "messaging-client",
"nbf": 1670443075,
"scope": \[
"openid"
\],
"iss": "http://localhost:8080",
"exp": 1670443375,
"iat": 1670443075
}

问题是如何使用声明userId丰富此令牌?

fafcakar

fafcakar1#

我发现了一个解决这个问题的方法,我看过很多关于覆盖jwtDecoder bean的例子,但是它不适用于Spring授权服务器。
我补充道:

@Bean
fun tokenCustomizer(): OAuth2TokenCustomizer<JwtEncodingContext> {
    return TokenCustomizer()
}

和实现,例如:

class TokenCustomizer : OAuth2TokenCustomizer<JwtEncodingContext> {

    override fun customize(context: JwtEncodingContext) {
        context.claims.claims { it["test"] = "test" }
    }
}

则JWT包含:

{
  "sub": "user@example.com",
  "aud": "messaging-client",
  "nbf": 1670596440,
  "test": "test",
  "scope": [
    "openid"
  ],
  "iss": "http://localhost:8080",
  "exp": 1670596740,
  "iat": 1670596440
}

相关问题