cpliu338
cpliu338

Reputation: 647

Glassfish 3.1.2 JDBCRealm configuration

Hi I have read Glassfish 3.1.2's JDBCRealm has a new Password Encryption Algorithm field. What is it for? and googled for similar topics but it seems no definitive answer has been published.

In short, I have a jdbc realm working in glassfish 3, when I upgrade to 3.1.2, same configuration does not work. According to the previous thread, I have set the JaasContext to jdbcDigestRealm (in addition to jdbcRealm which also does not work), set the Digest Algorithm to MD5 (I used MD5 in v 3 and it worked). For Password Encryption Algorithm I tried 'blank', and 'hex', both do not work.

Could someone please tell me how I should configure. My credentials table is based on mysql with MD5 hashed passwords according to http://jugojava.blogspot.hk/2011/02/jdbc-security-realm-with-glassfish-and.html.

Upvotes: 7

Views: 8854

Answers (5)

al.
al.

Reputation: 504

There is a somewhat more detailed guide here -> http://is.gd/Jx6Gnp

Upvotes: 0

Algiz
Algiz

Reputation: 1288

I succeed to make it works with the following settings. I add a few comments with my current (mis)understanding.

  • JAASContext = "jdbcRealm" => The value must be set according to file 'glassfish3/glassfish/domains/domain1/config/login.conf'. By default, the class 'com.sun.enterprise.security.auth.login.JDBCLoginModule' (which implement the JDBCrealm) is configured under "jdbcRealm". There is another login module configured under "jdbcDigestRealm". This one is not part of the current topic.
  • JNDI = "..." => I put there the name of a datasource that already exists for the database of my application.
  • UserTable = "MY_SCHEMA.usertable" => The 'full qualified name' of the database table.
  • UserNameColumn = "userid" => column name where you store the user name
  • PasswordColumn = "password" => column name where you store the (hash of the) user passsword.
  • GroupTable = "MY_SCHEMA.grouptable" => The 'full qualified name' of the database table.
  • GroupTableUserNameColumn = "" => no clue about the usage of this...
  • GroupNameColumn = "groupid" => column name where you store the user name
  • AssignGroups = "" => As far as I understand the GF code, this is a way to assign a list of groups to every user registered in the realm. It's kind of hard-coding. More or less every realm available on GlassFish (could) make use of this property.
  • DatabaseUser = "" => As I understood, you need this if you aren't using the JNDI (the second parameter).
  • DatabasePassword = "" => As I understood, you need this if you aren't using the JNDI (the second parameter).
  • DigestAlgorithm = "SHA-256" => 'MD5', 'SHA-1' or 'SHA-256'. 'SHA-256' is the default. Let's take 'SHA-256'.
  • PasswordEncryptionAlgorithm = "AES" => The digest algorithm is applied to the password before storing the password. The new password encryption is an added layer of security which allows the "hash" (the string after the DA has been applied to the password) to be encrypted. In this way, if an attacker retrieves the passwords from the database they are encrypted and hashed. It's highly unlikely that such data would be useful to an attacker.
  • Encoding = "Hex" => You have the choice between 'Hex' or 'Base64'. Hex was convenient for me.
  • Charset = "" => As my database does not have an 'exotic' charset, I do not think I need to set something smart there. I leave it blank and it works.

Hope it will help.

PS: If somebody have a link to REAL documentation (not the official one which is completly useless at this moment), please, put a link here.

Upvotes: 15

LDE
LDE

Reputation: 141

I spent a while today playing with this (Java EE 7, Glassfish 4 on Ubuntu 12.04). As it turns out, most of the fields on the Realm Page are not needed. The following fields were the only ones that are needed to establish a successful connection to the database.

  • Realm Name - Any name, as long as you use the same name in web.xml

  • JAAS Context - Any Name

  • JNDI - Any Name (I used jdbc/DB Name)

  • User Table - Table which contains all the users

  • User Name column - Column in the users table which contains your user-names

  • Password - Column which contains hashed passwords (SHA 256)

  • Group Table - Table which contains groups

  • Group Name Column - Column in the groups table which contain group names

I left everything else blank. My database password column had the password hashed using SHA 256.

I tested this by filling in random text in the 'Password Encryption' field and saving it. Redeployed my application and restarted Glassfish 4. Still worked. This means that the field, while still present is not being read anymore.

P.S - The real documentation as mentioned in the first answer is still quite poor.

Upvotes: 1

user1769372
user1769372

Reputation: 1

I have two variations to the jdbcRealm issue. The first existed from a domain that was created using GF 3.1.1 which continued to work after updating the GF server to the 3.1.2.2 release. I then created a new domain on this server. The new domain was configured using the jdbcRealm. All of the parameters were the same for the 3.1.1 configuration except for the "Password Encryption Algorithm" which didn't exist under the 3.1.1 configuration screen. When I tried to login using my Web Application I was constantly getting the "jdbcrealm.invaliduserreason[#]" error in the log file.

The only way that I was able to resolve and to successfully login to my application was by adding the AES to the "Password Encryption Algorithm" field. I saved the change and restarted the server and once again I am able to successfully authenticate users from the jdbcRealm connection.

Upvotes: 0

Erwin
Erwin

Reputation: 542

First things first. What is your log output? What are the symptoms of your "not working problem"? Did basic-authentication pop-up window occurred? Did you get

No login module configured for jdbcDigestRealm 

or other error message?

change security log level if don't have any log output from unsuccessful login attempt.

Upvotes: 0

Related Questions