当前位置: 首页 > 面试题库 >

如何针对启用了JAAS的Web服务器使用Jersey客户端进行身份验证?

司空瑾瑜
2023-03-14
问题内容

我有以下情况:

服务器:码头(已配置JAAS)

客户端:Jersey通过JUnit调用(通过Maven)

我在Web服务器中设置了JAAS。我正在使用客户端部分作为测试。

在服务器端,用户通过具有JAAS处理的基本身份验证的表单进行身份验证。显然,用户必须先经过身份验证才能查看某些页面。

我希望能够在尝试访问安全页面之前通过泽西岛登录。如何才能做到这一点?我已经检查过您可以定义一个过滤器,但是我不确定如何使用它。并且-
一旦用户通过表单登录,我如何才能(从客户端)转到我真正感兴趣的页面?

如果有人可以向我展示一个如何使用Jersey在客户端进行此操作的示例,我将非常感激。

我有以下JUnit测试用例方法:

@Test
public void testLogin()
        throws IOException
{
    String URL_LOGIN = "http://localhost:9080/foo/auth.html";
    Client client = Client.create();

    String username = "me";
    String password = "me";

    final HTTPBasicAuthFilter authFilter = new HTTPBasicAuthFilter(username, password);
    client.addFilter(authFilter);
    client.addFilter(new LoggingFilter());

    WebResource webResource = client.resource(URL_LOGIN);
    // I even tried:
    // webResource.header("Authorization", "Basic " + "base64encoded_userid:password").type("application/xml");

    String page = webResource.post(String.class);

    System.out.println(page);
}

请注意:

1)http:// localhost:9080 / foo /
auth.html
是成功通过身份验证后应该看到的页面。

2)我实际上看到了http:// localhost:9080 / foo /
login.html的输出。

3)显然,通过浏览器,我可以通过login.html页面成功登录。

我似乎在这里错过了什么?


问题答案:

使用基本身份验证,您根本不需要进入任何登录页面。如果服务器配置为使用基本身份验证,那么如果在请求中包含基本身份验证标头,则可以向任何受保护的页面发出请求。Jersey过滤器可以解决这一问题。因此,如果基本身份验证确实是服务器正在使用的身份,那么您的代码应该可以工作。

鉴于它不起作用以及它不起作用的方式,我很确定服务器已配置为使用基于表单的身份验证,而不是基本身份验证。

为了使基于表单的身份验证有效,您必须发送包含表单数据(包括用户名和密码)的发布请求才能登录,然后将您从服务器收到的Cookie设置为后续请求(因为服务器-
一旦登录, in-将设置会话cookie)。

看一下login.html的样子-它应该包含一个表单。如果使用的是标准servlet表单身份验证,则该表单的操作URL应该为“
j_security_check”,并且应该有两个表单参数:j_username和j_password。如果是这样,您可以尝试以下操作:

String URL_LOGIN = "http://localhost:9080/foo/j_security_check";
String URL_DATA = "http://localhost:9080/foo/auth.html";
Client client = Client.create();

// add a filter to set cookies received from the server and to check if login has been triggered
client.addFilter(new ClientFilter() {
    private ArrayList<Object> cookies;

    @Override
    public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
        if (cookies != null) {
            request.getHeaders().put("Cookie", cookies);
        }
        ClientResponse response = getNext().handle(request);
        // copy cookies
        if (response.getCookies() != null) {
            if (cookies == null) {
                cookies = new ArrayList<Object>();
            }
            // A simple addAll just for illustration (should probably check for duplicates and expired cookies)
            cookies.addAll(response.getCookies());
        }
        return response;
    }
});

String username = "me";
String password = "me";

// Login:
WebResource webResource = client.resource(URL_LOGIN);

com.sun.jersey.api.representation.Form form = new Form();
form.putSingle("j_username", username);
form.putSingle("j_password", password);
webResource.type("application/x-www-form-urlencoded").post(form);

// Get the protected web page:
webResource = client.resource(URL_DATA);
String response = webResource.get(String.class);

我尚未对此进行测试,因此可能会有一些错别字或错误。



 类似资料:
  • 我是新泽西Restful web服务和Spring Security的新bie。

  • 问题内容: 我正在开发一个使用Jersey框架的REST应用程序。我想知道如何控制用户身份验证。我搜索了很多地方,最近的文章是:http : //weblogs.java.net/blog/2008/03/07/authentication- jersey 。 但是,本文只能与GlassFish服务器和附加数据库一起使用。无论如何,在到达请求的REST资源之前,我是否可以在Jersey中实现一个接

  • 下面是示例代码:https://code.google.com/p/google-api-dotnet-client/wiki/oauth2#service_accounts 授权失败:dotnetOpenAuth.Messaging.ProtocolException:发送直接消息或获取响应时出错。 内部异常是System.net.WebException:远程服务器返回错误:(400)Bad

  • 我已经将我的Kafka jaas配置设置为Spring引导应用程序中的外部bean,以便从application.yaml文件中读取我的配置。 但是,从yaml文件读取jaas密钥表文件时,我遇到了一个错误。 面临错误 这就是我配置jaas的方式 KafkaJaasConfigurationProperty.java 应用yml 配置Bean.java 任何帮助将不胜感激。谢谢!

  • 问题内容: 我正在编写一个要求用户登录的Spring Web应用程序。我公司有一个Active Directory服务器,我想将其用于此目的。但是,我在使用Spring Security连接服务器时遇到了麻烦。 我正在使用Spring 2.5.5和Spring Security 2.0.3,以及Java 1.6。 如果我将LDAP URL更改为错误的IP地址,它不会引发异常或任何异常,因此我想知道

  • 问题内容: 我尝试阅读尽可能多的不同答案和帖子,但是我仍然不能完全满足自己的需求。我正在尝试找出处理用户身份验证,登录等的最佳方法(最有效,但大多数情况下更安全)。 我有一个运行在Express上的Node.js服务器;我有一个Angular.js网络应用程序;而且我有一个iOS应用。我使用Express /Node.js公开了RESTful API。 我读到的第一件事是使用cookie,并在服务