This is an automated email from the ASF dual-hosted git repository.
janhoy pushed a commit to branch branch_10x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_10x by this push:
new b7bc567224a Revert "SOLR-18233 Strengthen Basic Authentication
password policy and harden template users created by bin/solr auth enable
(#4477)"
b7bc567224a is described below
commit b7bc567224acde0b6d0019a9be28347f04370ca8
Author: Jan Høydahl <[email protected]>
AuthorDate: Wed Jun 10 12:29:28 2026 +0200
Revert "SOLR-18233 Strengthen Basic Authentication password policy and
harden template users created by bin/solr auth enable (#4477)"
This reverts commit 20c0a6cd389e58d8f69a41b940af1ef0262cc99a.
---
...ngthen-Basic-Authentication-password-policy.yml | 7 -----
.../src/java/org/apache/solr/cli/AuthTool.java | 24 +++--------------
.../security/Sha256AuthenticationProvider.java | 5 ----
solr/core/src/resources/security.json | 10 +++++---
.../security/TestSha256AuthenticationProvider.java | 27 -------------------
.../pages/basic-authentication-plugin.adoc | 8 +++---
.../pages/solr-control-script-reference.adoc | 30 ++++------------------
solr/webapp/web/js/angular/controllers/security.js | 6 -----
8 files changed, 17 insertions(+), 100 deletions(-)
diff --git
a/changelog/unreleased/SOLR-18233-Strengthen-Basic-Authentication-password-policy.yml
b/changelog/unreleased/SOLR-18233-Strengthen-Basic-Authentication-password-policy.yml
deleted file mode 100644
index 3c06a95dfe6..00000000000
---
a/changelog/unreleased/SOLR-18233-Strengthen-Basic-Authentication-password-policy.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-title: Strengthen Basic Authentication password policy and harden template
users created by bin/solr auth enable
-type: fixed
-authors:
- - name: Jan Høydahl
-links:
- - name: SOLR-18233
- url: https://issues.apache.org/jira/browse/SOLR-18233
diff --git a/solr/core/src/java/org/apache/solr/cli/AuthTool.java
b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
index 3487787684d..5c19ac300d7 100644
--- a/solr/core/src/java/org/apache/solr/cli/AuthTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/AuthTool.java
@@ -227,12 +227,8 @@ public class AuthTool extends ToolBase {
} while (password.isEmpty());
}
- if (username.equals(password)) {
- CLIO.err(
- "Error: username and password must not be identical."
- + " This credential would never authenticate.");
- runtime.exit(1);
- }
+ boolean blockUnknown =
+ Boolean.parseBoolean(cli.getOptionValue(BLOCK_UNKNOWN_OPTION,
"true"));
String resourceName = "security.json";
final URL resource =
SolrCore.class.getClassLoader().getResource(resourceName);
@@ -242,11 +238,7 @@ public class AuthTool extends ToolBase {
ObjectMapper mapper = new ObjectMapper();
JsonNode securityJson1 = mapper.readTree(resource.openStream());
- // Only override blockUnknown if explicitly passed; otherwise let
the template decide
- if (cli.hasOption(BLOCK_UNKNOWN_OPTION)) {
- boolean blockUnknown =
Boolean.parseBoolean(cli.getOptionValue(BLOCK_UNKNOWN_OPTION));
- ((ObjectNode)
securityJson1.get("authentication")).put("blockUnknown", blockUnknown);
- }
+ ((ObjectNode) securityJson1).put("blockUnknown", blockUnknown);
JsonNode credentialsNode =
securityJson1.get("authentication").get("credentials");
((ObjectNode) credentialsNode)
.put(username,
Sha256AuthenticationProvider.getSaltedHashedValue(password));
@@ -294,16 +286,6 @@ public class AuthTool extends ToolBase {
String.format(
Locale.ROOT, "Successfully enabled basic auth with username
[%s].", username);
echo(successMessage);
- if (!updateIncludeFileOnly) {
- CLIO.out(
- "\nIMPORTANT: The following template users have been created
with NO password set"
- + " and cannot log in until passwords are assigned:");
- CLIO.out(" - admin (roles: admin, index, search)");
- CLIO.out(" - index (roles: index, search)");
- CLIO.out(" - search (roles: search)");
- CLIO.out(
- "Set their passwords using the Admin UI Security page or the
authentication API.");
- }
return;
}
case "disable":
diff --git
a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index 6e1646a5666..31c38537f69 100644
---
a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++
b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@ -93,7 +93,6 @@ public class Sha256AuthenticationProvider
@Override
public boolean authenticate(String username, String password) {
- if (username != null && username.equals(password)) return false;
String cred = credentials.get(username);
if (cred == null || cred.isEmpty()) return false;
cred = cred.trim();
@@ -166,10 +165,6 @@ public class Sha256AuthenticationProvider
cmd.addError("name and password must be non-null");
return null;
}
- if (e.getKey().equals(String.valueOf(e.getValue()))) {
- cmd.addError("Password must not be the same as the username");
- return null;
- }
putUser(e.getKey(), String.valueOf(e.getValue()), map);
}
}
diff --git a/solr/core/src/resources/security.json
b/solr/core/src/resources/security.json
index 4406cf52a1b..f503f7c4e30 100644
--- a/solr/core/src/resources/security.json
+++ b/solr/core/src/resources/security.json
@@ -3,9 +3,10 @@
"blockUnknown": false,
"class": "solr.BasicAuthPlugin",
"credentials": {
- "search": "",
- "index": "",
- "admin": ""
+ "search": "9ch2qWOmNSeGpfcgLRXafhm5z3KeRti5qCNLn7SmK1I=
aXNjZWd4YW9mMzZ0cjE1Nw==",
+ "index": "of9xlSadImtR0MH4obzJvKSZkuE5DIJh5NOui2hWDeA=
dTRuYzU4Y3F4N2hxd2sxeA==",
+ "admin": "6clS8rTEj1x1LP/uRCxOZsLdps7Sovokru09WdJX+7A=
NGMyZGFhN2lrNHFsdXZybA==",
+ "superadmin": "9wzPajmLBIIi8BmToy8lxveDxfL6Vl/BX/Ss3xrs3XQ=
OWZna2hwendocXFnODU5ZQ=="
}
},
"authorization": {
@@ -66,7 +67,8 @@
"user-role": {
"search": ["search"],
"index": ["index", "search"],
- "admin": ["admin", "index", "search"]
+ "admin": ["admin", "index", "search"],
+ "superadmin": ["superadmin", "admin", "index", "search"]
}
}
}
diff --git
a/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
b/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
index 5bc84e2284a..632fd16b35a 100644
---
a/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
+++
b/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
@@ -104,33 +104,6 @@ public class TestSha256AuthenticationProvider extends
SolrTestCaseJ4 {
}
}
- public void testAuthenticateRejectsUsernameEqualPassword() {
- // Simulate a credential store that has the username's own hash as the
password
- // (e.g. set up before this policy was in effect) and verify
authenticate() still rejects it.
- String user = "alice";
- String hashedValue =
Sha256AuthenticationProvider.getSaltedHashedValue(user);
- Map<String, Object> config = new HashMap<>();
- Map<String, String> credentials = new HashMap<>();
- credentials.put(user, hashedValue);
- config.put("credentials", credentials);
-
- Sha256AuthenticationProvider provider = new Sha256AuthenticationProvider();
- provider.init(config);
- assertFalse(
- "authenticate() must reject username==password even when hash matches",
- provider.authenticate(user, user));
- }
-
- public void testSetUserRejectsUsernameEqualPassword() {
- Sha256AuthenticationProvider provider = new Sha256AuthenticationProvider();
- provider.init(createConfigMap("ignore", "me"));
- Map<String, Object> latestConf = createConfigMap("ignore", "me");
- String user = "bob";
- CommandOperation cmd = new CommandOperation("set-user", Map.of(user,
user));
- provider.edit(latestConf, List.of(cmd));
- assertTrue("set-user should report an error when username==password",
cmd.hasError());
- }
-
private Map<String, Object> createConfigMap(String user, String pw) {
Map<String, Object> config = new HashMap<>();
Map<String, String> credentials = new HashMap<>();
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/basic-authentication-plugin.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/basic-authentication-plugin.adoc
index 9f1a062feb6..19536088939 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/basic-authentication-plugin.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/basic-authentication-plugin.adoc
@@ -24,12 +24,11 @@ To control user permissions, you may need to configure an
authorization plugin a
== Enable Basic Authentication
-When running in cloud mode, Basic authentication can be enabled from the
command line using the `bin/solr auth enable` command, which applies a
best-practice security template with pre-configured roles and permissions.
-See
xref:solr-control-script-reference.adoc#enabling-basic-authentication[Enabling
Basic Authentication] in the Solr Control Script Reference for details.
-
-Alternatively, you can create the `security.json` file manually.
+To use Basic authentication, you must first create a `security.json` file.
This file and where to put it is described in detail in the section
xref:authentication-and-authorization-plugins.adoc#configuring-security-json[Configuring
security.json].
+If running in cloud mode, you can use the `bin/solr auth` command-line utility
to enable security for a new installation, see: `bin/solr auth --help` for more
details.
+
For Basic authentication, `security.json` must have an `authentication` block
which defines the class being used for authentication.
Usernames and passwords could be added when the file is created, or can be
added later with the Authentication API, described below.
@@ -186,7 +185,6 @@ If users need to be restricted to a specific collection,
that can be done with t
=== Add a User or Edit a Password
The `set-user` command allows you to add users and change their passwords.
-Passwords must not be identical to the username.
For example, the following defines two users and their passwords:
[tabs#set-user]
diff --git
a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
index aae46c7c6cc..f507216396b 100644
---
a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
+++
b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
@@ -916,23 +916,19 @@ The `bin/solr` script allows enabling or disabling
Authentication, allowing you
Currently this command is only available when using SolrCloud mode and must be
run on the machine hosting Solr.
-For Basic Authentication the script provides
https://github.com/apache/solr/blob/main/solr/core/src/resources/security.json[user
roles and permission mappings], and maps the created user to all roles
(`superadmin`, `admin`, `index`, `search`).
+For Basic Authentication the script provides
https://github.com/apache/solr/blob/main/solr/core/src/resources/security.json[user
roles and permission mappings], and maps the created user to the `superadmin`
role.
=== Enabling Basic Authentication
The command `bin/solr auth enable` configures Solr to use Basic Authentication
when accessing the User Interface, using `bin/solr` and any API requests.
-NOTE: This command currently requires SolrCloud mode — it uploads the
generated `security.json` to ZooKeeper so that all nodes pick it up
automatically.
-For user-managed (standalone) clusters, you must create the `security.json`
file manually and place it in each node's Solr home directory.
-See xref:basic-authentication-plugin.adoc[] for details.
-
TIP: For more information about Solr's authentication plugins, see the section
xref:securing-solr.adoc[].
For more information on Basic Authentication support specifically, see the
section xref:basic-authentication-plugin.adoc[].
The `bin/solr auth enable` command makes several changes to enable Basic
Authentication:
-* Takes the base
https://github.com/apache/solr/blob/main/solr/core/src/resources/security.json[security.json]
template with best-practice roles and permissions, applies `auth` command
parameters, and uploads the result to ZooKeeper.
+* Take the base
https://github.com/apache/solr/blob/main/solr/core/resources/security.json[security.json]
file, evolves it using `auth` command parameters, and uploads the new file to
ZooKeeper.
+
* Adds two lines to `bin/solr.in.sh` or `bin\solr.in.cmd` to set the
authentication type, and the path to `basicAuth.conf`:
+
@@ -944,19 +940,6 @@
SOLR_AUTHENTICATION_OPTS="-Dsolr.httpclient.config=/path/to/solr-{solr-full-vers
----
* Creates the file `server/solr/basicAuth.conf` to store the credential
information that is used with `bin/solr` commands.
-In addition to the operator-created user, the command also creates three
template users with predefined role assignments.
-These users have no password set and cannot log in until passwords are
explicitly assigned:
-
-[cols="1,2",options="header"]
-|===
-|Username |Roles
-|`admin` |admin, index, search
-|`index` |index, search
-|`search` |search
-|===
-
-After enabling Basic Authentication, set passwords for these template users
using the Admin UI Security page or the
xref:basic-authentication-plugin.adoc#add-a-user-or-edit-a-password[authentication
API].
-
Here are some example usages:
[source,plain]
@@ -998,14 +981,11 @@ Either `--credentials` or `--prompt` *must* be specified.
+
[%autowidth,frame=none]
|===
-|Optional |Default: use value from `security.json` template (`false`)
+|Optional |Default: `true`
|===
+
-Controls whether unauthenticated requests are blocked.
-The default `security.json` template sets `blockUnknown` to `false` because it
includes a `RuleBasedAuthorizationPlugin` with fine-grained permissions —
unauthenticated users can only access endpoints explicitly granted to the
`null` role (by default *health* and *metrics-read*, left open so that load
balancers and monitoring tools can operate without credentials).
-All other operations require an authenticated user with the appropriate role.
-+
-If you want to require authentication for _all_ requests (including health
checks and metrics), pass `--block-unknown true` explicitly.
+When `true`, this blocks out access to unauthenticated users from accessing
Solr.
+When `false`, unauthenticated users will still be able to access Solr, but
only for operations not explicitly requiring a user role in the Authorization
plugin configuration.
`--solr-include-file <includeFilePath>`::
+
diff --git a/solr/webapp/web/js/angular/controllers/security.js
b/solr/webapp/web/js/angular/controllers/security.js
index 1ffdf85460a..fd65a289988 100644
--- a/solr/webapp/web/js/angular/controllers/security.js
+++ b/solr/webapp/web/js/angular/controllers/security.js
@@ -412,12 +412,6 @@ solrAdminApp.controller('SecurityController', function
($scope, $timeout, $cooki
return false;
}
- var username = $scope.upsertUser.username ?
$scope.upsertUser.username.trim() : "";
- if (password === username) {
- $scope.validationError = "Password must not be the same as the username";
- return false;
- }
-
return true;
};