Контроллер Grails и магия отображения URL

Grails 3.0.1 здесь. Я хочу создать определенную структуру URL / контроллера. Мое приложение развертывается в корневом контексте (/), то есть локально оно работает как http://localhost:8080, а нелокально как http://someserver.example.org.

Я хочу, чтобы все в /app/* было аутентифицировано и считалось частью «основного приложения» (требуется вход в систему). Все, что находится за пределами этого URL-адреса, считается частью общедоступного веб-сайта (не аутентифицировано). Однако я хочу, чтобы сам /app/ был просто своего рода заполнителем; Я не хочу, чтобы это был контроллер Grails. Следовательно:

  • http://localhost:8080/app можно настроить (UrlMappings?) Для отображения страницы входа
  • http://localhost:8080/app/<controller>/<action> следует типичному костюму контроллера / действия Grails и будет вызывать правильное действие контроллера.

Следовательно, http://localhost:8080/app/order/create будет аутентифицирован и при входе в систему вызовет действие OrderController#create, которое может отобразить createOrder.gsp.

Мне интересно, для чего нужен подход Grails 3.x:

  1. Разрешение существования /app/, но не в качестве контроллера (как я уже сказал, возможно, просто перенаправление / отображение на страницу входа в систему)
  2. Разрешение всему, что ниже /app/, следовать парадигме контроллера / действия

Мысли о том, как это реализовать?


Обновлять

class UrlMappings {
    static mappings = {
        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }

        "/app/$controller/$action?/$id?" {
            ???
        }

        "/"(view:"/index")
        "500"(view:'/error')
        "404"(view:'/notFound')
    }
}

person smeeb    schedule 29.04.2015    source источник


Ответы (1)


В Grails есть возможность объявлять пространства имен для контроллеров. При этом вы можете поместить все свои контроллеры в пространство имен app, что должно привести именно к вашему второму вопросу. Дополнительные сведения см. В документации.

Затем ограничение безопасности выполняется с помощью обычных настроек безопасности пружины (например, @Secured).

person Mario David    schedule 29.04.2015
comment
Спасибо, @Mario David (+1). Я думаю, что это ставит меня в точку, но могу ли я просто поместить следующее объявление в каждый контроллер: static namespace = 'app', или мне придется что-то делать с UrlMappings.groovy? Не могли бы вы дать мне быстрый пример псевдокода? Спасибо еще раз! - person smeeb; 29.04.2015
comment
поскольку я немного думаю об этом, нет необходимости даже использовать функцию пространства имен. Потому что это полезно, только если у вас разные пространства имен. На самом деле вы хотите определить еще один UrlMapping, помимо обычного, например: "/app/$controller/$action?/$id?". При этом вам не нужно использовать пространства имен, потому что нет разных пространств имен для одного и того же имени контроллера. - person Mario David; 29.04.2015
comment
Еще раз спасибо @Mario David (+1) - пожалуйста, посмотрите мое обновление и фрагмент кода. Я верю, что сделал то, что вы предлагаете, если да: (1) зачем оставлять нормальное / исходное сопоставление на месте (чего это позволяет)? (2) Что дает это новое сопоставление (why / app /)? И (3) Что я поставил в качестве тела вместо ???? Спасибо еще раз! - person smeeb; 29.04.2015
comment
Есть ли у вас контроллеры, к которым вы хотите быть доступны не через /app/**? Если это так, я бы явно сделал UrlMapping для этих контроллеров. Затем вы можете заменить общее сопоставление "/$controller/$action?/$id?(.$format)?" на "/app/$controller/$action?/$id?(.$format)?", а затем добавить контроллеры, не относящиеся к приложениям, например: "/customers" (resources: "customer"). ??? можно заполнить потенциальными ограничениями или удалить его. - person Mario David; 01.05.2015