2011-08-04 17 views
0

私はwebapplicationとAndroidクライアントを持っています。私は安全なログイン方法を実装したいと思います。私は、Webサービスメソッドにリクエストを送信し、クライアントから:Spring Security 3でのAndroid認証

@POST 
@Produces(MediaType.TEXT_PLAIN) 
@Path("/login") 
public String login(String credentials) { 
    JSONObject jo = null; 
    String name = ""; 
    String password = ""; 
    try { 
     jo = new JSONObject(credentials); 
     name = jo.getString("name"); 
     password = jo.getString("password"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    HttpResponse r = springSecurityCheck(name, password); 
    for (Header h : r.getAllHeaders()) { 
     System.out.println(h.getName() + " " + " " + h.getValue() + ""); 
    } 

    String s = r.getFirstHeader("Location").toString(); 
    boolean isError = s.contains("login_error"); 

    if (!isError) { 
     Header[] cookies = r.getHeaders("Set-Cookie"); 
     for (int i = 0; i < cookies.length; i++) { 
      if (cookies[i].toString().contains(
        "SPRING_SECURITY_REMEMBER_ME_COOKIE")) { 
       String[] cookie = cookies[i].toString().split("="); 
       String token = cookie[1].substring(0, 
         cookie[1].indexOf(";")); 
       if (token != null) { 
        return "token:" + token; 
       } 
      } 
     } 
    } 
    System.out.println(" ----- Login from" + name 
      + " failed----- "); 
    return "newLogin"; 

} 

springsecuritycheckには、以下のん:

public HttpResponse springSecurityCheck(String name, String password) { 

    DefaultHttpClient client = new DefaultHttpClient(); 
    HttpPost requestLogin = new HttpPost(
      "http://mywebapp.com/j_spring_security_check?"); 
    HttpResponse response = null; 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("j_username", name)); 
    params.add(new BasicNameValuePair("j_password", password)); 
    params.add(new BasicNameValuePair("_spring_security_remember_me","true")); 
    try { 
     requestLogin 
       .setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
     response = client.execute(requestLogin); 
     return response; 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

だから、すべてが正常に動作します。トークンはserverdataベースのpersitent_loginsテーブルに格納され、loginmethodはトークンをクライアントに返します。しかし、他のWebサービスメソッドへのさらなるリクエストにトークンを使用するにはどうすればよいですか?

たとえば、springsecurityログインURLは、j_spring_security_check?j_username = "abc" & j_password = "xyz"です。 j_token = "1d3ds"のようなURLはありますか?あなたの助け 挨拶

答えて

0

ため

おかげで私は、URLにユーザー名とパスワードがさえいうだけで、検証のために、リソースを見つけるに使用されていないと思いました。たとえば、www.hello.com/index.html?user="bob "はindex.htmlに移動しませんか?user =" bob "ではなく、index.htmlに誘導します。 hello.comのサーバはuser = "bob"を単なる検証として使用します。

私は非常に初心者ですが、GETリクエスト内のこれらの資格情報でHTTPリクエストを受信したマシンのように見えるだけです。

+0

はい、そうです。ユーザー名またはトークンは検証のためのものです。しかし、それにもかかわらず、私はこのトークンで何かをして、どのユーザーからリクエストが来るのかを検証する必要があります。しかし、私はどのように知りません... –

0

私はここで何が起こっているのか、あなたに説明してみましょう:あなたが要求を行うと、トークンと、そのようなを保存するクッキーは、HTTPクライアントの内側(メモリ内)は、cookiestoreに

保存されます。後で呼び出すときに同じhttpclientを使用しないので、それらのクッキーは失われています。新しいhttpclientを作成するたびに、cookieestoreが空になります。

あなたはここで、いくつかのオプションがあります。

  1. がすでに認証HTTPClientのすべてでは、cookiestore自体の保存、アプリケーション
  2. に持続性のいずれかの方法を使用して、後で使用するためにクッキーを保存
  3. それはだ含むクッキーを再利用します新しいHTTPクライアントを作成するたびに、保存したcookiestoreを設定します。
関連する問題