Аутентификация Android с помощью Spring Security 3 - PullRequest
0 голосов
/ 04 августа 2011

У меня есть веб-приложение и 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;
}

Так что все работает нормально.Токен хранится в таблице persitent_logins базы данных сервера, и метод login возвращает токен клиенту.Но как мне использовать токен для дальнейших запросов к другим методам веб-сервиса?

Например, URL-адрес входа в систему безопасности: j_spring_security_check? J_username = "abc" & j_password = "xyz".Есть ли URL-адреса, такие как j_token = "1d3ds"?

Спасибо за помощь, приветствия

Ответы [ 2 ]

0 голосов
/ 14 марта 2013

Позвольте мне попытаться объяснить вам, что здесь происходит:

Когда вы делаете запрос, куки-файлы, в которых хранится токен и тому подобное, хранятся в cookie-хранилище (в памяти) внутри вашего http-клиента. Поскольку вы не используете тот же httpclient при последующих вызовах, эти куки теряются, и каждый раз, когда вы создаете новый httpclient, он поставляется с пустым хранилищем cookie.

У вас есть несколько вариантов здесь:

  1. Повторное использование уже аутентифицированного httpclient
  2. Сохранение файлов cookie для последующего использования с использованием любого метода сохранения в вашем приложении
  3. Сохранение самого cookie-хранилища со всем, что оно содержит cookie, поэтому каждый раз, когда вы создаете новый httpclient, вы устанавливаете для него сохраненное cookie-хранилище.
0 голосов
/ 04 августа 2011

Я думал, что имя пользователя и пароль в URL-адресе даже не используются при поиске ресурса, а только для проверки. Например, www.hello.com/index.html?user="bob "не приведет вас к index.html? User =" bob ", скорее он просто направит вас к index.html. Сервер на hello.com использует user = "bob" в качестве простой проверки.

Я очень новичок, но кажется, что машина, получившая HTTP-запрос с этими учетными данными в GET-запросе, просто проанализирует его.

...