Использование согласования расширения файла с плагином безопасности Spring? - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь использовать последний весенний плагин безопасности для Grails, но я столкнулся с небольшим ударом.

У меня есть контроллер с этим методом:

@Secured(['ROLE_USER'])
def query = {
}

Когда я нажимаю http://localhost:8080/myApp/myController/query, меня просят авторизоваться соответствующим образом. Тем не менее, мне нужно сделать согласование типа контента через расширение имени файла. Использование

grails.mime.file.extensions=true

Я могу использовать те же UrlMappings и добраться до моего метода контроллера через .../myApp/myController/query.js?params=blah. Однако , у меня нет запроса на аутентификацию, и либо запрос проходит автоматически, либо происходит сбой, в зависимости от того, как я установил grails.plugins.springsecurity.rejectIfNoRule

Как я могу использовать согласование типов файлов с плагином безопасности Spring?

Ответы [ 2 ]

0 голосов
/ 23 мая 2013

Решение выше не работает для меня, как ожидалось.Ответ 404 генерируется, когда я запрашиваю URL-адрес с расширением.

Я пришел с другим решением, которое не требует отключения grails.mime.file.extensions и не требует дополнительного фильтра.Это модификация класса плагина org.codehaus.groovy.grails.plugins.springsecurity.AnnotationFilterInvocationDefinition.Вам нужно отредактировать метод determineUrl, как показано ниже (посмотрите на комментарии, чтобы определить изменения):

@Override
protected String determineUrl(final FilterInvocation filterInvocation) {
    HttpServletRequest request = filterInvocation.getHttpRequest();
    HttpServletResponse response = filterInvocation.getHttpResponse();

    GrailsWebRequest existingRequest = WebUtils.retrieveGrailsWebRequest();

    String requestUrl = request.getRequestURI().substring(request.getContextPath().length());

    /** The following 2 lines were added */
    int indexOfPeriod = requestUrl.indexOf('.');
    String requestUrlForMatching = (indexOfPeriod != -1) ? requestUrl.substring(0, indexOfPeriod) : requestUrl;

    String url = null;
    try {
        GrailsWebRequest grailsRequest = new GrailsWebRequest(request, response,
                ServletContextHolder.getServletContext());
        WebUtils.storeGrailsWebRequest(grailsRequest);

        Map<String, Object> savedParams = copyParams(grailsRequest);

        /* Use requestUrlForMatching instead of requestUrl */
        for (UrlMappingInfo mapping : _urlMappingsHolder.matchAll(requestUrlForMatching)) {
            configureMapping(mapping, grailsRequest, savedParams);

            url = findGrailsUrl(mapping);
            if (url != null) {
                break;
            }
        }
    }
    finally {
        if (existingRequest == null) {
            WebUtils.clearGrailsWebRequest();
        }
        else {
            WebUtils.storeGrailsWebRequest(existingRequest);
        }
    }

    if (!StringUtils.hasLength(url)) {
        // probably css/js/image
        url = requestUrl;
    }

    return lowercaseAndStripQuerystring(url);
}

Проблема в том, что URL с расширениями не соответствуют ни одному URL в UrlMappings с использованием UrlMappingsHolder.matchAll метода.Таким образом, решение состоит в том, чтобы опустить расширение перед поиском совпадений.С этими изменениями все работает как положено.

Я также создаю запрос на извлечение с исправлением, доступным в https://github.com/grails-plugins/grails-spring-security-core/pull/24

Вы можете увидеть изменения в https://github.com/arcesino/grails-spring-security-core/commit/19f87168ec4422b4fe06cc6914adeb1bae4b8752

Протестированос версией 1.2.7.3

0 голосов
/ 21 декабря 2011

Выключите grails.mime.file.extensions и добавьте этот фильтр:

class FileExtensionContentNegotiationFilters {
    final static String DEFAULT_FORMAT = "js"
    def filters = {
        all(controller: '*', action: '*') {
            before = {
                addFormatToRequestByFileExtension(request)
            }
            after = {
            }
            afterView = {
            }
        }
    }

    protected addFormatToRequestByFileExtension(def request) {
        String suffix = getSuffixFromPath(request.forwardURI)
        String extension = FilenameUtils.getExtension(suffix)

        if (extension.isEmpty()) {
            request[GrailsApplicationAttributes.CONTENT_FORMAT] = DEFAULT_FORMAT
        }
        else {
            request[GrailsApplicationAttributes.CONTENT_FORMAT] = extension
        }
    }

    protected String getSuffixFromPath(String pathWithoutParams) {
        int lastSlash = pathWithoutParams.lastIndexOf("/")

        if (lastSlash < 0) {
            return ""
        }

        return pathWithoutParams.substring(lastSlash + 1)
    }
}
...