# JBOSS-Security_DatabaseServerLoginModule



## studentxxx (23. Aug 2007)

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>
-->


<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

Gruß


----------



## ms (23. Aug 2007)

Sieht eigentlich gut aus.
Wenn du die SQL-Statements aus der login-config.xml selbst ausführst, bekommst du auch die richtigen Werte?

ms


----------



## Gast (23. Aug 2007)

wenn ich die selbst ausführe, z.B.

select Password from Principals where PrincipalID='Peter'

bekomme ich auch das Passwort von Peter

bzw. bei

select Role, Rolegroup from Roles where PrincipalID='Dominique'

bekomme ich auf die Rolle und die Gruppe.


Wenn ich die selbst ausführe dann funktionierts aber so halt nicht.
Ich benutze den MSSQL, kann das vielleicht sein, dass Jboss als Default auf eine andere Datenbank zugreift. Habe ich vielleicht irgendwas vergessen einzustellen ?


----------



## studentxxx (23. Aug 2007)

sorry hab vorhin den Benutzernamen vergessen. Gast bin also ich ;-)


----------



## studentxxx (23. Aug 2007)

Ich habe gerade mal in der login-config.xml die beiden Fragezeichen weggemacht und dafür 'Peter geschrieben. 
Das funktioniert aber auch nicht.

Also irgendwie greift JBOSS nicht auf die Datenbank zu. Aber das liegt nicht an der mssql-ds.xml, denn die ganz normalen Hibernateabfragen die funktionieren. Ich arbeite ja schon die ganze Zeit mit der Datenbank. Nur diese Loginsache funktioniert nicht.'


----------



## Gast (23. Aug 2007)

die beiden Fragezeichen werden ja eigentlich automatisch ersetzt mit dem Wert des Feldes "j_username" aus meiner login.hmtl Seite.

Irgendwie funktioniert das halt nicht. Hast du vielleicht ne Idee warum?


----------



## ms (23. Aug 2007)

studentxxx hat gesagt.:
			
		

> <login-module code = "org.jboss.security.auth.spi.DatabaseServerLogin*Mo dule*"


Ist das Leerzeichen ist auch in deiner login-config.xml?


----------



## Gast (23. Aug 2007)

nein, da ist kein Leerzeichen


----------



## ms (23. Aug 2007)

Liste doch bitte noch den Inhalt von deinen beiden Tabellen, Principals und Role.

ms


----------



## ms (23. Aug 2007)

studentxxx hat gesagt.:
			
		

> <module-option name = "rolesQuery">SELECT Role, Rolegroup FROM Roles WHERE PrincipalID=?</module-option>
> ...
> *Roles*
> PrincipalID
> ...


Mir ist noch aufgefallen, dass du hier die Spalte *Roles* auflistest und oben auf die Spalte *Role* zugreifst.
Wird aber auch nicht der Grund sein, da sonst eine Exception auftreten müsste.
ms


----------



## Gast (23. Aug 2007)

*Principals*
PrincipalID (varchar 64) (Primärschlüssel)
Password (varchar 64)

als Werte habe ich hier:
Peter und peter
Matthias und matthias


*Roles*
PrincipalID (varchar 64)
Role (varchar 32)
Rolegroup varchar (32)

Als Werte habe ich hier:
Peter und administrator und Roles
Matthias und moderator und Roles
Matthias und student und Roles


----------



## studentxxx (23. Aug 2007)

ms hat gesagt.:
			
		

> studentxxx hat gesagt.:
> 
> 
> 
> ...




Ne sorry, das war ein Tipfehler von mir. Die Tabelle heisst Roles und die Spalte heisst Role


----------



## ms (23. Aug 2007)

Lade dir den Sourcecode von Jboss runter und wirf den Debugger an. Das DatabaseLoginModule müsste glaub ich im jbosssx.jar drinnen sein.
Mehr kann ich leider von hier aus nicht helfen.

ms


----------



## Gast (23. Aug 2007)

2 Fragen hätte ich da noch.

1. muss ich die hsqldb-ds.xml löschen aus dem deploy Verzeichnis ? Wenn ja, muss ich irgendwelche Anpassungen vornehmen

2. Muss das Feld PrincipalID in der Tabelle Roles ein Fremdschlüssel sein, welcher auf den Primärschlüssen PrincipalID in der Tabelle Principals zeigt ?

Danke


----------



## ms (23. Aug 2007)

Gast hat gesagt.:
			
		

> 1. muss ich die hsqldb-ds.xml löschen aus dem deploy Verzeichnis ? Wenn ja, muss ich irgendwelche Anpassungen vornehmen


Nein, Jboss verwaltet die MessageQueues in der hsql-db.



			
				Gast hat gesagt.:
			
		

> 2. Muss das Feld PrincipalID in der Tabelle Roles ein Fremdschlüssel sein, welcher auf den Primärschlüssen PrincipalID in der Tabelle Principals zeigt ?


Wäre stark anzuraten, ist aber nicht zwingend notwendig.

ms


----------



## studentxxx (23. Aug 2007)

Zuletzt noch eine Frage, dann aber auch die letzte. Könnte es sein, dass die LoginModules in der login-config.xml irgendwie durcheinander kommen ? Quasi, dass JBOSS nicht weiss, welches Modul er nehmen soll bzw. das falsche Modul nimmt?

Das ist meine login-config.xml



<?xml version='1.0'?>
<!DOCTYPE policy PUBLIC
      "-//JBoss//DTD JBOSS Security Config 3.0//EN"
      "http://www.jboss.org/j2ee/dtd/security_config.dtd">

<!-- The XML based JAAS login configuration read by the
org.jboss.security.auth.login.XMLLoginConfig mbean. Add
an application-policy element for each security domain.

The outline of the application-policy is:
<application-policy name="security-domain-name">
  <authentication>
    <login-module code="login.module1.class.name" flag="control_flag">
      <module-option name = "option1-name">option1-value</module-option>
      <module-option name = "option2-name">option2-value</module-option>
      ...
    </login-module>

    <login-module code="login.module2.class.name" flag="control_flag">
      ...
    </login-module>
    ...
  </authentication>
</application-policy>

-->




<policy>

    <!-- Used by clients within the application server VM such as
    mbeans and servlets that access EJBs.
    -->
    <application-policy name = "client-login">
       <authentication>
          <login-module code = "org.jboss.security.ClientLoginModule"
             flag = "required">

             <module-option name="restore-login-identity">true</module-option>
          </login-module>
       </authentication>
    </application-policy>


    <application-policy name = "jbossmq">
       <authentication>
          <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule"
             flag = "required">
             <module-option name = "unauthenticatedIdentity">guest</module-option>
             <module-option name = "dsJndiName">java:/DefaultDS</module-option>
             <module-option name = "principalsQuery">SELECT PASSWD FROM JMS_USERS WHERE USERID=?</module-option>
             <module-option name = "rolesQuery">SELECT ROLEID, 'Roles' FROM JMS_ROLES WHERE USERID=?</module-option>
          </login-module>
       </authentication>
    </application-policy>

    <!-- Security domain for JBossMQ when using file-state-service.xml
    <application-policy name = "jbossmq">
       <authentication>
          <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule"
             flag = "required">
             <module-option name = "unauthenticatedIdentity">guest</module-option>
             <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option>
          </login-module>
       </authentication>
    </application-policy>
    -->


    <application-policy name = "HsqlDbRealm">
       <authentication>
          <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
             flag = "required">
             <module-option name = "principal">sa</module-option>
             <module-option name = "userName">sa</module-option>
             <module-option name = "password"></module-option>
             <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=DefaultDS</module-option>
          </login-module>
       </authentication>
    </application-policy>

    <application-policy name = "JmsXARealm">
       <authentication>
          <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
             flag = "required">
             <module-option name = "principal">guest</module-option>
             <module-option name = "userName">guest</module-option>
             <module-option name = "password">guest</module-option>
             <module-option name = "managedConnectionFactoryName">jboss.jca:service=TxCM,name=JmsXA</module-option>
          </login-module>
       </authentication>
    </application-policy>

    <!-- A template configuration for the jmx-console web application. This
      defaults to the UsersRolesLoginModule the same as other and should be
      changed to a stronger authentication mechanism as required.
    -->
    <application-policy name = "jmx-console">
       <authentication>
          <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
             flag = "required">
           <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
           <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
          </login-module>
       </authentication>
    </application-policy>

    <!-- A template configuration for the web-console web application. This
      defaults to the UsersRolesLoginModule the same as other and should be
      changed to a stronger authentication mechanism as required.
    -->
    <application-policy name = "$webConsoleDomain">
       <authentication>
          <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
             flag = "required">
             <module-option name="usersProperties">web-console-users.properties</module-option>
             <module-option name="rolesProperties">web-console-roles.properties</module-option>
          </login-module>
       </authentication>
    </application-policy>

    <!-- A template configuration for the JBossWS web application (and transport layer!).
      This defaults to the UsersRolesLoginModule the same as other and should be
      changed to a stronger authentication mechanism as required.
    -->
    <application-policy name="JBossWS">
      <authentication>
        <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
          flag="required">
          <module-option name="usersProperties">props/jbossws-users.properties</module-option>
          <module-option name="rolesProperties">props/jbossws-roles.properties</module-option>
          <module-option name="unauthenticatedIdentity">anonymous</module-option>
        </login-module>
      </authentication>
    </application-policy>

    <!-- The default login configuration used by any security domain that
    does not have a application-policy entry with a matching name
    -->

  	  <application-policy name = "other">
       <!-- A simple server login module, which can be used when the number 
       of users is relatively small. It uses two properties files:
       users.properties, which holds users (key) and their password (value).
       roles.properties, which holds users (key) and a comma-separated list of
       their roles (value).
       The unauthenticatedIdentity property defines the name of the principal
       that will be used when a null username and password are presented as is
       the case for an unuathenticated web client or MDB. If you want to
       allow such users to be authenticated add the property, e.g.,
       unauthenticatedIdentity="nobody"
       -->
       <authentication>
          <login-module code = "org.jboss.security.auth.spi.UsersRolesLoginModule"
             flag = "required" />
       </authentication>
    </application-policy>      




    <application-policy name = "vek_ng">
       <authentication>
          <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule"
             flag = "required">
             <module-option name = "dsJndiName">java:/jdbc/vek_ng</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>



</policy>





vielen dank!


----------



## ms (23. Aug 2007)

studentxxx hat gesagt.:
			
		

> Zuletzt noch eine Frage, dann aber auch die letzte. Könnte es sein, dass die LoginModules in der login-config.xml irgendwie durcheinander kommen ? Quasi, dass JBOSS nicht weiss, welches Modul er nehmen soll bzw. das falsche Modul nimmt?


In jboss-web.xml legst du die fest welches login-module verwendet werden soll.


```
jboss-web.xml

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

ms


----------



## studentxxx (23. Aug 2007)

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 glaub ich komme der Sache näher ?


----------



## ms (23. Aug 2007)

Hast du etwas geändert dass das jetzt passiert?
Wenn ja, was denn?

ms


----------



## studentxxx (23. Aug 2007)

ich habe den JBOSS neu konfiguriert und alles neu gemacht.

Aber, ist alles genauso wie auf der ersten Seite!

Was könnte denn jetzt der Fehler sein?hm


----------



## ms (23. Aug 2007)

Entweder funktioniert die Abfrage mit den Berechtigungen nicht oder du leitest auf eine URL weiter, für die der Benutzer keine Rechte hat.

ms


----------



## studentxxx (23. Aug 2007)

Hm in der web.xml steht doch aber "/*"

und ich versuche mich mit dem Peter einzuloggen, der diese Admin-Rechte hat.

Kann es vielleicht mit dem realm-name zu tun haben ?


----------



## ms (23. Aug 2007)

Bei mir ist der <web-resource-name> gleich wie der <realm-name>.
Weis aber ehrlichgesagt jetzt nicht ob das wirklich hilft. Probiers aus.

ms


----------



## studentxxx (23. Aug 2007)

nein, daran liegt es leider auch net :-(

Komisch ist, dass er mir nur die 403-Message anzeigt wenn ich wirklich den Usernamen und Passwort korrekt eingebe, also übereinstimmend mit den Werten in der Datenbank. Wenn ich eins von den beiden falsch eintrage beim Login bekomme ich ganz normal die error.html Seite


----------



## ms (23. Aug 2007)

Die Anmeldung besteht aus zwei Teilen.
Authentifizierung und Autorisierung.
Die Authentifizierung klappt, die Autorisierung aber nicht.
Schau nochmal nach ob die Abfrage auf die 'Roles'-Tabelle funktioniert.

ms


----------



## ms (23. Aug 2007)

Nochwas, beschreib mal bitte den Ablauf deiner Anmeldung, also welche Seite rufst du auf und was genau passiert.

ms


----------



## studentxxx (23. Aug 2007)

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 sich das Passwort nicht.

Irgendwas stimmt mit der Abfrage:
"select Password from Principals where PrincipalID=?"

nicht!!!


----------



## studentxxx (23. Aug 2007)

Ne hatte unrecht. Das Passwort bekommt er auch korrekt. Da sonst die 403-Fehlerseite nicht erscheinen würde. Also die authorisierung funktioniert, die authentifizierung jedoch noch nicht komischer Weise..


----------



## ms (24. Aug 2007)

Problem schon gelöst?

ms


----------



## studentxxx (24. Aug 2007)

Yep, Problem gelöst. Das lag irgendwie an den Tabellen. Ich habe sie gelöscht und neu erstellt, dann gings. Das ganze ist mir zwar noch ein vodoo-problem  aber naja es funktioniert jetzt.

Zuzüglich sollte die Tabelle, wo auch das Passwort drin gespeichern wird nicht User heissen, da dieser Name anscheinend intern irgendwie benutzt wird. der server.log hat mir sehr weitergeholfen nachdem ich in der log4j einige Ergänzungen gemacht habe, die er auch rausspucken sollte.

Danke trotzdem ms..


----------

