Я создал 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 по электронной почте или чему-то еще и получить всю информацию на сервере ресурсов. Я надеюсь, что у кого-то есть подобная проблема. :)