Java AJAX веб-приложение безопасности - PullRequest
1 голос
/ 30 ноября 2009

Я экспериментирую с созданием простого веб-приложения AJAX Java.

Я бы хотел использовать управляемую контейнером безопасность, обеспечиваемую контейнером сервлетов, но, изучив его, я почувствовал, что он не сработает так, как мне бы хотелось. По сути, я хотел бы иметь возможность входа в систему на главной странице, без необходимости пользователю переходить к форме входа.

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

Форма входа в систему на основе формы, предоставляемая контейнером сервлетов, по-видимому, основана на предположении, что пользователь будет перенаправлен на отдельную страницу входа в тот момент, когда он попытается получить доступ к «защищенному» объекту, а это не то, что Я хочу, чтобы это случилось.

Итак, я полагаю, что мне хотелось бы знать, есть ли стандартный способ, позволяющий пользователям входить в одностраничное ajax-приложение с использованием безопасности, управляемой контейнером, или какой-либо сторонней библиотеки? Я собираюсь взглянуть на безопасность Spring, но на первый взгляд кажется, что у меня та же проблема, что и со стандартной безопасностью.

РЕДАКТИРОВАТЬ: нашел это очень полезным, думаю, что это может быть основой моего решения http://www.jroller.com/sjivan/entry/ajax_based_login_using_aceci

Ответы [ 4 ]

0 голосов
/ 02 декабря 2009

ОК - есть базовое решение, я не говорю, что оно лучшее, но похоже, что оно выполнит свою работу.

Это основано на сообщении в блоге Санджива Дживана

http://www.jroller.com/sjivan/entry/ajax_based_login_using_aceci

РЕДАКТИРОВАТЬ: Просто прочитав комментарии к этому сообщению, похоже, что может быть другой способ сделать это, также посту более 3 лет, поэтому не удивлюсь, если есть лучшие решения там, возможно, используя новые функции в Spring или J2EE. Но сейчас я буду придерживаться этого.

Он проделал очень хорошую работу, документировав это там, поэтому я просто прокомментирую здесь, что у меня есть базовый пример, начиная с копирования примера приложения Spring Security., Затем добавляя ServletFilter, как описано Sanjiv.

Поскольку он использовал более раннюю версию Acegi Security (теперь она называется Spring Security), потребовалось одно или два изменения:

Шаблон URL теперь "/j_spring_security_check" (не "/j_acegi_security_check"), и я обнаружил, что мне нужно добавить вход с именем "ajax", чтобы метод isAjaxRequest вернул true - догадываясь, что что-то пропустил в javascript для этого.

Пришлось изменить одну строку в фильтре, чтобы проверить «login_error» вместо «login_error = 1», предполагая, что это изменилось в более новых версиях SpringSecurity. I.E.:

               if (redirectURL.indexOf("login_error") == -1) {  

Также, поскольку я использую jquery, а не прототип, я создал базовую html-страницу с javascript для тестирования с использованием jquery.

Это грубое и готовое на данный момент, отображаемое состояние - просто "url: / msgbrd /" или "error: Bad credentials", но может привести его в порядок достаточно просто.

Если это поможет, вот мой пример index.html:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>
<script type="text/javascript">

var loginOptions = { 
beforeSubmit:  postingLogin,  // pre-submit callback 
success:       showResponse,  // post-submit callback 
    type: 'post',
    url: '/msgbrd/j_spring_security_check'  ,
    clearForm: true
}; 


$(document).ready(function(){
    $('#loginForm').ajaxForm( loginOptions );   
        });


function postingLogin() {
    console.log("Login posting: ");

}
function doneLogin() {

    console.log("Login posted ");
}
function showResponse(responseText, statusText)  { 
    $("#statusMessage").empty();
    $("#statusMessage").append( responseText); 
} 

</script>


</head>
<body>
<h1>msgbrd</h1>
<div>
<form id="loginForm" action="" method="POST">
<p><label for="username"> User Name: </label> <input id="username"
    type="text" name="j_username" class="loginText"></p>

<p><input id="ajax" name="ajax" value="ajax"></input></p>
<p><label for="password"> Password: </label> <input id="password"
    type="password" name="j_password" class="loginText"
    onkeydown="loginOnEnter(event);"></p>

<p><label for="remember_me"> <input id="remember_me"
    type="checkbox" name="_acegi_security_remember_me">Remember Me</label>
</p>


<p><input type="submit" value="Go"></input></p>
<p id="statusMessage"></p>
</form>
</div>
</body>
</html>
0 голосов
/ 30 ноября 2009

Привет, Майк, я иду через тот же процесс - пытаюсь найти лучшие практики для интеграции пакетов безопасности, таких как Spring Security, Apache Shiro и т. Д., В мир ajax.

Из того, что я понимаю до сих пор, в конце дня (независимо от того, какой пакет безопасности вы используете для реализации авторизации и аутентификации), должен быть вызван вызов ajax, который вы делаете для проверки подлинности пользователя. сервлет, который отображает ответ (такой как json или xml), который затем может обрабатывать JavaScript на клиенте и соответствующим образом реагировать на него (отображать встроенную форму входа и т. д.).

Вот поток, как я понимаю:

  1. Первоначальный запрос браузера, пример: http://mysite/homepage
  2. Сервер отображает страницу (используя любой из множество Java-фреймворков доступно, например, просто сервлет, jsp, jsf и т. д. и т. д.)
  3. Отображаемая страница включает в себя библиотека javascript (gwt, jquery, прототип и т. д.)
  4. библиотека JavaScript делает асинхронным запрос. Этот запрос должен быть сделан на URL, где Java-сервлет Контейнер знает, чтобы ответить с помощью JSON и / или XML, а не HTML. Например, http://mysite/ajax/isAuthenticated
  5. JavaScript на клиенте прослушивает ответ.
  6. JavaScript на клиенте анализирует json / xml ответ и либо отображает логин страницы, или переходим к следующему.

Вероятно, существуют сотни комбинаций серверной и клиентской платформ, чтобы помочь с этим. До сих пор я пробовал grails + прототип, grails + jquery, grails + gwt, простые сервлеты + gwt, и в настоящее время изучаю использование Spring MVC + Gwt. Кроме того, за пределами мира Java, я только начал читать о Ruby on Rails (который, как я понимаю, был в основном создан, чтобы упростить эту ajax-связь между клиентом и сервером). Я еще не нашел тот, который действительно работает для меня, поэтому, если вам повезет, пожалуйста, дайте мне знать ваши результаты!

0 голосов
/ 01 декабря 2009

На подобный вопрос ответили на форуме безопасности Spring

http://forum.springsource.org/showthread.php?t=80549

Не так просто, как я надеялся, но похоже, что это хорошее предложение, как только вы освоите Spring Security - я могу оставить вход в систему сейчас и сосредоточиться на других функциях. Обновлюсь здесь, если я доберусь до реализации решения.

0 голосов
/ 30 ноября 2009

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

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

...