2013-06-03 4 views
2

Я искал учебники по этим темам, но все они устарели. Может ли кто-нибудь предоставить мне какие-либо ссылки или примеры интеграции Spring безопасности в GWT?Интеграция GWT с системой безопасности Spring

+0

Ниже приведено обсуждение одной страницы входа в систему для GWT - см. Мои комментарии для принятого ответа. У меня нет фрагментов кода прямо здесь, но я постараюсь предоставить вам их сегодня вечером. http://stackoverflow.com/questions/6508238/gwt-authentication-for-some-part-of-application-using-gwt-login-page –

+0

Рассмотрите [это] (http://stackoverflow.com/questions/13914547/gwt-spring-security-integration-pure-gwt-no-jsp/13934318 # 13934318) ответьте, если вы заинтересованы в применении безопасности для методов на стороне сервера –

+0

@PiotrekDe Я буду ждать фрагментов кода ур, спасибо – Olzhas

ответ

3

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

Решение не очень простое, но я не мог бы сделать это лучше, но любые предложения по уточнению приветствуются.

Необходимо начать с создания GWT ServiceLayerDecorator, который соединит мир фабрики запросов с миром весны. Переписать createServiceInstance метод, принимая имя класса пружинных служб, которая будет вызвано из значения аннотаций ServiceName и вернуть экземпляр этой службы (вам необходимо получить его с весны ApplicationContext):

final Class<?> serviceClass = requestContext.getAnnotation(ServiceName.class).value(); 
return appContext.getBean(serviceClass); 

Кроме того, вы должны переопределить суперкласс invoke(Method, Object...) метода в чтобы поймать все выброшенные исключения времени выполнения. Исследуемая причина исключения должна быть проанализирована, если это экземпляр Spring Security AccessDeniedException. Если это так, следует исключить причину исключения. В этом случае GWT не будет сериализовать исключение в строку, но снова его восстановить, поэтому сервлет диспетчера может справиться с этим, установив соответствующий код состояния HTTP-ответа. Все остальные типы исключений будут сериализованы GWT в String.

На самом деле вы можете поймать только GWT ReportableException, но, к сожалению, у него есть модификатор доступа к пакету (хе ... GWT не так легко расширяем). Захват всех исключений во время выполнения намного безопаснее (althouth не очень изящный, у нас нет выбора) - если реализация GWT изменится, этот код все равно будет работать нормально.

Теперь вам нужно подключить ваш декоратор. Вы можете сделать это легко за счетом расширения запроса заводского сервлета и определения ваш: сервлет конструктора следующим образом:

public MyRequestFactoryServlet() { 
    this(new DefaultExceptionHandler(), new SpringServiceLayerDecorator()); 
} 

Последней вещи - вам нужно сделать грязный хак и перезаписать запрос завода сервлет метода doPost изменяя способ, как она обрабатывает исключения - по умолчанию исключение сериализуется в строку, а сервер отправляет 500 код состояния. Не все исключения должны приводить к 500 с.с - например, исключения безопасности должны приводить к несанкционированному коду состояния. Так что вам нужно сделать, это переписать механизм обработки исключений следующим образом:

catch (RuntimeException e) { 
    if (e instanceof AccessDeniedException) { 
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } else { 
    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
    LOG.log(Level.SEVERE, "Unexpected error", e); 
    } 
} 

Вместо расширения классов, вы можете попробовать использовать некоторые «вокруг» аспекты - это чистое решение в этом случае.

Вот и все! Теперь вы можете аннотировать свой уровень сервисов как обычно с помощью аннотаций Spring Security (@Secured и т. Д.).

Я знаю - все сложно, но фабрика запросов Google вряд ли расширяется. Ребята отлично поработали над протоколом связи, но дизайн этой библиотеки просто ужасен. Конечно, клиентский код имеет некоторые ограничения (он скомпилирован в java-скрипт), но серверный код может быть разработан намного лучше ...

+0

сегодня один Идея пришла мне в голову, как вы думаете, если я проверю данные авторизации, до того, как метод сервлетов GWT будет реализован, проверьте, что пользователь whethear является анонимным или нет, если это анонимный метод возвращает null, на стороне клиента мы можем получить null в результате и перезагрузить страницу. Например, в сервлете GWT в каждом методе будет проверяться аутентификация auth = SecurityContextHolder.getContext(). getAuthentication(); если он не аутентифицирован, то верните нуль или любую информацию на клиентскую сторону и обработайте ее поверх них. Является ли идея жизнеспособной для реализации? – Olzhas

Смежные вопросы