Spring security, ошибка 405 с методом защиты текущего сообщения - PullRequest
0 голосов
/ 12 июля 2020

Я использую Spring Security с ролями для защиты текущих страниц или действий с их собственными адресами моего приложения. Со страницей с отказом в доступе я могу поймать страницу с ошибкой 403 (доступ запрещен), когда пользователь пытается получить запрещенную страницу, но когда я защищаю текущее действие, например:

<form th:action="'/blog/'+${el.id}+'/remove'" method="post">
                    <button class = "btn btn-warning" type="submit">Delete</button>
                </form>

С текущим методом контроллера:

@PostMapping("/blog/{id}/remove")
    public String blogPostRemove(@PathVariable(value = "id") long postId, Model model) {
        Post post = postRepository.findById(postId).orElseThrow();
        postRepository.delete(post);
        return "redirect:/blog";
    }

Когда пользователь с недопустимой ролью пытается действовать, он получает страницу с ошибкой 405: Произошла непредвиденная ошибка (тип = Метод запрещен, статус = 405). Метод запроса POST не поддерживается . У пользователя с разрешенной ролью нет проблем. Есть код WebSecurityConfig:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/unpublished","/blog/*/remove","/blog/*/comments/*/remove")
                .hasAuthority("ADMIN")
                .antMatchers("/blog/*/edit","/blog/*/comment","/blog/add").authenticated()
                .antMatchers("/","/registration","/login","/blog/*").permitAll()
                .and().formLogin()
                .loginPage("/login")
                .and().exceptionHandling()
                .accessDeniedPage("/access-denied");
        http.csrf().disable();
    }
}

Как я могу изменить эту страницу с моим / access-denied? Журналы:

2020-07-13 11:26:58.094 DEBUG 42636 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : GET "/blog/28", parameters={}
2020-07-13 11:26:58.096 DEBUG 42636 --- [nio-8080-exec-6] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.example.springExample.controllers.BlogController#blogDetails(long, Model)
2020-07-13 11:26:58.364 DEBUG 42636 --- [nio-8080-exec-6] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, application/xhtml+xml, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.9, *//*;q=0.8]
2020-07-13 11:26:58.402 DEBUG 42636 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet        : Completed 200 OK
2020-07-13 11:27:04.814 DEBUG 42636 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet        : "FORWARD" dispatch for POST "/access-denied", parameters={}
2020-07-13 11:27:04.816  WARN 42636 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
2020-07-13 11:27:04.817 DEBUG 42636 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet        : Exiting from "FORWARD" dispatch, status 405
2020-07-13 11:27:04.818 DEBUG 42636 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for POST "/error", parameters={}
2020-07-13 11:27:04.818 DEBUG 42636 --- [nio-8080-exec-9] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2020-07-13 11:27:04.831 DEBUG 42636 --- [nio-8080-exec-9] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2020-07-13 11:27:04.838 DEBUG 42636 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 405

1 Ответ

1 голос
/ 13 июля 2020

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

@GetMapping("/access-denied")
public String blockAccess(Model model) {
    return "access-denied";
}

@PostMapping("/access-denied")
public String actionAccess(Model model) {
    return "access-denied";
}
...