JBOSS-Security_DatabaseServerLoginModule

studentxxx

Grünschnabel
Hi, der Loginvorgang klappt bei mir nicht. Obwohl der User in der Datenbank drin steht, bekomme ich ständig die error.html Seite zu sehen. Von Eclipse bekomme ich keine Fehlermeldung. Ich finde den Fehler nicht. Könnt ihr mir bitte helfen. Folgende Einstellungen habe ich vorgenommen. (Ich benutze JBOSS 4)

in security-login.config

<application-policy name = "test">
<authentication>
<login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginMo dule"
flag = "required">
<module-option name = "dsJndiName">java:/jdbc/test</module-option>
<module-option name = "principalsQuery">SELECT Password FROM Principals WHERE PrincipalID=?</module-option>
<module-option name = "rolesQuery">SELECT Role, Rolegroup FROM Roles WHERE PrincipalID=?</module-option>
</login-module>
</authentication>
</application-policy>


in web.xml

<security-constraint>
<web-resource-collection>
<web-resource-name>myResources</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>administrator</role-name>
<role-name>moderator</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>FORM</auth-method>
<realm-name>test</realm-name>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/error.html</form-error-page>
</form-login-config>
</login-config>

<security-role>
<description>Rechte für Admin</description>
<role-name>administrator</role-name>
</security-role>

<security-role>
<description>Rechte für Moderator</description>
<role-name>moderator</role-name>
</security-role>

<security-role>
<description>Rechte für Student</description>
<role-name>student</role-name>
</security-role>


in jboss-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain>java:/jaas/test</security-domain>
</jboss-web>


in mssql-ds

<datasources>
<local-tx-datasource>
<jndi-name>jdbc/test</jndi-name>
<connection-url>jdbc:sqlserver://localhost;DatabaseName=TEST</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver </driver-class>
<user-name>root</user-name>
<password>root</password>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->

<!-- sql to call on an existing pooled connection when it is obtained from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->

<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>MS SQLSERVER2000</type-mapping>
</metadata>
</local-tx-datasource>

</datasources>


Dann habe ich in meiner Datenbank 2 Tabellen mit folgenden Attributen

Principals
PrincipalID
Password


Roles
PrincipalID
Roles
Rolegroup



Und dann natürlich die beiden Seiten (login.html und und error.html, die ich jetzt nicht mit aufschreibe). FileBased (UsersRolesLoginModul) hatte einwandfrei funktioniert, ich habe mir 100 mal die Einstellungen angeguckt, ob irgendein Verweis falsch ist etc. aber ich finde nichts und verstehe nicht warum ich nach dem Submit ständig die error.html zu sehen bekomme. Der User, mit dem ich mich einlogge ist auch in der Datenbank drin und hat die Rolle "administrator".

Mit der Bitte um schnelle Hilfe
 
Hallo,

also auf den ersten Blick sieht alles normal aus. Was sagt denn die server.log zu deinen Anmeldeversuchen? Könnte es eventuell sein, dass die Datasource nicht richtig deployed wurde (fehlender Treiber etc.)

THMD
 
Der aktuelle Status ist jetzt anders:

Wenn ich mich mit einem User einlogge, der in der Datenbank drin ist bekomme ich jetzt folgende HTML-Fehlermeldung

"HTTP Status 403 - Access to the requested resource has been denied"


und wenn ich mich mit einem User einlogge, der nicht in der Datenbank drin ist bekomme ich ganz normal die error.html zu sehen.


Ich habe mir gerade den Spy-tool für JBOSS installiert. Er zeigt alle abgehenden SQL_Queries an. Folgende Ausgabe bekomme ich


1187879878968|31|0|statement|select Password from Principals where PrincipalID=?|select Password from Principals where PrincipalID='Peter'

1187879878984|0|0|statement|select Role, Rolegroup from Roles where PrincipalID=?|select Role, Rolegroup from Roles where PrincipalID='Peter'

1187879878984|-1||resultset|select Role, Rolegroup from Roles where PrincipalID='Peter'|Role = administrator , Rolegroup = Roles



Wie zu sehen ist, holt er bzw. merkt er sich das Passwort nicht.
 
Hallo,

also auf den ersten Blick sieht alles normal aus. Was sagt denn die server.log zu deinen Anmeldeversuchen? Könnte es eventuell sein, dass die Datasource nicht richtig deployed wurde (fehlender Treiber etc.)

THMD

Welche Datasource meinst du denn ? Also nachdem ich deployed habe, habe ich auch kontrolliert ob alles im Deployverzeichnis von JBOSS korrekt drin ist. web.xml, j-boss-web.xml, login.html, error.html. Und die waren/sind korrekt drin.

Die anderen sind ja sowieso irrelevant für den Deployvorgang. (z.B. login-config)
Ist ja sowieso schon im JBOss-Ordner.

Deshalb verstehe ich nicht, was genau du meinst mit "Datasource richtig deployed" und "treiber" ?
 
Hallo,

Deshalb verstehe ich nicht, was genau du meinst mit "Datasource richtig deployed" und "treiber" ?
Ich meinte damit die mssql-ds. Nur weil die entsprechende XML-Datei im deploy Verzeichniss liegt, bedeutet das nicht, dass du (bzw. der JBoss) auf sie auch über JNDI zugreifen kannst. Mit Treiber meinte ich den JDBC-Treiber für deine Datenbank.

Aber daran liegts ja wohl nicht :), weil
"HTTP Status 403 - Access to the requested resource has been denied"

und wenn ich mich mit einem User einlogge, der nicht in der Datenbank drin ist bekomme ich ganz normal die error.html zu sehen.
...
Wie zu sehen ist, holt er bzw. merkt er sich das Passwort nicht.
bedeutet, dass er das Passwort sehr wohl hat - du bist also angemeldet. Offensichtlich
geht beim holen der Rollen was schief, so daß du nicht authorisiert bist, auf die Ressource zuzugreifen.

Ich würde jetzt mal vermuten, das Query für die Rollen liefert nicht das, was der JBoss gerne möchte. Was steht eigentlich in deiner Rolegroup-Spalte?

THMD
 
Das Ergebnis der Abfrage stand ja oben, hier nochma:

1187879878968|31|0|statement|select Password from Principals where PrincipalID=?|select Password from Principals where PrincipalID='Peter'

1187879878984|0|0|statement|select Role, Rolegroup from Roles where PrincipalID=?|select Role, Rolegroup from Roles where PrincipalID='Peter'

1187879878984|-1||resultset|select Role, Rolegroup from Roles where PrincipalID='Peter'|Role = administrator , Rolegroup = Roles


Die Eingabe des Usernames wird korrekt gelesen und das Passwort anscheinend auch (denn nur wenn beides stimmt bekomme ich diese 403-Seite). Das er auch auf die Datenbank zugreift zeigen uns die letzten beiden Zeilen oben (Resultset)
anhand von Peter holt er sich die Rolle=administrator. Und in der web.xml ist ja festgehalten, dass administrator das Recht dazu hat die Anwendung zu betreten.



Deine Vermutung trifft 100% zu, ich kenne allerdings noch nicht den Grund.


Also die Tabelle "Roles" hat die Spaltan (PrincipalID, Role, Rolegroup) und hat mittlerweile folgende Datensätze:

Peter , administrator, Roles
Matthias, moderator, Roles
Matthias, student, Roles
Alf, student, Roles



Und mein Login-config.xml hat aktuelle folgenden Eintrag:


<application-policy name="test">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="dsJndiName">java:/test</module-option>
<module-option name="principalsQuery">select Password from Principals where PrincipalID=?</module-option>
<module-option name="rolesQuery">select Role, 'Roles' from Roles where PrincipalID=?</module-option>
</login-module>
</authentication>
</application-policy>



Und spy.log spuckt das hier aus:

1187886461234|31|0|statement|select Password from Principals where PrincipalID=?|select Password from Principals where PrincipalID='Peter'
1187886461265|15|0|statement|select Role, 'Roles' from Roles where PrincipalID=?|select Role, 'Roles' from Roles where PrincipalID='Peter'
1187886461265|-1||resultset|select Role, 'Roles' from Roles where PrincipalID='Peter'| = Roles, Role = administrator
 
Zuletzt bearbeitet:
Hm,

dann probier doch mal bitte für die Rollen ein Query, analog zu dem in dem Tutorial, das Thomas verlinkt hat.
Code:
SELECT Role, 'Roles' FROM Roles WHERE PrincipalID=?

THMD
 
Sorry, hatte parallel den letzten Beitrag von mir geändern. Schau doch noch mal drauf.

Mit 'Roles' habe ich es auch schon probiert!
 
Hallo,

sehr seltsam das ganze. Aktiviere doch mal bitte das Logging für die Security-Klassen
Siehe Q4 in der FAQ.

Und wenn du dabei bist, probiere doch mal bitte auch Q3 aus - also zusätzlich zum DatabaseServerLoginModule noch ein ClientLoginModule definieren.

Du benutzt aber schon den internen Tomcat vom JBoss und nicht irgendeinen externen, oder?

THMD
 
Zurück