![](/img/trans.png)
[英]How to authenticate endpoint using Jwt and prevent users to use not their data in Spring Boot WebFlux
[英]How to authenticate spring boot endpoint programmatically?
在Spring Boot应用程序中,我启用了一个端点,即metrics
端点。 同时,我不想将其公开,因此我使用以下设置对其进行了配置:
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是显而易见的未授权访问的响应代码。 我的查询是否可以以编程方式提供用户名和密码来访问上述URI,即https://127.0.0.2:8082/manager/metrics
? 还是防火墙是保护它的唯一方法? 。
我的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();
}
基于所描述的浏览器行为,我假设端点由基本身份验证保护。
基本身份验证需要一个“授权”标头,其中包含以base64编码的以下格式的用户名和密码:“ username:password”
如果您使用Java 8,则可以使用java util软件包中提供的base64编码器,如下所示:
import java.util.Base64;
con.setRequestProperty("Authorization", Base64.getEncoder().encode("yourUsername:yourPassword".getBytes());
只是提供一些进一步的信息:
这与您的浏览器完全相同。 它发送请求并获得401响应,其中包含标头WWW-Authenticate: Basic
。 因此,浏览器知道身份验证方法是基本身份验证,并要求您提供用户名和密码,然后当第二次浏览器再次执行相同的请求时,这些用户名和密码将由base64编码并添加到授权标头中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.