Tomcat 9 mit Datasource Realm auf eine H2 Datenbank

schuchi

Neues Mitglied
Hallo
Habe ein Problem und ich sehe die lösung nicht und habe keine Idee mehr was ich noch ausprobieren kann.
Ich möchte einen Tomcat 9 mit einer Datasource Realm auf einer H2 Datenbank erstellen.
Funktioniert eigentlich, sobald ich das Passwort aber verschlüsselt ablegen will, funktioniert der Login nicht mehr.

H2 Version 2.1.214
Apache Tomcat 9.0.65
openjdk version "17.0.4.1"

die Relevanten Teile der server.xml
XML:
<GlobalNamingResources>
<Resource auth="Container" driverClassName="org.h2.Driver" maxIdle="3" maxTotal="10" name="milliways" username="milliways" password="milliways"  type="javax.sql.DataSource"  url="jdbc:h2:/home/is/testdb/milliways;SCHEMA=MILLIWAYS" />
  </GlobalNamingResources>
 
        <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="milliways" roleNameCol="role_name" userCredCol="user_pass" userNameCol="user_name" userRoleTable="user_roles" userTable="users">
        
            <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler"
                              algorithm="SHA-256"
                              iterations="111"
                              encoding="UTF-8"
               />
          </Realm>     
      </Realm>

die Relevanten Teile aus der web.xml
XML:
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>milliways</realm-name>
    <form-login-config>
      <form-login-page>/login/login.jsp</form-login-page>
      <form-error-page>/login/loginError.jsp</form-error-page>
    </form-login-config>
  </login-config>
 
  <security-constraint>
    <display-name>protected</display-name>
    <web-resource-collection>
      <web-resource-name>protected</web-resource-name>
      <url-pattern>/protected/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>protected</role-name>
    </auth-constraint>
    <user-data-constraint>
      <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
  </security-constraint>
  <security-role>
    <role-name>protected</role-name>
  </security-role>

Datenbank anlegen
SQL:
create schema MILLIWAYS;
set schema MILLIWAYS;
 create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(50) not null
);

create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);

User Passwort und User Roles einfügen
SQL:
insert into users (user_name,user_pass) values ('ingo',HASH('SHA-256',STRINGTOUTF8('passwort'),111));
insert into user_roles (user_name,role_name) values('ingo','protected');

Ohne Verschlüsseltes Passwort funktioniert es, also müsste es doch an der Verschlüsselung liegen.
Für mich sieht das speichern des Passwortes und der CredentialHandler vom Tomcat aber gut aus.
Sieht jemand gerade was ich da mache ?

Besten Dank für die Hilfe
 
Eine mögliche Lösung für dieses Problem könnte sein, dass du überprüfst, ob du die HASH-Funktion in der insert-Anweisung richtig verwendest. Du solltest sicherstellen, dass du das Passwort in der gleichen Weise verschlüsselst, wie du es in der CredentialHandler-Klasse in der server.xml festgelegt hast. Es sieht so aus, als ob du in der insert-Anweisung SHA-256 und 111 Iterationen verwendest, aber in der CredentialHandler-Klasse hast du UTF-8 als Codierung festgelegt. Stelle sicher, dass du in beiden Fällen die gleichen Einstellungen verwendest.

Eine weitere Möglichkeit wäre, dass du überprüfst, ob alle notwendigen Tabellen und Spalten in der Datenbank vorhanden sind und ob die Werte, die du einfügst, korrekt sind. Stelle sicher, dass du die korrekten Spaltennamen und Tabellennamen verwendest und dass die Werte, die du einfügst, den Spaltentypen entsprechen.
 
Da wäre jetzt die Frage, ob er sich nach zwei Monaten immer noch nicht anmelden kann? 🙂

Was ganz anderes: 111 Iterationen sind natürlich völlig für die Katz'. Da kannst Du locker drei Nullen anhängen, dann fängts ganz allmählich an, sinnvoll zu werden.
 
Habe das problem halt mit java gelöst.
org.apache.commons.codec.digest.DigestUtils.sha256Hex(passwort)
gibt das verschlüsselte passwort zurück wo tomcat lesen kann.
 

Neue Themen


Zurück
Oben