Сервер ресурсов Spring Security OAuth2 не может получить принципал с подробностями - PullRequest
0 голосов
/ 20 октября 2019

Я создал Resource Server, используя OAuth2, и у меня, конечно, возникла проблема с получением основного объекта после успешной аутентификации. Я могу видеть основное имя пользователя, но без каких-либо подробностей. Как мне настроить сервер ресурсов или аутентификации для передачи всей пользовательской информации?

Я подготовил два микросервиса, один как сервер авторизации, а второй - как сервер ресурсов. Аутентификация правильно настроена между приложениями. Они оба используют Spring Security Cloud OAuth2, и проблема состоит в том, чтобы передать весь основной объект , я не могу его получить. Возможно, мне следует что-то исправить с информацией о пользователе, но я просто теряюсь между документами.

Исходный код сервера авторизации:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    @Qualifier("authenticationManager")
    private AuthenticationManager authenticationManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("client")
                .secret(passwordEncoder.encode("password"))
                .authorizedGrantTypes("authorization_code", "refresh_token", "password")
                .accessTokenValiditySeconds(1800)
                .refreshTokenValiditySeconds(30 * 24 * 3600)
                .redirectUris("http://example.test")
                .authorizedGrantTypes("ROLE_USER")
                .autoApprove(true)
                .scopes("all");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .authenticationManager(authenticationManager)
                .tokenStore(tokenStore());
    }

    @Bean
    public TokenStore tokenStore() {
        return new InMemoryTokenStore();
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer
                .checkTokenAccess("permitAll()")
                .allowFormAuthenticationForClients();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private PasswordEncoder passwordEncoder;

    private final UserService userService;

    public WebSecurityConfiguration(UserService userService) {
        this.userService = userService;
    }

    @Autowired
    public void globalUserDetails(AuthenticationManagerBuilder authentication) throws Exception {
        authentication
                .userDetailsService(userService)
                .passwordEncoder(passwordEncoder);
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/oauth/*").permitAll()
                .antMatchers("/*").permitAll();
    }

    @Bean(name = "authenticationManager")
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}
@Service
public class UserService implements UserDetailsService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("Invalid username or password"));

        return new org.springframework.security.core.userdetails.User(
                user.getUsername(),
                user.getPassword(),
                Collections.singletonList(new SimpleGrantedAuthority(Role.ROLE_USER.name())));
    }
}
spring:
  jpa:
    hibernate:
      ddl-auto: validate
    database-platform: org.hibernate.dialect.PostgreSQLDialect
    properties:
      hibernate:
        temp:
          use_jdbc_metadata_defaults: false
    show-sql: true
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: user
    password: password

Исходный код сервера ресурсов:

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/public").permitAll()
                .anyRequest().authenticated();
    }
}
@RestController
public class WelcomeController {

    @GetMapping("/public")
    public String welcomePublic() {
        return "welcome public/guest user";
    }

    @RolesAllowed({"ROLE_USER"})
    @GetMapping("/user")
    public String welcomeUser() {
        return "welcome user";
    }
}
security:
  oauth2:
    client:
      client-id: client
      client-secret: password
    resource:
      token-info-uri: http://localhost:8080/oauth/check_token
      user-info-uri: http://localhost:8080/oauth/userinfo
server:
  port: 8081

Основным объектом в объекте аутентификации является просто String - имя пользователя. Детали не указываются.

Я ожидаю получить информацию о текущем зарегистрированном пользователе, в будущем я собираюсь расширить возможности пользователя JDBC по электронной почте или чему-то еще и получить всю информацию на сервере ресурсов. Я надеюсь, что у кого-то есть подобная проблема. :)

...