Spring boot whitelabel page error для несанкционированного доступа к группе ldap - PullRequest
0 голосов
/ 23 февраля 2019

Я занимаюсь разработкой веб-приложения с весенней загрузкой 2.0.0 и Spring Security 5.0.6, и мне повезло с этим, пока я не добавил некоторую логику, подтверждающую, что пользователь является частью группы LDAP.Если пользователь вводит неверные учетные данные, страница входа снова отображается с ошибкой проверки, но если учетные данные верны, но пользователь не входит в требуемую группу LDAP, приложение перенаправляется на страницу ошибок Whitelabel, которая вместе сэтот заголовок жирным шрифтом показывает это:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Feb 22 18:40:55 EST 2019
There was an unexpected error (type=Forbidden, status=403).
Forbidden

Это правильная ошибка, поэтому я знаю, что аутентификация работает.Но я хочу остаться на странице входа в систему и не перенаправлять, и я не могу понять, как это сделать.

Весь мой метод настройки для моего WebSecurityConfigurerAdapter показан ниже:

   @Override
   protected void configure(HttpSecurity http) throws Exception {
      // Disabling CSRF because it causes issues with API requests (POSTs don't
      // contain the CSRF tokens).
      http.csrf().disable();

      http.headers().frameOptions().disable();

      http.authorizeRequests()

            // This line turns off authentication for all management endpoints, which means all
            // endpoints that start with "/actuator" (the default starter path for management endpoints
            // in spring boot applications).  To selectively choose which endpoints to exclude from authentication,
            // use the EndpointRequest.to(String ... method, as in the following example:
            // .requestMatchers(EndpointRequest.to("beans", "info", "health", "jolokia")).permitAll()
            .requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll()

            // Do not authenticate resource requests
            .antMatchers(
                  "/app/css/**",
                  "/app/img/**",
                  "/app/js/**",
                  "/app/bootstrap/**").permitAll()

            .antMatchers(
                  "/admin/**",
                  "/app/builds/**",
                  "/app/monitor/**",
                  "/app/review/**")
               .hasRole(requiredRole)

            // All other requests are authenticated
            .anyRequest().authenticated()

            // Any unauthenticated request is forwarded to the login page
            .and()
            .formLogin()
            .loginPage(LOGIN_FORM)
            .permitAll()
            .successHandler(successHandler())

            .and()
            .exceptionHandling()
            .authenticationEntryPoint(delegatingAuthenticationEntryPoint())

            .and()
            .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher(LOGOUT_FORM))
            .logoutSuccessUrl(LOGIN_FORM);
   }

Я открыт для критики конструкции всего этого метода, кстати - я взял на себя этот проект, и это ново для меня.Этот код отлично работал до того, как я ввел 6 строк, заканчивающихся на .hasRole (requiredRole), и он все еще работает, пока пользователь входит в обязательную группу.

Я не предоставил источник для некоторыхиз методов, которые вызываются здесь, и я рад вставить их, если кто-то захочет.Я предполагаю, что кто-то, кто хорошо знает этот материал, сразу же обнаружит проблему.

Любой совет будет оценен.

1 Ответ

0 голосов
/ 25 февраля 2019

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

@Controller
public class MyErrorController implements ErrorController {
   private static final String ERROR_PATH = "/error";

   @Autowired
   private ErrorAttributes errorAttributes;

   @RequestMapping(value = ERROR_PATH)
   public String error(WebRequest request, HttpServletRequest httpServletRequest) {
      Map<String, Object> attrs = this.errorAttributes.getErrorAttributes(request, false);

      Integer status = (Integer) attrs.get("status");
      if (status != null && status == 403) {
         httpServletRequest.setAttribute("unauthorized", true);
      }

      return "/app/login";
   }

   @Override
   public String getErrorPath() {
      return ERROR_PATH;
   }
}

Таким образом, всякий раз, когда предпринимается неавторизованная попытка, этот контроллер срабатывает, и условие состояния 403 запускает логическую ветвь в этом методе.Я добавил атрибут запроса «неавторизованный» и перешел на страницу входа в систему JSP, на которую я добавил раздел, который обнаруживает наличие атрибута запроса.Вуаля, у меня все готово.

...