Helllo, я использую RESTful с базовой аутентификацией, и этот код является частью RestController:
@GetMapping("/jpa/users/{username}/goals")
public List<Goal> getAllGoals(@PathVariable String username) {
userId = getUserIdFromUsername(username);
return goalJpaRepository.findByUserId(userId);
}
public Long getUserIdFromUsername(String username) {
User user = userJpaRepository.findByUsername(username);
userId = user.getId();
return userId;
}
И у меня есть проблема, например, я использую Почтальон, чтобы получить цели для конкретного пользователя, например:
http://localhost:8080/jpa/users/john/goals с запросом GET
Затем я использую базовую аутентификацию для имени пользователя john и пароль для этого имени пользователя и получаю цели для john.
После этого, если я сделаю запрос GET по этой ссылке http://localhost:8080/jpa/users/tom/goals Я получу цели для Тома, но в данный момент я вошел в систему с Джоном, поэтому Джон может видеть свои цели, а также он можно увидеть цели Тома.
Вопрос в том, как мне получить доступ к имени пользователя для входа в RestController, потому что я хочу сделать что-то вроде этого:
if (loginUsername == username) {
return goalJpaRepository.findByUserId(userId);
}
return "Access denied!";
Итак, я хочу знать, возможно ли получить доступ к имени пользователя для входа из заголовка HTTP?
Спасибо!
ОБНОВЛЕНИЕ - Да, инфраструктура - Spring Boot, также я использую Spring Security с аутентификацией Dao, потому что я хочу получить пользователя из базы данных MySQL. Во всяком случае, я не эксперт в Spring Security.
Теперь я понимаю, как использовать Principal в моих методах контроллера, но я не знаю, как использовать Spring Security для этого конкретного случая. Как мне это реализовать? Например, пользователь john должен видеть и изменять только свои цели.
Конфигурация безопасности Spring:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import com.dgs.restful.webservices.goaltrackerservice.user.MyUserDetailsService;
@Configuration
@EnableWebSecurity
public class SpringSecurityConfigurationBasicAuth extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Autowired
private MyUserDetailsService userDetailsService;
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider
= new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(bCryptPasswordEncoder());
return authProvider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.antMatchers("/allusers").permitAll()
.anyRequest().authenticated()
.and()
// .formLogin().and()
.httpBasic();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
}