[ 
https://issues.apache.org/jira/browse/DERBY-866?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rick Hillegas updated DERBY-866:
--------------------------------

    Attachment: derby-866-09-ad-nativeAuthenticationService.diff

Attaching derby-866-09-ad-nativeAuthenticationService.diff. This is the first 
rev of a patch which adds a NATIVE authentication service to Derby. Regression 
tests passed cleanly for me. The patch also passes a battery of ad-hoc tests, 
but I have not yet collected them into a formal regression test for this new 
functionality. So the patch is not ready for commit. I am posting the patch now 
in order to get feedback on whether this approach seems reasonable.

The new authentication service follows the pattern of the existing BASIC 
authentication service (BasicAuthenticationServiceImpl). I did not add support 
for network password substitution but it may be possible to add that in a later 
patch.

I have taken the approach of normalizing the user name as a SQL identifier when 
storing credentials at database-creation time. This causes the values in 
SYSSCHEMAS.AUTHORIZATIONID and SYSUSERS.USERNAME to agree, making it possible 
to join on those columns. The user name is also normalized at 
connection-authorization time. I haven't thought through the implications of 
whether syscs_create_user, syscs_reset_password, and syscs_drop_user should 
also normalize the username. Your opinions are welcome. Perhaps a clear 
preference will emerge as I write more tests.

Ad-hoc tests have verified the following behavior (at least in simple 
configurations):

1) Creating a credentials DB. The initial credentials are automatically stored 
in SYSUSERS and the following properties are persisted:

    derby.database.sqlAuthorization=true
    derby.authentication.provider=NATIVE::LOCAL

2) Creating a non-credentials DB, using the credentials DB to authorize the 
operation.

3) Shutting down a credentials DB and restarting it.

4) Trying to create a database with credentials which are not stored in the 
credentials DB. This operation fails as expected.

5) Trying to connect to an existing database with credentials which are not 
stored in the credentials DB. This operation fails as expected.

6) Verifying that the following system property setting is sufficient to turn 
on authentication and SQL authorization:

    derby.authentication.provider=NATIVE:$credentialsDB:LOCAL

    or

    derby.authentication.provider=NATIVE:$credentialsDB

That is, there is no need to also set the following properties:

   derby.connection.requireAuthentication=true
   derby.database.sqlAuthorization=true

7) Verifying that a credentials DB remembers that it is a credentials DB. When 
you reboot it, the connection is authenticated using credentials stored in the 
local SYSUSERS table.

Tests have been run on disk-based and in-memory databases and on desktop and 
JSR169 platforms.

I will start assembling a regression test out of the above cases. Even if my 
approach needs to be reworked, these tests are a low-bar for any implementation.

I know that code has not yet been written to support the following features:

i) Prevent NATIVE authentication from being enabled in a pre-existing database 
which lacks credentials for the DBO.

ii) Enable password substitution over the network.

Many more tests need to be written. In addition, more code may need to be 
written in order to implement the full functional spec. At a minimum, the 
following behaviors need to be verified and perhaps coded:

A) Once a credentials database is created, NATIVE authentication cannot be 
disabled for that database.

B) Similarly, SQL authorization cannot be disabled for a credentials DB.

C) Upgrade paths have not been tested.

D) No testing has been done with databases which are accessed via jar files, 
the classpath, or http/https URLs.

E) No testing has been done over the network.


Touches the following files:

----------

M       java/storeless/org/apache/derby/impl/storeless/EmptyDictionary.java
M       java/engine/org/apache/derby/impl/sql/catalog/DataDictionaryImpl.java
M       java/engine/org/apache/derby/iapi/sql/dictionary/DataDictionary.java

Add a method to retrieve a user's stored credentials. Also added db creation 
logic to turn on SQL authorization when NATIVE authentication is enabled.

----------

M       java/engine/org/apache/derby/impl/services/monitor/BaseMonitor.java
M       java/engine/org/apache/derby/iapi/services/monitor/ModuleFactory.java

Added a new method which makes it possible for code outside the Store to 
calculate the canonicalized form of a database name. This is necessary in order 
to figure out whether the local database is the credentials DB identified by 
the derby.authentication.provider property.

----------

M       java/engine/org/apache/derby/iapi/services/property/PropertyUtil.java
M       java/engine/org/apache/derby/iapi/reference/Property.java

Added code so that logic outside the Authentication module can figure out 
whether NATIVE and NATIVE::LOCAL authentication are enabled.

----------

M       
java/engine/org/apache/derby/impl/jdbc/authentication/SpecificAuthenticationServiceImpl.java
A       
java/engine/org/apache/derby/impl/jdbc/authentication/NativeAuthenticationServiceImpl.java
M       
java/engine/org/apache/derby/impl/jdbc/authentication/AuthenticationServiceBase.java
M       java/engine/org/apache/derby/iapi/jdbc/AuthenticationService.java
M       java/engine/org/apache/derby/modules.properties

The NATIVE authentication service.

----------

M       java/engine/org/apache/derby/catalog/SystemProcedures.java

Refactored some code so that the DBO's credentials can be stored at database 
creation time.

----------

M       java/engine/org/apache/derby/impl/jdbc/EmbedConnection.java

Added bootstrapping logic to skip NATIVE authentication when the system-wide 
credentials DB is being created.

----------

M       java/engine/org/apache/derby/loc/messages.xml
M       java/shared/org/apache/derby/shared/common/reference/SQLState.java

New error messages.

                
> Derby User Management Enhancements
> ----------------------------------
>
>                 Key: DERBY-866
>                 URL: https://issues.apache.org/jira/browse/DERBY-866
>             Project: Derby
>          Issue Type: Improvement
>          Components: Services
>    Affects Versions: 10.2.1.6
>            Reporter: Francois Orsini
>            Assignee: Rick Hillegas
>         Attachments: Derby_User_Enhancement.html, 
> Derby_User_Enhancement_v1.1.html, DummyAuthenticator.java, 
> UserManagement.html, UserManagement.html, UserManagement.html, 
> UserManagement.html, derby-866-01-aa-sysusers.diff, 
> derby-866-01-ab-sysusers.diff, derby-866-02-ag-createDropUser.diff, 
> derby-866-03-aa-resetModifyPassword.diff, 
> derby-866-03-ab-resetModifyPassword.diff, derby-866-04-aa-fixRolesTest.diff, 
> derby-866-05-aa-grantRevoke.diff, derby-866-06-aa-upgradeFrom10.1.diff, 
> derby-866-07-aa-removeSQLPassword.diff, derby-866-08-aa-passwordHasher.diff, 
> derby-866-08-ab-passwordHasher.diff, derby-866-08-ad-passwordHasher.diff, 
> derby-866-09-ad-nativeAuthenticationService.diff, dummyCredentials.properties
>
>
> Proposal to enhance Derby's Built-In DDL User Management. (See proposal spec 
> attached to the JIRA).
> Abstract:
> This feature aims at improving the way BUILT-IN users are managed in Derby by 
> providing a more intuitive and familiar DDL interface. Currently (in 
> 10.1.2.1), Built-In users can be defined at the system and/or database level. 
> Users created at the system level can be defined via JVM or/and Derby system 
> properties in the derby.properties file. Built-in users created at the 
> database level are defined via a call to a Derby system procedure 
> (SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY) which sets a database property.
> Defining a user at the system level is very convenient and practical during 
> the development phase (EOD) of an application - However, the user's password 
> is not encrypted and consequently appears in clear in the derby.properties 
> file. Hence, for an application going into production, whether it is embedded 
> or not, it is preferable to create users at the database level where the 
> password is encrypted.
> There is no real ANSI SQL standard for managing users in SQL but by providing 
> a more intuitive and known interface, it will ease Built-In User management 
> at the database level as well as Derby's adoption.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to