2014-12-16 2 views
3

Nimble 플러그인을 사용하는 기존 Grails 애플리케이션이 있습니다 (따라서 Apache Shiro 보안이 적용됨).RESTful 서비스 (Grails, Shiro)를위한 세션 쿠키를 어떻게 시뮬레이션합니까?

저는 RESTful JSON API를 추가하고 있습니다.

login 방법은 시로에서 세션 ID를 얻기 위해 관리하고 클라이언트에 반환 : 그것은 동일로,

{"sessionId":"61FE89F60F94A4EF7B796783E7A326BC"} 

매우 고무적이다 :이 같은 모습

class ApiController { 
    def login(String username, String password) { 
     def authToken = new UsernamePasswordToken(username, password) 
     SecurityUtils.subject.login(authToken) 

     render(contentType:"text/json") { 
      [ 
       sessionId: SecurityUtils.subject.getSession().getId() 
      ] 
     } 
    } 

    def getData() { 
     SecurityUtils.subject... // either expect to already find a properly populated SecurityUtils.subject or a way to otherwise get it 
    } 
} 

브라우저에서 쿠키가 전달되는 것을 볼 수 있습니다.

Cookie:auth=Z3Vlc3Q6dGx1c2lz; m=2663:t|34e2:|47ba:t|4e99:t|6ef2:t|370d:t|3c0d:t|64b8:t|2a03:t|18c3:t|79d4:chart|640c:small|678e:3600%7C60|796a:t; OX_plg=swf|sl|wmp|shk|pm; _ga=GA1.1.441292120.1405856016; __atuvc=0%7C47%2C0%7C48%2C0%7C49%2C432%7C50%2C17%7C51; JSESSIONID=61FE89F60F94A4EF7B796783E7A326BC 

그러나 이제는 기존의 Nimble/Shiro/Grails/Servlet (어떤 수준인지 확실하지 않음) 인증 필터가 올바른 세션 식별자로이를 인식하고 해당 세션 ID를 세션에 연결하기 위해 모바일 응용 프로그램에서이 JSESSIONID를 제대로 전달하는 방법을 알 수 없습니다. 세션 요청.

val cookie = com.ning.http.client.cookie.Cookie.newValidCookie("JSESSIONID", token, null, token, null, -1, -1, false, false) 
val svc = host/"api"/"getData" addCookie cookie 
Http(svc OK as.String) 

이 나는 ​​또한에 시도 : (newValidCookie에 아마 내 매개 변수가 모두 정확하지 않지만)

내가 수동으로 (안드로이드에 파견 사용) JSESSIONID=<sessionId>와 쿠키를 전달하는 시도했지만 아무런 영향이없는 것으로 나타났다 ;jsessionid=<sessionId>을 URL에 추가하면 아무 것도 수행되지 않습니다.

getData()에서 new Subject.Builder().sessionId(sessionId).buildSubject();을 시도했지만 .sessionId()String을 좋아하지 않았습니다.

지금까지 세션 쿠키의 처리가 정확히 어디에서 발생했는지 알지 못했습니다.

모바일 앱이 웹 클라이언트와 동일한 방식으로 애플리케이션을 사용할 수 있도록 세션 쿠키를 올바르게 조합하려면 어떻게해야합니까?

P. 내 플랜 B는 매 요청마다 인증 헤더에 사용자 이름/비밀번호를 전달하고 ApiController을 매번 subject.login 번 수행하지만, 웹 애플리케이션에 이미 사용 된 세션 ID를 사용하여 수행하는 것이 좋습니다.

+0

뭔가 알아 냈어? 나는 또한 같은 문제에 직면하고있다. –

답변

0

뭔가 사용자 정의 주제 인스턴스 (https://shiro.apache.org/subject.html#custom-subject-instances)

라는 것 같다

두 단계가 있습니다

  1. 스레드와 제목을 연결합니다 (A 빌더) 제목 만들기 (많은

    : 방법)

안된 예를 들어이 작업을 수행하는

Serializable sessionId = //acquired from somewhere 
Subject subject = new Subject.Builder().sessionId(sessionId).buildSubject(); 

ThreadState threadState = new SubjectThreadState(subject); 
threadState.bind(); 
try { 
    //execute work as the built Subject 
} finally { 
    //ensure any state is cleaned so the thread won't be 
    //corrupt in a reusable or pooled thread environment 
    threadState.clear(); 
}