내가 내 스프링 API에 게시하려고 할 때 403 금지?
우체부를 사용하여 다음과 같은 get 요청이 있는 사용자 목록을 얻을 수 있습니다.http://localhost:8080/users
.
그런데 같은 주소로 포스트 요청을 보내면 403 에러가 납니다.
@RestController
public class UserResource {
@Autowired
private UserRepository userRepository;
@GetMapping("/users")
public List<User> retrievaAllUsers() {
return userRepository.findAll();
}
@PostMapping("/users")
public ResponseEntity<Object> createUser(@RequestBody User user) {
User savedUser = userRepository.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
}
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
/*@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}*/
/*@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("/users/**").hasRole("ADMIN")
.and().csrf().disable().headers().frameOptions().disable();
}*/
}
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String password;
@Enumerated(EnumType.STRING)
private Role role;
// TODO which cna be removed
public User() {
super();
}
public User(Long id, String name, String password, Role role) {
this.id = id;
this.name = name;
this.password = password;
this.role = role;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
INSERT INTO user VALUES (1, 'user1', 'pass1', 'ADMIN');
INSERT INTO user VALUES (2, 'user2', 'pass2', 'USER');
INSERT INTO user VALUES (3,'user3', 'pass3', 'ADMIN')
편집
편집 2
삭제를 추가했지만 403도 제공합니까?
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable long id) {userRepository.deleteById(id); }
편집 4
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/users/**").permitAll();
}
}
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableWebSecurity
스프링 보안을 활성화하고 기본적으로 활성화합니다.csrf
support. 403 오류를 방지하려면 사용하지 않도록 설정해야 합니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
또는 보내기csrf
각 요청이 포함된 토큰.
참고: 사용 안 함csrf
애플리케이션의 보안이 떨어집니다. 전송하는 것이 가장 좋습니다.csrf
상품권.
스프링 보안과 함께 스프링 부트를 사용하고 포스트맨 등에서 API(POST, PUT, DELETE)에 액세스하는 경우 액세스할 수 없으며 오류는 금지된 403과 같은 권한 부여와 관련이 있습니다.
따라서 이 경우 포스트맨에서 API를 실행하고 테스트하려면 tocsrf 기능을 비활성화해야 합니다.
@benjaminc가 제공한 답은 맞습니다.이 구성이 작동하는 클래스를 추가해야 합니다.
프로덕션에 코드를 추가할 때 이 항목을 제거해야 합니다.CSRF 보호는 반드시 필요하며 보안 기능을 유지해야 합니다.
저는 수업 세부사항을 제공함으로써 더 자세한 내용을 위해 그의 답변을 연장할 뿐입니다.저의 요구사항은 포스트맨의 API를 테스트하는 것이었기 때문에 이 클래스를 추가했고 포스트맨의 API를 테스트할 수 있었습니다.
하지만 그 이후로 저는 Spring Junit 클래스를 추가하여 제 기능을 테스트하고 이 클래스를 삭제했습니다.
@Configuration
@EnableWebSecurity
public class AppWebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().permitAll();
}
}
이것이 누군가에게 도움이 되기를 바랍니다.
403은 권한이 없다는 뜻입니다.메소드를 설명했지만 코드는 기본 보안 액세스로 사전 구성됩니다.
추가할 수 있는 항목:
http.authorizeRequests()
.antMatchers("/users/**").permitAll();
업데이트: csrf가 비활성화된 구성:
http.csrf()
.ignoringAntMatchers("/users/**")
.and()
.authorizeRequests()
.antMatchers("/users/**").permitAll();
SecurityConfig 클래스의 이 구성은 이 문제를 해결하는 데 도움이 되었습니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
http를 다음과 같이 구성하십시오.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//configureothers if u wants.
.csrf().disable();
}
CSRF에 대한 자세한 내용은 을 참조하십시오.
언급URL : https://stackoverflow.com/questions/52449496/403-forbidden-when-i-try-to-post-to-my-spring-api
'source' 카테고리의 다른 글
null 가능한 열을 사용하여 MySQL 테이블을 조인하는 방법은 무엇입니까? (0) | 2023.08.05 |
---|---|
DB(Hibernate 및 Oracle 10g)에서 동일한 행을 읽는 두 개의 서로 다른 스레드를 방지하는 방법 (0) | 2023.08.05 |
모델을 동기화하면 UNSIGNED BIGINT가 UNNSIGNED BIGINT로 수정됩니다(19). (0) | 2023.08.05 |
로컬 호스트에서 MariaDB(MySQL) 인스턴스에 연결하려면 어떻게 해야 합니까? (0) | 2023.08.05 |
Javascript ES6 클래스 인스턴스를 복제하는 방법 (0) | 2023.08.05 |