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

标签 android web-services spring-security cxf

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

如何从可以进入 Spring Security 安全网络服务方法的 Android 应用发出请求?

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

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();
            }

 }

最佳答案

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

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

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

关于android - 如何从可以输入 Spring Security 安全 Web 服务方法的 Android 应用发出请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2259110/

相关文章:

java - 测试时忽略 Spring Controller 上的 PreAuthorize 注释

spring-security - Spring boot 安全性 禁用安全性

android - Android 上的蓝牙 : StartDiscovery not working. 无法扫描设备

Android:需要更快的方式来显示字节数组中的 RGB565 位图

android - 即使在Android内核中启用usbmon后也没有USB总线文件?

.net - 使用 Android 调用 .NET Webservice

java - 运行Java应用程序以在tomcat服务器上运行

java - 在测试中调用 spring-security-crypto 的加密器时出现 IllegalArgumentException

安卓NDK : gdb crashes when connecting

c# - 如何使用 JMeter 测试 WCF Web 服务?