title: Spring JWT - Add custom claims
body: <p>can you help me with my problem? I generated JWT for my client using Spring OAuth2. I have implemented an authorization and resource server along with some web security configuration, everything done with online guides. </p>
  
  <p>It works fine, but now I want to edit the payload and add custom properties, for example a user's first name and last name and so on. Can you check my code and tell me what should I do for adding additional properties into payload? Thanks.</p>
  
  <p>Here is my implementation:</p>
  
  <pre><code>@Configuration
  @EnableWebSecurity
  public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
      @Value("${security.signing-key}")
      private String signingKey;
  
      @Value("${security.encoding-strength}")
      private Integer encodingStrength;
  
      @Value("${security.security-realm}")
      private String securityRealm;
  
      @Autowired
      private UserDetailsService userDetailsService;
  
      @Bean
      @Override
      protected AuthenticationManager authenticationManager() throws Exception {
          return super.authenticationManager();
      }
  
      @Override
      protected void configure(AuthenticationManagerBuilder auth) throws Exception {
          auth.userDetailsService(userDetailsService)
                  .passwordEncoder(new BCryptPasswordEncoder());
      }
  
      @Override
      protected void configure(HttpSecurity http) throws Exception {
          http
                  .sessionManagement()
                  .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                  .and()
                  .httpBasic()
                  .realmName(securityRealm)
                  .and()
                  .csrf()
                  .disable();
  
      }
  
      @Bean
      public JwtAccessTokenConverter accessTokenConverter() {
          JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
          converter.setSigningKey(signingKey);
          return converter;
      }
  
      @Bean
      public TokenStore tokenStore() {
          return new JwtTokenStore(accessTokenConverter());
      }
  
      @Bean
      @Primary
      //Making this primary to avoid any accidental duplication with another token service instance of the same name
      public DefaultTokenServices tokenServices() {
          DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
          defaultTokenServices.setTokenStore(tokenStore());
          defaultTokenServices.setSupportRefreshToken(true);
          return defaultTokenServices;
      }
  }
  </code></pre>
  
  <p>Authorization Server:</p>
  
  <pre><code>@Configuration
  @EnableAuthorizationServer
  public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
      @Value("${security.jwt.client-id}")
      private String clientId;
  
      @Value("${security.jwt.client-secret}")
      private String clientSecret;
  
      @Value("${security.jwt.grant-type}")
      private String grantType;
  
      @Value("${security.jwt.scope-read}")
      private String scopeRead;
  
      @Value("${security.jwt.scope-write}")
      private String scopeWrite = "write";
  
      @Value("${security.jwt.resource-ids}")
      private String resourceIds;
  
      @Value("${security.jwt.expiration}")
      private int expiration;
  
      @Autowired
      private TokenStore tokenStore;
  
      @Autowired
      private JwtAccessTokenConverter accessTokenConverter;
  
      @Autowired
      private AuthenticationManager authenticationManager;
  
      @Override
      public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
          configurer
                  .inMemory()
                  .withClient(clientId)
                  .secret(clientSecret)
                  .authorizedGrantTypes(grantType)
                  .scopes(scopeRead, scopeWrite)
                  .resourceIds(resourceIds)
                  .accessTokenValiditySeconds(expiration);
      }
  
      @Override
      public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
          TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
          enhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));
          endpoints.tokenStore(tokenStore)
                  .accessTokenConverter(accessTokenConverter)
                  .tokenEnhancer(enhancerChain)
                  .authenticationManager(authenticationManager);
      }
  }
  </code></pre>
  
  <p>Resource server:</p>
  
  <pre><code>@Configuration
  @EnableResourceServer
  public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
      @Autowired
      private ResourceServerTokenServices tokenServices;
  
      @Value("${security.jwt.resource-ids}")
      private String resourceIds;
  
      @Override
      public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
          resources.resourceId(resourceIds).tokenServices(tokenServices);
      }
  
      @Override
      public void configure(HttpSecurity http) throws Exception {
          http
                  .requestMatchers()
                  .and()
                  .authorizeRequests()
                  .antMatchers("/actuator/**", "/api-docs/**").permitAll()
                  .antMatchers("/springjwt/**" ).authenticated();
      }
  }
  </code></pre>