У меня есть весеннее веб-приложение, использующее настроенный 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;
}