Я сделал несколько api с REST Spring. Запрос GET отлично работает в Postman, но когда я пытаюсь выполнить запрос POST, я получаю эту ошибку:
{
"timestamp": "2018-09-25T06:39:27.226+0000",
"status": 403,
"error": "Forbidden",
"message": "Forbidden",
"path": "/cidashboard/projects"
}
Это мой контроллер:
@RestController
@RequestMapping(ProjectController.PROJECT_URL)
public class ProjectController {
public static final String PROJECT_URL = "/cidashboard/projects";
private final ProjectService projectService;
public ProjectController(ProjectService projectService) {
this.projectService = projectService;
}
@GetMapping
List<Project> getAllProjects(){
return projectService.findAllProjects();
}
@GetMapping("/{id}")
Project getProjectById(@PathVariable int id) {
return projectService.findProjectById(id);
}
@PostMapping
void addProject(@RequestBody Project newProject) {
projectService.saveProject(newProject);
}
}
Конфигурация безопасности Изначально я хотел работать с ldap, но в свойствах моего приложения я оставил только соединение с базой данных .............................. .................................................. .................................................. ..................
@EnableGlobalMethodSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/css/**").permitAll();
// .anyRequest().fullyAuthenticated();
// .and()
// .formLogin().loginPage("/login").permitAll()
// .failureUrl("/login-error");
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("uid = {0},ou=people")
.groupSearchBase("ou=groups")
.contextSource(contextSource())
.passwordCompare()
//.passwordEncoder(new LdapShaPasswordEncoder())
.passwordAttribute("userPassword");
}
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/resources/static/**"); // #3
}
@Bean
public DefaultSpringSecurityContextSource contextSource() {
return new DefaultSpringSecurityContextSource(Arrays.asList("ldap://localhost:8389/"), "dc=springframework,dc=org");
}
}
Позвольте предположить, что вы не включаете токен CSRF в свой почтовый запрос.




Включить весеннюю безопасность с использованием @EnableWebSecurity. По умолчанию включает поддержку csrf, вы должны отключить ее, чтобы предотвратить запрещенные ошибки.
@Override
protected void configure(HttpSecurity http) throws Exception {
http //other configure params.
.csrf().disable();
}
PS: 415 неподдерживаемый тип -> добавьте в ваше сопоставление, как эту аннотацию, тип данных, отправляемых почтальоном.
@PostMapping(consumes = "application/json")
void addProject(@RequestBody Project newProject) {
projectService.saveProject(newProject);
}
Я добавил и теперь получаю эту ошибку: 415 Unsupported Media Type
Так что на самом деле ваш совет - сделать приложение менее безопасным только для тестирования ...
Неподдерживаемый тип мультимедиа для вашего типа отправки. Какой тип отправляет от почтальона JSON или whatelse?
@ M.Deinum Но он проигнорировал csrf, это означает, что ему не нужен этот токен. если он использовал, поддержка csrf по умолчанию. это означает, что он не хочет использовать токен csrf.
Это предположение. Тот факт, что он проигнорировал токен csrf, вполне мог быть связан с тем, что он не знал, что защита csrf включена по умолчанию. Тем не менее, давать советы сделать приложение менее безопасным - всегда плохой ответ (imho, что так).
Предположения, но я считаю верными. Конечно, он может узнать об использовании csrf. Я сказал только, как предотвратить эту проблему. Я уважаю ваше мнение, но не думаю, что этот голос полностью верен. Но спасибо за ваши предложения и мнения.
Drowny, @Consumes нужна особая зависимость?
Я добавил в свой пост новую конфигурацию на PostMapping. Можно использовать @PostMapping(consumes = "application/json")
Я получаю это org.springframework.security.web.firewall.RequestRejectedExc eption: Запрос был отклонен, поскольку URL-адрес не был нормализован.
Наконец-то это сработало. У меня ошибка в базе данных. Но работайте только с .csrf (). Disable (), и мне не нужно было ставить @Consumes (MediaType.APPLICATION_JSON_VALUE). Большое спасибо!!! :)
Можете ли вы добавить код класса конфигурации безопасности?