Как вызвать Spring Security Provider? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть веб-приложение, которое я перевожу на Grails 3.3.9 (из Grails 2.3.11). Текущая версия приложения использует Spring Security LDAP для аутентификации (пользователь видит форму входа в систему, когда пытается получить доступ к сайту, и вводит имя пользователя и пароль). Более новая версия приложения будет использовать плагин Spring Security SAML для аутентификации (обычно называемый Single Sign On).

У меня работает система единого входа (SSO), однако страница входа в систему единого входа доступна только тогда, когда пользователь находится в нашем офисе (имеет определенный IP-адрес). В тех случаях, когда пользователь не в нашем офисе (имеет IP-адрес не в нашей сети). Я хотел бы, чтобы у пользователя была возможность войти с помощью формы входа Spring Security LDAP.

Я вроде как потерял, как это сделать. Из информации, которую я собрал, мне нужно определить своего провайдера безопасности в application.groovy (я использовал провайдеров Spring Security по умолчанию, так как они, похоже, выполняют свою работу индивидуально). Однако я не понимаю, как мне сказать Grails, какой из двух методов входа использовать для каждого пользователя. В моем случае это будет проверка IP-адреса пользователя (для которого у меня уже есть код), но как мне тогда сказать, например:

if(ipAddress matches internalIPRange) use samlAuthenticationProvider
else{use ldapAuthProvider}

Вот провайдер, настроенный в application.groovy

grails.plugin.springsecurity.providerNames = ['samlAuthenticationProvider', 'ldapAuthProvider', 'daoAuthenticationProvider', 'anonymousAuthenticationProvider']

Также я не знаю, как на самом деле вызвать провайдера вручную (что-то вроде provider.invoke(), если бы мне пришлось угадывать).

1 Ответ

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

Кажется, это довольно легко реализовать.

Вы расширяете ExceptionTranslationFilter примерно так:

class IpAwareExceptionTranslationFilter extends ExceptionTranslationFilter {

  AuthenticationEntryPoint ldapAuthenticationEntryPoint

  @Override
  void sendStartAuthentication(HttpServletRequest request,
        HttpServletResponse response, FilterChain chain,
        AuthenticationException reason) throws ServletException, IOException {
      SecurityContextHolder.context.authentication = null
      requestCache.saveRequest request, response
      logger.debug 'Calling Authentication entry point.'
      if( isAllowedIpAddress( request ) )
        authenticationEntryPoint.commence request, response, reason // default SAML
      else
        ldapAuthenticationEntryPoint.commence request, response, reason // LDAP
  }
}

Затем вы объявляете свой фильтр как bean в resources.groovy:

beans = {

  exceptionTranslationFilter( IpAwareExceptionTranslationFilter ){
    authenticationEntryPoint = new LoginUrlAuthenticationEntryPoint( '/saml/login' )
    ldapAuthenticationEntryPoint = new LoginUrlAuthenticationEntryPoint( '/ldap/login' )
  }

}

и он должен заменить значение по умолчанию exceptionTranslationFilter в цепочке фильтров.

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