Обеспечение базовой аутентификации с помощью RestEasy и TJWS

Мы используем Resteasy для связи между несколькими внутренними серверами, и мы хотим заблокировать это, чтобы никто не мог подключить клиент или браузер к серверу перезагрузки.

Мы используем Resteasy 3.04, и в качестве наших внутренних сервисов используются многочисленные, но очень легкие встраиваемые веб-серверы TJWS.

Пример кода сервера:

public class RestEasySSLBasicAuthenticationServer {

    static TJWSEmbeddedJaxrsServer webServer;

    static class BasicAthenticationSecurityDomain implements SecurityDomain  {

        @Override
        public Principal authenticate(String aUsername, String aPassword) throws SecurityException {
            System.out.println("User:" + aUsername + " Password" + aPassword);

            if (aPassword.equals("password") == false) {
                throw new SecurityException("Access denied to user " + aUsername);
            }

            return null;
        }

        @Override
        public boolean isUserInRoll(Principal aUsername, String aRole) {
            // No role based checks so return true
            return true;
        }

    }

    public static void main(String[] args) throws Exception {

        // Create embedded TJWS web server
        webServer = new TJWSEmbeddedJaxrsServer();

        // Set up SSL connections on server
        webServer.setSSLPort(8081);
        webServer.setSSLKeyStoreFile("K:\\source\\RestEasyTest\\server_localhost.jks");
        webServer.setSSLKeyStorePass("krypton");
        webServer.setSSLKeyStoreType("JKS");

        // Add basic HTTP authentication to the server
        webServer.setSecurityDomain( new BasicAthenticationSecurityDomain() );

        // Add the restlet resource
        webServer.getDeployment().getActualResourceClasses().add(PlayerResource.class);

        // Start the web server
        webServer.start();

        // Run until user presses a key
        System.out.print("Web server started. Press a key to stop...");
        System.in.read();

        // Stop the web server
        webServer.stop();
    }

}

Пример кода клиента:

public class RestEasySSLBasicAuthenticationClient {

    public static void main(String[] args) throws Exception {

      // Set up the keystore
        System.setProperty("javax.net.ssl.keyStore", "K:\\source\\RestEasyTest\\client_localhost.jks");
        System.setProperty("javax.net.ssl.keyStoreType", "JKS");
        System.setProperty("javax.net.ssl.keyStorePassword", "krypton");

        // Create a new Restlet client
        Client restletClient = ClientBuilder.newClient();

        // *** Even WITHOUT these credentitials we can access the restlet
        // restletClient.register(new BasicAuthentication("username", "password"));

        // Set up the restlet request target.
        WebTarget request = restletClient.target("https://localhost:8081/player/{id}");
        request = request.resolveTemplate("id", Long.valueOf(1));

        // Build the restlet request
        Invocation invocation = request.request("application/xml").buildGet();

        // Call the restlet and get returned object
        Player result = invocation.invoke( Player.class );

        System.out.println(result.toString());
    }   
}

Использование тестового клиента и зарегистрированного фильтра аутентификации работает, и, как и ожидалось, я могу получить ошибку доступа 401, если я получу неверный пароль.

Однако если на клиенте не зарегистрировано никакой аутентификации, то сервер никогда не вызывает SecurityDomain проверка и доступ разрешен.

Как мне обеспечить вход в систему на сервере?

1 ответ

Решение

Вы можете обеспечить аутентификацию всех пользователей, включив защиту на встроенном веб-сервере TJWS.

webServer.getDeployment().setSecurityEnabled(true);
Другие вопросы по тегам