首页 文章

如何以编程方式验证Spring引导 endpoints ?

提问于
浏览
0

在Spring Boot应用程序中,我启用了一个 endpoints ,即 metrics endpoints . 同时我不想公开,所以我使用以下设置进行配置:

security.user.name=admin
security.user.password=ENC(l2y+PuJeGIOMshbv+ddZgK8lOe2TRdt9YIuMwB5g5Ws=)
security.basic.enabled=false

management.context-path=/manager
management.port=8082
management.address=127.0.0.2
management.security.enabled=false
management.security.roles=SUPERUSER
management.ssl.enabled=true
management.ssl.key-store=file:keystore.jks
management.ssl.key-password=ENC(l2y+PuJeGIOMshbv+ddZgK8lOe2TRdt9YIuMwB5g5Ws=)

endpoints.metrics.id=metrics
endpoints.metrics.sensitive=true
endpoints.metrics.enabled=true

基本上,如果有人试图访问 https://127.0.0.2:8082/manager/metrics URI抛出任何浏览器,那么他/她需要在弹出窗口中提供用户名( security.user.name=admin )和密码( security.user.password=ENC(l2y+PuJeGIOMshbv+ddZgK8lOe2TRdt9YIuMwB5g5Ws=) ) .

现在我有一个在同一台机器上运行的java客户端(将来它可能在远程位置运行)但是有一个不同的主机和端口,即 127.0.0.1:8081 尝试以编程方式访问上述URI,但无法这样做并最终得到响应代码401 .

401是UNAUTHORIZED访问的响应代码,这是显而易见的 . 我的查询是 is it possible to supply username and password programmatically to access the above URI i.e. https://127.0.0.2:8082/manager/metrics? or firewall is the only way to secure it? .

我的java客户端代码:

System.setProperty("javax.net.ssl.trustStore","D://SpringBoot/SpringWebAngularJS/truststore.ts");
    System.setProperty("javax.net.ssl.trustStorePassword","p@ssw0rd");
    try {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
            public boolean verify(String hostname,SSLSession sslSession) {
                return hostname.equals("127.0.0.2");
            }
        });
        URL obj = new URL("https://127.0.0.2:8082/manager/metrics");
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
        con.setRequestProperty( "Content-Type", "application/json" );
        con.setRequestProperty("Accept", "application/json");
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        int responseCode = con.getResponseCode();
        System.err.println("GET Response Code :: " + responseCode); //Response code 401
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

1 回答

  • 2

    基于浏览器的描述行为,我假设 endpoints 由基本认证保护 .

    基本身份验证需要一个“授权”标头,其中包含以base64编码的以下格式的用户名和密码:“username:password”

    如果使用java 8,则可以使用java util包中提供的base64编码器,如下所示:

    import java.util.Base64;
    
    con.setRequestProperty("Authorization", Base64.getEncoder().encode("yourUsername:yourPassword".getBytes());
    

    只是提供一些进一步的信息:

    这与您的浏览器完全相同 . 它发送请求并获得包含标头 WWW-Authenticate: Basic 的401响应 . 因此,浏览器知道身份验证方法是基本身份验证,并要求您提供用户名和密码,然后由base64编码,并在浏览器第二次执行相同请求时添加到授权标头中 .

相关问题