1

我有一个运行 CXF JAX-RS Web 服务的 Spring Security(基于表单的身份验证)Web 应用程序,我正在尝试从一个可以基于每个用户进行身份验证的 Android 应用程序连接到这个 Web 服务。目前,当我向我的 web 服务方法添加 @Secured 注释时,对此方法的所有请求都被拒绝。我试图从 android 调用中传递有效用户/密码的凭据(当前存在于基于 Spring Security 的 Web 应用程序中,并且可以成功登录到 Web 应用程序),但是当 @存在安全注释。调用 getUserPrincipal() 时,SecurityContext 参数返回 null。

如何从可以输入 Spring Security 安全 Web 服务方法的 android 应用程序发出请求?

这是我目前正在使用的代码:

安卓通话:

httpclient.getCredentialsProvider().setCredentials(
          //new AuthScope("192.168.1.101", 80), 
          new AuthScope(null, -1),
         new UsernamePasswordCredentials("joeuser", "mypassword"));

  String userAgent = "Android/" + getVersion();      


  HttpGet httpget = new HttpGet(MY_URI);
  httpget.setHeader("User-Agent", userAgent);
  httpget.setHeader("Content-Type", "application/xml");

  HttpResponse response;

  try {
      response = httpclient.execute(httpget);
      HttpEntity entity = response.getEntity();

      ... parse xml

网络服务方法:

@GET
@Path("/payload")
@Produces("application/XML")
@Secured({"ROLE_USER","ROLE_ADMIN","ROLE_GUEST"})
public Response makePayload(@Context Request request, @Context SecurityContext securityContext){

         Payload payload = new Payload();
         payload.setUsersOnline(new Long(200));

            if (payload == null) {
                return Response.noContent().build();
            }
            else{
                 return Response.ok().entity(payload).build();
            }

 }
4

1 回答 1

1

我确实解决了这个问题。就我而言,问题是我错误地在 Spring Security 中已经从 Spring Security xml 文件中的拦截 url 模式中的配置中跟踪的方法上添加了安全注释。

毕竟说了又做了,它非常简单而且效果很好。唯一的技巧是您的 Android 客户端必须创建一个静态 DefaultHttpClient,使用该客户端调用您网站的登录 servlet,然后使用相同的 httpClient 实例进行所有后续调用。然后,您的 android 请求可以输入安全方法、维护会话并被视为任何普通用户。

我最初的问题中的以下代码是多余的,我根本不使用它: httpclient.getCredentialsProvider().setCredentials( ... 正如所逃避的那样,我也没有使用安全注释,因为我将我的 url 保护在一个 xml 文件中。

于 2010-05-08T04:42:53.377 回答