2009-11-30 3 views
1

간단한 AJAX Java 웹 애플리케이션을 만들려하고 있습니다.Java AJAX webapp security

서블릿 컨테이너에서 제공하는 컨테이너 관리 보안을 사용하고 싶지만 조사한 결과 어떻게 작동하는지 알 수없는 느낌이 들었습니다. 기본적으로 사용자가 로그인 폼으로 이동하지 않고도 메인 페이지에 로그인 프롬프트를 표시 할 수 있기를 원합니다.

예를 들어 간단한 메시지 보드 응용 프로그램을 상상해보십시오. 새 메시지를 게시하려는 사용자는 화면의 양식에 텍스트를 직접 입력합니다. 제출 단추를 누르면오고 싶습니다. ajax 호출을 사용하여 사용자가 이미 로그인했는지 확인한 다음 동일한 페이지에 로그인 div를 표시하여 사용자가 별도의 로그인 페이지로 이동하지 않고 로그인 할 수있게하려고합니다.

서블릿 컨테이너가 제공하는 양식 기반 로그인은 사용자가 "보안"된 항목에 액세스하려고 시도 할 때 별도의 로그인 페이지로 리디렉션된다고 가정합니다 내가 뭘하고 싶은지.

컨테이너 관리 보안 또는 일부 타사 라이브러리를 사용하여 단일 페이지 아약스 응용 프로그램 내에서 사용자가 로그인 할 수 있도록하는 표준 방법이 있다면 제가 알고 싶습니다. 나는 봄 보안을 살펴볼 것인데, 언뜻보기에는 표준 보안과 동일한 문제가있는 것 같다.

편집 :이 매우 유용 발견, 그것은 http://www.jroller.com/sjivan/entry/ajax_based_login_using_aceci

답변

0

내가 과거에 봄 보안을 사용했습니다 내 솔루션의 기초가 될 수있다 생각하고, 나는 특히이 작업을 수행하는 데 사용하지 않은 반면, 기억 그것은 매우 플러그 가능했다. 사용자가 인증되지 않은 경우 취해야 할 고전적인 조치는 로그인 양식 페이지로 리디렉션하는 것이지만, 제공된 여러 클래스 중 하나를 사용하여이 경우 행동을 변경하거나 자신의 글을 작성하는 것은 매우 쉽습니다. 원하는 (이 경우에는 보이는대로 적절한 AJAX 응답을 반환하십시오).

구현해야하는 논리는 기존의 이유로 꽤 끔찍했기 때문에 특별한 번거 로움없이 해결할 수있었습니다. 나는 Spring Security가이 점에서도 작동하도록 할 수 있다는 것을 의심하지 않습니다. (여러분이 이미 요구 사항에 맞는 클래스를 가지고 있다면 놀라지 않을 것입니다.)

+0

확인 - 빠른 답장을 보내 주셔서 감사합니다, 나는 조사하고 다시보고합니다 –

0

안녕하세요. Mike, Spring Security, Apache Shiro 등과 같은 보안 패키지를 아약스 세계에 통합하는 모범 사례를 알아 내려고합니다.

지금까지 (승인 및 인증을 구현하는 데 사용하는 보안 패키지와 상관없이) 하루가 끝날 때 사용자가 인증되었는지 확인하기 위해 작성한 ajax 호출은 클라이언트의 자바 스크립트가 처리하고 적절히 대응할 수있는 응답 (예 : json 또는 xml)을 렌더링하는 서블릿을 호출합니다 (로그인 양식 인라인 표시 등).

  1. 초기 브라우저 요청 예 : http://mysite/homepage
  2. 서버 예를 들어, 자바의 과다가 가능한 프레임 워크 중 하나를 사용하여 (페이지를 렌더링, 간단한 여기

    내가 그것을 이해 흐름이다 서블릿, jsp, jsf 등)
  3. 렌더링 된 페이지 자바 스크립트 라이브러리 (gwt, jquery, 프로토 타입 등)의 일종을 포함합니다.
  4. 자바 스크립트 라이브러리가 비동기로 만듭니다 요청. 이 요청은 java 서블릿 컨테이너가 json 및/또는 xml 대신 html로 응답하는 것으로 알고있는 url에 대해 으로 만들어야합니다. 예 : http://mysite/ajax/isAuthenticated
  5. 자바 스크립트 클라이언트 응답 응답합니다.
  6. 자바 스크립트에서 클라이언트는 json/xml 응답을 구문 분석하고 로그인 페이지를 표시하거나 다음으로 계속 진행합니다.

여기에는 수백 가지의 서버 측 + 클라이언트 측 프레임 워크 조합이 있습니다. 지금까지 grails + prototype, grails + jquery, grails + gwt, 간단한 서블릿 + gwt를 시도했으며, 현재 Spring MVC + Gwt를 사용하고 있습니다. 또한 자바 세계 외부에서 Ruby on Rails에 대해 읽었습니다. (기본적으로 클라이언트와 서버 간의 아약스 커뮤니케이션을 쉽게하기 위해 만들어졌습니다.) 나는 아직 정말로 나를 위해 일하는 것을 찾지 못했다. 그래서 운이 있다면, 나에게 결과를 알려줘!

0

는 비슷한 질문은 내가 기대만큼 straighforward 봄 보안 포럼

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

여부에 대한 답이 발견하지만 당신은 봄 보안과 속도까지있어 일단 좋은 제안처럼 보인다 - 나는 지금 로그온을 떠나고 다른 기능에 집중할 것입니다. 해결책을 구현하는 경우 여기에서 업데이트됩니다.

0

확인 - 기본 솔루션이있어, 최선을 말하지는 않지만 작업을 수행 할 것처럼 보입니다. Sanjiv Jivan하여 블로그 게시물을 기반으로

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

편집 : 단지 그것을 할 수있는 또 다른 방법이있을 수 있습니다 것 같습니다 해당 게시물에 대한 의견을 읽고 데, 또한 포스트는 3 거기에 더 나은 솔루션이 있다면 어쩌면 놀라지 않을 것입니다. 아마도 Spring이나 J2EE의 새로운 기능을 사용했을 것입니다. 하지만 지금은 이걸 고수 할거야.

그는 여기에 문서화 작업을 잘 했으므로 Spring Security 샘플 애플리케이션을 복사하여 시작하는 예제를 얻었습니다. 그런 다음 Sanjiv에서 설명한 ServletFilter를 추가하십시오. .

그는이 필요 하나 또는 두 가지 변화가 있었다 (지금은 봄 보안라고도 함) Acegi Security는 이전 버전의 사용되면서

:

URL 패턴이 지금을 "/j_spring_security_check"(안 "/j_acegi_security_check"), 그리고 내가 발견 사실을 반환하는 isAjaxRequest 메서드를 얻으려면 "ajax"라는 입력을 추가해야했습니다. 자바 스크립트에서 뭔가 빠졌다고 추측합니다.

"login_error = 1"대신 "login_error"가 있는지 확인하기 위해 필터의 한 줄을 변경해야합니다. 이는 새로운 버전의 SpringSecurity에서 변경된 내용을 추측합니다. 즉 : 또한

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

내가 jQuery를 사용하여 테스트 자바 스크립트와 기본 HTML 페이지를 만든 프로토 타입을하지 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>