When authentication to the MySQL server occurs by means of an authentication plugin, the plugin may request that the connecting (external) user be treated as a different user for privilege-checking purposes. This enables the external user to be a proxy for the second user; that is, to have the privileges of the second user. In other words, the external user is a “proxy user” (a user who can impersonate or become known as another user) and the second user is a “proxied user” (a user whose identity can be taken on by a proxy user).
This section describes how the proxy user capability works. For general information about authentication plugins, see Section 5.7, “Pluggable Authentication”. If you are interested in writing your own authentication plugins that support proxy users, see Implementing Proxy User Support in Authentication Plugins.
For proxying to occur, these conditions must be satisfied:
When a connecting client should be treated as a proxy user, the plugin must return a different name, to indicate the proxied user name.
A proxy user account must be set up to be authenticated by the
plugin. Use the CREATE USER or
GRANT statement to associate an
account with a plugin.
A proxy user account must have the
PROXY privilege for the proxied
account. Use the GRANT
statement for this.
Consider the following definitions:
CREATE USER 'empl_external'@'localhost' IDENTIFIED WITH auth_plugin AS 'auth_string'; CREATE USER 'employee'@'localhost' IDENTIFIED BY 'employee_pass'; GRANT PROXY ON 'employee'@'localhost' TO 'empl_external'@'localhost';
When a client connects as empl_external from
the local host, MySQL uses auth_plugin to
perform authentication. If auth_plugin returns
the employee user name to the server (based on
the content of 'auth_string' and perhaps by
consulting some external authentication system), that serves as a
request to the server to treat this client, for purposes of
privilege checking, as the employee local user.
In this case, empl_external is the proxy user
and employee is the proxied user.
The server verifies that proxy authentication for
employee is possible for the
empl_external user by checking whether
empl_external has the
PROXY privilege for
employee. (If this privilege had not been
granted, an error would occur.)
When proxying occurs, the USER() and
CURRENT_USER() functions can be used to see the
difference between the connecting user and the account whose
privileges apply during the current session. For the example just
described, those functions return these values:
mysql> SELECT USER(), CURRENT_USER();
+-------------------------+--------------------+
| USER() | CURRENT_USER() |
+-------------------------+--------------------+
| empl_external@localhost | employee@localhost |
+-------------------------+--------------------+
The IDENTIFIED WITH clause that names the
authentication plugin may be followed by an AS
clause specifying a string that the server passes to the plugin
when the user connects. It is up to each plugin whether the
AS clause is required. If it is required, the
format of the authentication string depends on how the plugin
intends to use it. Consult the documentation for a given plugin
for information about the authentication string values it accepts.
A special PROXY privilege is needed
to enable an external user to connect as and have the privileges
of another user. To grant this privilege, use the
GRANT statement. For example:
GRANT PROXY ON 'proxied_user' TO 'proxy_user';
proxy_user must represent a valid
externally authenticated MySQL user at connection time or
connection attempts fail. proxied_user
must represent a valid locally authenticated user at connection
time or connection attempts fail.
The corresponding REVOKE syntax is:
REVOKE PROXY ON 'proxied_user' FROM 'proxy_user';
MySQL GRANT and
REVOKE syntax extensions work as
usual. For example:
GRANT PROXY ON 'a' TO 'b', 'c', 'd'; GRANT PROXY ON 'a' TO 'd' IDENTIFIED BY ...; GRANT PROXY ON 'a' TO 'd' WITH GRANT OPTION; GRANT PROXY ON 'a' TO ''@''; REVOKE PROXY ON 'a' FROM 'b', 'c', 'd';
In the preceding example, ''@'' is the default
proxy user and means “any user.” The default proxy
user is discussed later in this section.
The PROXY privilege can be granted
in these cases:
By proxied_user for itself: The
value of USER() must exactly match
CURRENT_USER() and
proxied_user, for both the user
name and host name parts of the account name.
By a user that has GRANT PROXY ... WITH GRANT
OPTION for proxied_user.
The root account created by default during
MySQL installation has the
PROXY ... WITH GRANT
OPTION privilege for ''@'', that is,
for all users. This enables root to set up
proxy users, as well as to delegate to other accounts the
authority to set up proxy users. For example,
root can do this:
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'test'; GRANT PROXY ON ''@'' TO 'admin'@'localhost' WITH GRANT OPTION;
Now the admin user can manage all the specific
GRANT PROXY mappings. For example,
admin can do this:
GRANT PROXY ON sally TO joe;
To specify that some or all users should connect using a given
external plugin, create a “blank” MySQL user, set it
up to use that plugin for authentication, and let the plugin
return the real authenticated user name (if different from the
blank user). For example, suppose that there exists a hypothetical
plugin named ldap_auth that implements LDAP
authentication:
CREATE USER ''@'' IDENTIFIED WITH ldap_auth AS 'O=Oracle, OU=MySQL'; CREATE USER 'developer'@'localhost' IDENTIFIED BY 'developer_pass'; CREATE USER 'manager'@'localhost' IDENTIFIED BY 'manager_pass'; GRANT PROXY ON 'manager'@'localhost' TO ''@''; GRANT PROXY ON 'developer'@'localhost' TO ''@'';
Now assume that a client tries to connect as follows:
mysql --user=myuser --password='myuser_pass' ...
The server will not find myuser defined as a
MySQL user. But because there is a blank user account
(''@''), that matches the client user name and
host name, the server authenticates the client against that
account: The server invokes ldap_auth, passing
it myuser and myuser_pass as
the user name and password.
If the ldap_auth plugin finds in the LDAP
directory that myuser_pass is not the correct
password for myuser, authentication fails and
the server rejects the connection.
If the password is correct and ldap_auth finds
that myuser is a developer, it returns the user
name developer to the MySQL server, rather than
myuser. The server verifies that
''@'' can authenticate as
developer (because it has the
PROXY privilege to do so) and
accepts the connection. The session proceeds with
myuser having the privileges of
developer. (These privileges should be set up
by the DBA using GRANT statements, not shown.)
The USER() and
CURRENT_USER() functions return
these values:
mysql> SELECT USER(), CURRENT_USER();
+------------------+---------------------+
| USER() | CURRENT_USER() |
+------------------+---------------------+
| myuser@localhost | developer@localhost |
+------------------+---------------------+
If the plugin instead finds in the LDAP directory that
myuser is a manager, it returns
manager as the user name and the session
proceeds with myuser having the privileges of
manager.
mysql> SELECT USER(), CURRENT_USER();
+------------------+-------------------+
| USER() | CURRENT_USER() |
+------------------+-------------------+
| myuser@localhost | manager@localhost |
+------------------+-------------------+
For simplicity, external authentication cannot be multilevel:
Neither the credentials for developer nor those
for manager are taken into account in the
preceding example. However, they are still used if a client tries
to authenticate directly against the developer
or manager account, which is why those accounts
should be assigned passwords.
The default proxy account uses '' in the host
part, which matches any host. If you set up a default proxy user,
take care to also check for accounts with '%'
in the host part, because that also matches any host, but has
precedence over '' by the rules that the server
uses to sort account rows internally (see
Section 4.4, “Access Control, Stage 1: Connection Verification”).
Suppose that a MySQL installation includes these two accounts:
CREATE USER ''@'' IDENTIFIED WITH some_plugin; CREATE USER ''@'%' IDENTIFIED BY 'some_password';
The intent of the first account is to serve as the default proxy user, to be used to authenticate connections for users who do not otherwise match a more-specific account. The second account might have been created, for example, to enable users without their own account as the anonymous user.
However, in this configuration, the first account will never be
used because the matching rules sort ''@'%'
ahead of ''@''. For accounts that do not match
any more-specific account, the server will attempt to authenticate
them against ''@'%' rather than
''@''.
If you intend to create a default proxy user, check for other existing “match any user” accounts that will take precedence over the default proxy user and thus prevent that user from working as intended. It may be necessary to remove any such accounts.
Two system variables help trace the proxy login process:
proxy_user: This value is
NULL if proxying is not used. Otherwise, it
indicates the proxy user account. For example, if a client
authenticates through the default proxy account, this variable
will be set as follows:
mysql> SELECT @@proxy_user;
+--------------+
| @@proxy_user |
+--------------+
| ''@'' |
+--------------+
external_user: Sometimes the
authentication plugin may use an external user to authenticate
to the MySQL server. For example, when using Windows native
authentication, a plugin that authenticates using the windows
API does not need the login ID passed to it. However, it still
uses an Windows user ID to authenticate. The plugin may return
this external user ID (or the first 512 UTF-8 bytes of it) to
the server using the external_user
read-only session variable. If the plugin does not set this
variable, its value is NULL.

User Comments
Add your own comment.