Comment puis-je obtenir de la demande.méthode d'ouverture de session de travail avec un jdbcRealm?
Je suis en train d'utiliser la Servlet 3.0 demande.login(nom d'utilisateur, mot de passe) méthode de travail avec un jdbcRealm, mais quelque chose semble incorrect. Il existe de nombreux articles sur la façon d'obtenir le jdbcRealm de travail avec le FORMULAIRE d'authentification, et beaucoup sur la façon d'utiliser la nouvelle demande.méthode de connexion, mais je n'ai pas vu de montrer que les deux travaillent ensemble.
Serveur D'Applications GlassFish 3.1.2
L'IDE Netbeans 7.3
SGBDR: SQL Server 2008 R2
JDBC - Microsoft JDBC 4.0 pilote
J'apprécierais un peu d'assistance de la communauté sur la façon d'obtenir ce travail. Merci à l'avance!
D'abord, je suis l'envoi d'un appel ajax jquery dans mon SignInService servlet. Je suis d'encodage du mot de passe à l'aide de la jsSHA bibliothèque en SHA-512 avant de l'envoyer:
var encodedPassword = new jsSHA($("#omSignInPassword").val(), "TEXT");
$.ajax({
url: "SignInService",
data: {
username : $("#SignInUserName").val(),
password : encodedPassword.getHash("SHA-512", "HEX")
}
...
});
C'est ce que google Chrome montre est adressé:
username:admin
password:b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86
La servlet prend juste les paramètres de la requête et tente de se connecter:
username = request.getParameter(PARAM_USERNAME);
password = request.getParameter(PARAM_PASSWORD);
request.login(username, password);
Ce sont les erreurs que je vois dans la GlassFish console:
SÉVÈRE: jdbcrealm.invaliduserreason AVERTISSEMENT: WEB9102: Web Échec de la Connexion: com.soleil.de l'entreprise.de sécurité.auth.connexion.commun.LoginException: échec de la Connexion: l'Exception de Sécurité
SÉVÈRE: Servlet Exception: javax.servlet.ServletException: Exception levée lors de la tentative d'authentification pour l'utilisateur: admin
AVERTISSEMENT: DPL5032:Une méthode d'authentification n'a pas été défini dans le web.xml descripteur. L'aide de BASE par défaut pour la connexion de configuration.
AVERTISSEMENT: Aucun des Directeurs mappé à un Rôle [Utilisateur].
Maintenant, à la configuration...
Voici mon web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<login-config>
<realm-name>omRealm</realm-name>
</login-config>
<security-role>
<description/>
<role-name>User</role-name>
</security-role>
</web-app>
Table Utilisateur:
CREATE TABLE [OM_SECURITY].[User](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](32) NOT NULL,
[Password] [char](128) NOT NULL,
[LastName] [nvarchar](32) NULL,
[FirstName] [nvarchar](32) NULL,
[Email] [nvarchar](64) NULL
) ON [PRIMARY]
Un enregistrement existe dans ce tableau:
1 admin B109F3BBBC244EB82441917ED06D618B9008DD09B3BEFD1B5E07394C706A8BB980B1D7785E5976EC049B46DF5F1326AF5A2EA6D103FD07C95385FFAB0CACBC86 NULL NULL NULL
(le mot de passe est "password" pour l'instant)
Ici est le point de Vue utilisé pour mettre chaque utilisateur dans le groupe "User". C'est très basique et va changer plus tard une fois que j'ai la fonctionnalité de base en place. Je ne prévoyez pas d'utiliser JAAS Rôles que mes exigences de la demande semble être beaucoup plus complexe que ce qu'ils fournissent. C'est probablement une autre discussion, à moins d'une certaine manière cela a un impact sur l'authentification:
CREATE VIEW [OM_SECURITY].[SignInGroup]
AS
SELECT 'User' AS GroupName, Name AS UserName
FROM OM_SECURITY.[User]
Le pool de connexion a été testé et il fonctionne très bien. Le Domaine a été mis en place dans le server-config section et non pas la valeur par défaut-config.
JAAS Context: jdbcRealm
JNDI: jdbc/omSecurity
User Table: OM_SECURITY.User
User Name Column: Name
Password Column: Password
Group Table: OM_SECURITY.SignInGroup
Group Table User Name Column: UserName
Group Name Column: GroupName
Assign Groups: (blank)
Database User: (blank)
Database Password: (blank)
Digest Algorithm: SHA-512
Password Encryption Algorithm: AES
Encoding: Hex
Charset: (blank)
Si quelqu'un peut me dire ce fichier stocke le Domaine de Connexion et de configuration de Pool, je vais poster ici en tant que XML à la place.
Cela a également été affiché sur le GlassFish forum ici:
http://www.java.net/forum/topic/glassfish/glassfish-webtier/using-servlet-requestlogin-jdbcrealm
Mise à jour: je viens de déposer un rapide basée sur un formulaire de connexion et il est également défaut, de sorte que le problème semble être à mon royaume. J'ai ajusté le niveau de journal pour:
Configurations\
server-config\
Logging\
Journal Des Niveaux\
javax.de l'entreprise.système.de base.sécurité = FIN
ET
com.microsoft.sqlserver.jdbc = FIN
La requête est en cours d'exécution fine selon SQL Server, il n'y a pas des exceptions générées à partir d'un Pool de Connexion:
FINE: SQLServerPreparedStatement:3: calling sp_prepexec: PreparedHandle:0, SQL:SELECT Password FROM omUser WHERE Name = @P0
Si c'était une réponse, je voudrais marquer "correct"
OriginalL'auteur Graham | 2012-11-04
Vous devez vous connecter pour publier un commentaire.
Je l'ai mentionné dans le commentaire que ce tutoriel est vraiment très bon, très complet: http://www.nabisoft.com/tutorials/glassfish/securing-java-ee-6-web-applications-on-glassfish-using-jaas
J'ai décidé de suivre les étapes, et je le change un peu de sa mise en œuvre, essentiellement à l'aide de JSF /Managed Beans /Cdi... Ici tous les détails de mes modifications:
Avec attention les étapes 8 et 9 pour l'installation de votre Royaume correctement.
http://www.jaider.net/archives/825-securing-java-ee-6-on-glassfish-using-jaas/
OriginalL'auteur Jaider
Vous vous connectez avec
où le mot de passe est déjà haché. Je crois que la demande.login() prend la version en texte brut, ce qui le conteneur, puis compare à la version cryptée dans la base de données.
Comme une note de côté, il est généralement considéré comme une mauvaise pratique pour hacher le mot de passe sur le client, il doit être envoyé en texte brut via le protocole ssl. Le hachage (+sel) dans votre base de données est utilisée pour empêcher un pirate de pouvoir se connecter en tant qu'un autre utilisateur si ils compromise votre base de données. Le stockage des mots de passe hachés empêche cela, mais seulement si votre serveur accepte la plaine de texte mot de passe. Si elle accepte le hachage de mot de passe, puis ils ont tous ils ont besoin.
Je suis d'accord que le protocole SSL est la meilleure façon d'envoyer les informations de connexion. J'ai l'intention d'ajouter qu'une fois que j'ai la fonctionnalité de base de travail. Je n'étais pas sûr si j'ai besoin de faire correspondre l'algorithme de codage déclaré dans le domaine.
Avez-vous essayé de changer le Mot de passe de l'Algorithme de Chiffrement champ to: aucun (ou laisser vide & ignorer l'avertissement)?
Exactement la même erreur. J'ai changé le Mot de passe champ de type varchar(128).
Je travail maintenant avec un formulaire de connexion, mais à la remarque que vous avez été très correct en disant que je ne devais pas être le codage du mot de passe.
OriginalL'auteur Tim
Basé sur mon expérience à l'aide de jdbcRealm de Glassfish,
ici le mot de passe doit contenir la plaine mot de passe entré par l'utilisateur et non hachés l'un parce que c'est le travail de la jdbcRealm. Qui pourrait expliquer pourquoi vous obtenez une erreur d'authentification depuis le hachage de mot de passe que vous avez utilisé comme valeur pour le mot de passe sera toujours haché basée sur le royaume de configuration.
Voici mon jdbcRealm configuration de la dernière fois que j'ai fait:
OriginalL'auteur Fritz