Отказано в доступе с помощью Spring Security - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть весеннее веб-приложение, использующее настроенный AccessDecisionVoter.Этот пользователь, принявший индивидуальное решение, найдет необходимое разрешение для доступа к URL-адресу, а затем проверит, предоставил ли пользователь, выполняющий вход в систему, требуемое разрешение.

Если пользователь, имеющий вход в систему, не получил требуемого разрешения, тогда это пользовательское решениеизбиратель должен вернуть ACCESS_DENIED, в противном случае он должен возвратить ACCESS_GRANTED.

Теперь проблема заключается в следующем: когда пользователь пытается получить доступ к URL-адресу, для которого ему не предоставлено разрешение, сервер приложений получает HTTP 405. Обратите внимание, что когдаПользователь получит доступ к URL-адресу через метод GET (например, введет URL-адрес в адресную строку браузера), он получит HTTP 403. HTTP 405 встречается только методом POST.Обратите внимание, что мой контроллер spring-mvc не ограничивает метод HTTP.

Я подтверждаю, что избиратель, принимающий решение, возвращает ACCESS_DENIED (-1) на основании моего файла журнала.Каким-то образом мой браузер только что получил HTTP 405.

Я использую spring-security 5.0.1

Ниже приведены мои коды:

мое индивидуальное решениеизбиратель:

@Override
public int vote(Authentication authentication, Object object, Collection securityConfigs) {
    logger.debug("Authorization in progress");
    if (authentication == null) {
        logger.info("No authentication. Access Denied.");
        return ACCESS_DENIED;
    }

    if (securityConfigs.size() == 0) {
        logger.info("No matching Page Config found for the given URL. Access Denied.");
        return ACCESS_DENIED;
    }

    int result = ACCESS_ABSTAIN;
    Set<String> authorities = extractAuthorities(authentication);

    String username = authentication.getName().toUpperCase();
    logger.debug("authentication.getName() = " + username);

    for (Object configObject : securityConfigs) {
        SecurityConfig config = (SecurityConfig) configObject;
        if (this.supports(config.getAttribute())) {
            result = ACCESS_DENIED;
            String attributeUpperCase = config.getAttribute().toUpperCase();
            logger.debug("config attribute = " + attributeUpperCase);

            if (authorities.contains(attributeUpperCase)) {
                logger.info("The request url has config attribute that matches the login user's granted Master Function Code. Access Granted. The matching config attribute = " + attributeUpperCase);
                return ACCESS_GRANTED;
            }
        }
    }

    logger.info("Voting Result from DaxVoter = " + result);

    return result;
}

Мой контроллер:

@ResponseBody
@RequestMapping(value ="/road/retrieveRoad.do")
public Map<String, Object> retrieveRoad(HttpServletRequest request, @RequestBody DataParamsBean dataParams) {
    logger.info("CommonSupportCtrl | retrieveRoad | Start"); 
    Map<String, Object> resultMap = new HashMap<String, Object>();

    int start = dataParams.getSkip();
    int limit = (dataParams.getTake() == 0) ? 10 : (int) dataParams.getTake();
    String sortBy = (dataParams.getSorted() == null) ? null : (String) dataParams.getSorted().get(0).get("name");
    String sortDirection = (dataParams.getSorted() == null) ? null : (String) dataParams.getSorted().get(0).get("direction");
    String roadCode = dataParams.getParams().get("id") == null ? null : (String) dataParams.getParams().get("id");
    String roadName = dataParams.getParams().get("roadName") == null ? null : (String) dataParams.getParams().get("roadName");

    if(sortDirection != null) {
        if(sortDirection.equalsIgnoreCase("ascending")) {
            sortDirection = "asc";
        } else {
            sortDirection = "desc";
        }
    }

    GenericSearchResults<RoadBean> searchResults = commonSupportService.retrieveRoadByCriteria(roadName, roadCode, start, limit,
            sortBy, sortDirection);

    resultMap.put("result", searchResults.getResult());
    resultMap.put("count", searchResults.getCount());

    logger.info("CommonSupportCtrl | retrieveRoad | End"); 
    return resultMap;
}

1 Ответ

0 голосов
/ 11 апреля 2019

Мне удалось это решить.Это на самом деле из-за того, что я настроил в web.xml.Я решаю ее, меняя страницы с ошибками с .htm на .jsp, просто меняя формат файла, не меняя содержимого вообще.Поэтому я предполагаю, что .htm просто НЕ МОЖЕТ поддерживать метод POST, в то время как .jsp может.

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