【问题标题】:Android Authentication with Spring Security 3使用 Spring Security 3 进行 Android 身份验证
【发布时间】:2011-10-19 18:17:39
【问题描述】:

我有一个 web 应用程序和一个 android 客户端。我想实现一个安全的登录方法。从客户端我向 webservice 方法发送请求:

@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;
}

所以一切正常。令牌存储在服务器数据库的 persitent_logins 表中,登录方法将令牌返回给客户端。但是如何使用令牌进一步请求其他 Web 服务方法?

例如springsecurity登录url为j_spring_security_check?j_username="abc"&j_password="xyz"。有没有像 j_token="1d3ds" 这样的网址?

感谢您的帮助 问候

【问题讨论】:

    标签: android web-services login spring-security client


    【解决方案1】:

    我认为 URL 中的用户名和密码甚至没有用于定位资源,而只是用于验证。例如,www.hello.com/index.html?user="bob" 不会将您带到 index.html?user="bob",而只会将您定向到 index.html。 hello.com 的服务器仅使用 user="bob" 作为验证。

    我是个新手,但似乎任何机器在 GET 请求中收到带有这些凭据的 HTTP 请求都会将其解析出来。

    【讨论】:

    • 是的,没错。用户名或令牌用于验证。但是尽管如此,我还是必须对这个令牌做一些事情,以验证请求来自哪个用户。但我不知道怎么...
    【解决方案2】:

    让我试着向你解释这里发生了什么:

    当您发出请求时,存储令牌等的 cookie 将存储在 http 客户端内的 cookiestore(内存中)中。由于您在以后的调用中没有使用相同的 httpclient,因此这些 cookie 会丢失,并且每当您创建新的 httpclient 时,它都会带有一个空的 cookiestore。

    你有几个选择:

    1. 重用已经过身份验证的httpclient
    2. 使用应用程序中的任何持久性方法保存 cookie 以供以后使用
    3. 保存 cookiestore 本身和它包含的所有 cookie,因此无论何时创建新的 httpclient,都将保存的 cookiestore 设置为它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 2012-11-27
      • 2011-10-17
      • 2018-08-09
      • 2012-11-10
      • 2017-04-15
      • 2011-08-14
      相关资源
      最近更新 更多