mirror of https://github.com/apache/lucene.git
SOLR-14196: AdminUI login not working for JWTAuth when blockUnknown=false (#1190)
This commit is contained in:
parent
84270dc6cf
commit
e744f7977e
|
@ -238,6 +238,8 @@ Bug Fixes
|
||||||
an inability to assign a node based on existing autoscaling policy resulted in a server error instead of a bad request.
|
an inability to assign a node based on existing autoscaling policy resulted in a server error instead of a bad request.
|
||||||
(Andras Salamon, Kevin Risden, shalin)
|
(Andras Salamon, Kevin Risden, shalin)
|
||||||
|
|
||||||
|
* SOLR-14196: AdminUI login not working for JWTAuth when blockUnknown=false (janhoy)
|
||||||
|
|
||||||
Other Changes
|
Other Changes
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -338,6 +338,7 @@ public class JWTAuthPlugin extends AuthenticationPlugin implements SpecProvider,
|
||||||
if (log.isDebugEnabled())
|
if (log.isDebugEnabled())
|
||||||
log.debug("Unknown user, but allow due to {}=false", PARAM_BLOCK_UNKNOWN);
|
log.debug("Unknown user, but allow due to {}=false", PARAM_BLOCK_UNKNOWN);
|
||||||
numPassThrough.inc();
|
numPassThrough.inc();
|
||||||
|
request.setAttribute(AuthenticationPlugin.class.getName(), getPromptHeaders(null, null));
|
||||||
filterChain.doFilter(request, response);
|
filterChain.doFilter(request, response);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -536,16 +537,28 @@ public class JWTAuthPlugin extends AuthenticationPlugin implements SpecProvider,
|
||||||
private enum BearerWwwAuthErrorCode { invalid_request, invalid_token, insufficient_scope}
|
private enum BearerWwwAuthErrorCode { invalid_request, invalid_token, insufficient_scope}
|
||||||
|
|
||||||
private void authenticationFailure(HttpServletResponse response, String message, int httpCode, BearerWwwAuthErrorCode responseError) throws IOException {
|
private void authenticationFailure(HttpServletResponse response, String message, int httpCode, BearerWwwAuthErrorCode responseError) throws IOException {
|
||||||
|
getPromptHeaders(responseError, message).forEach(response::setHeader);
|
||||||
|
response.sendError(httpCode, message);
|
||||||
|
log.info("JWT Authentication attempt failed: {}", message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate proper response prompt headers
|
||||||
|
* @param responseError standardized error code. Set to 'null' to generate WWW-Authenticate header with no error
|
||||||
|
* @param message custom message string to return in www-authenticate, or null if no error
|
||||||
|
* @return map of headers to add to response
|
||||||
|
*/
|
||||||
|
private Map<String, String> getPromptHeaders(BearerWwwAuthErrorCode responseError, String message) {
|
||||||
|
Map<String,String> headers = new HashMap<>();
|
||||||
List<String> wwwAuthParams = new ArrayList<>();
|
List<String> wwwAuthParams = new ArrayList<>();
|
||||||
wwwAuthParams.add("Bearer realm=\"" + realm + "\"");
|
wwwAuthParams.add("Bearer realm=\"" + realm + "\"");
|
||||||
if (responseError != null) {
|
if (responseError != null) {
|
||||||
wwwAuthParams.add("error=\"" + responseError + "\"");
|
wwwAuthParams.add("error=\"" + responseError + "\"");
|
||||||
wwwAuthParams.add("error_description=\"" + message + "\"");
|
wwwAuthParams.add("error_description=\"" + message + "\"");
|
||||||
}
|
}
|
||||||
response.addHeader(HttpHeaders.WWW_AUTHENTICATE, String.join(", ", wwwAuthParams));
|
headers.put(HttpHeaders.WWW_AUTHENTICATE, String.join(", ", wwwAuthParams));
|
||||||
response.addHeader(AuthenticationPlugin.HTTP_HEADER_X_SOLR_AUTHDATA, generateAuthDataHeader());
|
headers.put(AuthenticationPlugin.HTTP_HEADER_X_SOLR_AUTHDATA, generateAuthDataHeader());
|
||||||
response.sendError(httpCode, message);
|
return headers;
|
||||||
log.info("JWT Authentication attempt failed: {}", message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String generateAuthDataHeader() {
|
protected String generateAuthDataHeader() {
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"authentication": {
|
||||||
|
"class": "solr.JWTAuthPlugin",
|
||||||
|
"blockUnknown": false,
|
||||||
|
"jwk": {
|
||||||
|
"kty": "RSA",
|
||||||
|
"e": "AQAB",
|
||||||
|
"use": "sig",
|
||||||
|
"kid": "test",
|
||||||
|
"alg": "RS256",
|
||||||
|
"n": "jeyrvOaZrmKWjyNXt0myAc_pJ1hNt3aRupExJEx1ewPaL9J9HFgSCjMrYxCB1ETO1NDyZ3nSgjZis-jHHDqBxBjRdq_t1E2rkGFaYbxAyKt220Pwgme_SFTB9MXVrFQGkKyjmQeVmOmV6zM3KK8uMdKQJ4aoKmwBcF5Zg7EZdDcKOFgpgva1Jq-FlEsaJ2xrYDYo3KnGcOHIt9_0NQeLsqZbeWYLxYni7uROFncXYV5FhSJCeR4A_rrbwlaCydGxE0ToC_9HNYibUHlkJjqyUhAgORCbNS8JLCJH8NUi5sDdIawK9GTSyvsJXZ-QHqo4cMUuxWV5AJtaRGghuMUfqQ"
|
||||||
|
},
|
||||||
|
"realm": "my-solr-jwt-blockunknown-false",
|
||||||
|
"adminUiScope": "solr:admin",
|
||||||
|
"authorizationEndpoint": "http://acmepaymentscorp/oauth/auz/authorize",
|
||||||
|
"clientId": "solr-cluster"
|
||||||
|
},
|
||||||
|
"authorization": {
|
||||||
|
"class": "solr.RuleBasedAuthorizationPlugin",
|
||||||
|
"permissions": [{
|
||||||
|
"name": "all",
|
||||||
|
"role": "*"
|
||||||
|
}],
|
||||||
|
"user-role": {
|
||||||
|
"solr": "solr-admin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -145,6 +145,28 @@ public class JWTAuthPluginIntegrationTest extends SolrCloudAuthTestCase {
|
||||||
" \"client_id\":\"solr-cluster\"}", authData);
|
" \"client_id\":\"solr-cluster\"}", authData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void infoRequestValidateXSolrAuthHeadersBlockUnknownFalse() throws Exception {
|
||||||
|
// Re-configure cluster with other security.json, see https://issues.apache.org/jira/browse/SOLR-14196
|
||||||
|
shutdownCluster();
|
||||||
|
configureCluster(NUM_SERVERS)// nodes
|
||||||
|
.withSecurityJson(TEST_PATH().resolve("security").resolve("jwt_plugin_jwk_security_blockUnknownFalse.json"))
|
||||||
|
.addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
|
||||||
|
.withDefaultClusterProperty("useLegacyReplicaAssignment", "false")
|
||||||
|
.configure();
|
||||||
|
baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
|
||||||
|
|
||||||
|
Map<String, String> headers = getHeaders(baseUrl + "/admin/info/system", null);
|
||||||
|
assertEquals("Should have received 401 code", "401", headers.get("code"));
|
||||||
|
assertEquals("Bearer realm=\"my-solr-jwt-blockunknown-false\"", headers.get("WWW-Authenticate"));
|
||||||
|
String authData = new String(Base64.base64ToByteArray(headers.get("X-Solr-AuthData")), UTF_8);
|
||||||
|
assertEquals("{\n" +
|
||||||
|
" \"scope\":\"solr:admin\",\n" +
|
||||||
|
" \"redirect_uris\":[],\n" +
|
||||||
|
" \"authorizationEndpoint\":\"http://acmepaymentscorp/oauth/auz/authorize\",\n" +
|
||||||
|
" \"client_id\":\"solr-cluster\"}", authData);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMetrics() throws Exception {
|
public void testMetrics() throws Exception {
|
||||||
boolean isUseV2Api = random().nextBoolean();
|
boolean isUseV2Api = random().nextBoolean();
|
||||||
|
|
Loading…
Reference in New Issue