Как динамически генерировать URL-адреса, используемые grails.plugins.springsecurity? - PullRequest
1 голос
/ 17 июня 2011

Это не один из простых вопросов .. Итак, позвольте мне объяснить это подробно ...

Фон : В моем приложении Grails у меня есть это отображение:

class UrlMappings {
    static mappings = {
        "/$storeId/$controller/$action?/$id?"
        ...
    }
}

Это означает, что все URL, которые будет обрабатывать мое приложение, имеют предшествующий параметр url "storeId". Все контроллеры будут использовать этот параметр для визуализации содержимого и выполнения других действий ...

Также у меня есть контроллер с аннотацией

@Secured(['IS_AUTHENTICATED_REMEMBERED'])
class SomeController {
    def index = {   
        // ...
    }
}

Допустим, пользователь пытается получить доступ к этой странице:

/555/some/index

Если это не прошедший проверку подлинности пользователь, плагин безопасности перенаправит его на

/login/auth

Проблема : Когда spring-security перенаправит на эту страницу, пользователь увидит 404. Это происходит потому, что контроллер входа в систему будет обрабатывать только URL-адреса, такие как

/555/login/auth

Вопрос : Что я должен сделать, чтобы динамически создать этот URL?

приписка Оказывается, что:

  • Существует параметр конфигурации для Spring-Security, называется "Auth.loginFormUrl". Но это только статический текст И мне нужно построить это URL, основанный на том, что URL повлиял на это Перенаправление
  • Перенаправление выполнено (я не на 100% обязательно) в org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint # начало. Но как это переопределить?

1 Ответ

2 голосов
/ 17 июня 2011

Обычно это статическое значение, но оно вызывается из LoginUrlAuthenticationEntryPoint.getLoginFormUrl(), так что вы можете создать его подкласс и выполнить динамический расчет URL в переопределенном методе.Плагин уже подклассифицирует его на org.codehaus.groovy.grails.plugins.springsecurity.AjaxAwareAuthenticationEntryPoint, поэтому вы должны расширить его.

Чтобы зарегистрировать свою реализацию вместо плагинов, добавьте переопределение bean-компонента в grails-app/conf/spring/resources.groovy:

import com.yourcompany.yourapp.YourAuthenticationEntryPoint
beans = {
   authenticationEntryPoint(YourAuthenticationEntryPoint) {
      loginFormUrl = '/login/auth' // has to be specified even though it's ignored
      ajaxLoginFormUrl = '/login/authAjax'
      portMapper = ref('portMapper')
      portResolver = ref('portResolver')
   }
}

Вы наделеныУ этого метода нет прямого доступа к запросу, но он доступен в локальном потоке - вызов org.codehaus.groovy.grails.plugins.springsecurity.SecurityRequestHolder.getRequest().

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