簡體   English   中英

無法使用Restlet 2.1獲得基本的HTTP身份驗證

[英]Cannot get Basic HTTP Authentication to work using Restlet 2.1

我正在嘗試使用Restlet 2.1實現基本的HTTP身份驗證,但是我無法使其正常工作..! 我正在使用ChallengeAuthenticator設置基本HTTP身份驗證。 我只有一個URI \\test ,我正試圖為此進行身份驗證。

我構建代碼,然后將其作為Web應用程序運行,然后瀏覽至http://localhost:8888/test以查看是否收到提示輸入用戶名/密碼的提示,但沒有收到提示。 我只得到一個黑屏。

同樣,當我瀏覽到http://localhost:8888/test ,我在Eclipse的控制台中得到了以下內容:

WARNING: A response with a 200 (Ok) status should have an entity. Make sure that resource "http://localhost:8888/test" returns one or sets the status to 204 (No content).

當我瀏覽至http://user:password@localhost:8888/test ,結果完全相同。

HTTP標頭(來自Chrome)如下:

請求:

GET /test HTTP/1.1
Host: localhost:8888
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,ms;q=0.6

響應(未提及基本身份驗證):

HTTP/1.1 200 OK
Date: Fri, 13 Jun 2014 11:21:05 GMT
Accept-Ranges: bytes
Server: Development/1.0
Content-Length: 0
Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT

這是Java代碼:

package com.poc.hw7;

import org.restlet.*;
import org.restlet.data.ChallengeScheme;
import org.restlet.data.Cookie;
import org.restlet.data.MediaType;
import org.restlet.routing.Router;
import org.restlet.security.*;
import org.restlet.util.Series;

public class AuthTestApp extends Application {

    private ChallengeAuthenticator authenticator;

    private ChallengeAuthenticator createAuthenticator() {
        Context context = getContext();
        boolean optional = false;
        ChallengeScheme challengeScheme = ChallengeScheme.HTTP_BASIC;
        String realm = "Example site";

        MapVerifier verifier = new MapVerifier();
        verifier.getLocalSecrets().put("user", "password".toCharArray());

        ChallengeAuthenticator auth = new ChallengeAuthenticator(context, optional, challengeScheme, realm, verifier) {
            @Override
            protected boolean authenticate(Request request, Response response) {
                if (request.getChallengeResponse() == null) {
                    return false;
                } else {
                    return super.authenticate(request, response);
                }
            }
        };
        return auth;
    }

    @Override
    public Restlet createInboundRoot() {
        this.authenticator = createAuthenticator();

        Restlet hw_restlet = new Restlet(getContext())
        {
        public void handle(Request request, Response response)
            {
            String message = "Hello World!";
            response.setEntity(message,MediaType.TEXT_PLAIN);
            }
        };

        Router router = new Router();
        router.attach("/test", hw_restlet);
        authenticator.setNext(router);
        return authenticator;
    }

    public boolean authenticate(Request request, Response response) {
        if (!request.getClientInfo().isAuthenticated()) {
            authenticator.challenge(response, false);
            return false;
        }
        return true;
    }
}

這是web.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
    <display-name>Restlet URI Rewrite</display-name>
    <servlet>
        <servlet-name>RestletServlet</servlet-name>
        <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
        <init-param>
            <param-name>org.restlet.application</param-name>
            <param-value>com.poc.hw7.AuthTestApp</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>RestletServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

有人可以告訴我如何使基本的HTTP身份驗證工作嗎?

您的響應是200碼,這意味着您的服務器從不要求輸入。 您將需要發送401響應。 對於大多數Web瀏覽器,這將自動彈出用戶名和密碼的基本身份驗證框。

至於為什么發生這種情況……很難說。 restlet看起來非常...不好。 有更容易使用的框架,您可以在其中注釋函數以偵聽特定的URI和/或請求方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM