Перенаправить на страницу входа или выдать ошибку 403 на основании запрошенного URL - PullRequest
0 голосов
/ 05 июня 2019

У меня есть приложение, созданное при загрузке Spring с использованием безопасности.Это приложение использует MVC для отображения некоторых страниц, а также использует некоторые интерфейсы отдыха для обновления / получения объектов.

Прямо сейчас каждый запрос, который я делаю без входа в систему, перенаправляется на / login стр.

Это работает так, как задумано, когда я пытаюсь получить доступ из веб-браузера.Но я хочу, чтобы приложение реагировало по-разному, когда я пытаюсь получить доступ к какому-то определенному пути со страницы, например "/ api / Customers".

Если я пытаюсь получить доступ к этому пути, я хочу сбросить ошибку HTTP 403, а не перенаправить на страницу входа.

Это моя конфигурация безопасности:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.headers()
            .referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.SAME_ORIGIN);

    http.authorizeRequests()
            .antMatchers("/js/**", "/img/**")
            .permitAll()
            .antMatchers("/**").authenticated()
            .and()
            .csrf().disable()
            .formLogin()
            .loginPage("/login")
            .usernameParameter("email")
            .passwordParameter("password")
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logged-out")
            .and()
            .exceptionHandling()
            .accessDeniedPage("/access-denied")

    ;
}

Это возможно?

1 Ответ

0 голосов
/ 05 июня 2019

Вы можете создать собственную AuthenticationEntryPoint:

https://docs.spring.io/spring-security/site/docs/4.0.4.RELEASE/reference/htmlsingle/#auth-entry-point

AuthenticationEntryPoint будет вызываться, если пользователь запрашивает безопасный ресурс HTTP, но они не аутентифицированы. Соответствующий AuthenticationException или AccessDeniedException будут выброшены перехватчик безопасности вниз по стеку вызовов, вызывая начать метод на точке входа. Это делает работу представления соответствующий ответ пользователю, чтобы можно было начать аутентификацию.

@Component
public class Http401UnauthorizedEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, 
                               AuthenticationException ex)
            throws IOException, ServletException {

        boolean somePath = request.getServletPath().equals("/somePath");

        if(somePath){
            response.sendError(SC_FORBIDDEN, "Access Denied");
        }
        else{
            response.sendRedirect("/login");
        }
    }
}

и зарегистрируйте его в Framework:

http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...