2013-07-03 19 views
11

Ich versuche, ein Servlet in Tomcat 6 mit Shiro authentifizieren.Mit JDBCRealm authentifizieren Benutzer mit Shiro

Ich habe folgende shiro.ini Datei:

[main] 
ps = org.apache.shiro.authc.credential.DefaultPasswordService 
pm = org.apache.shiro.authc.credential.PasswordMatcher 
pm.passwordService = $ps 

aa = org.apache.shiro.authc.credential.AllowAllCredentialsMatcher 
sm = org.apache.shiro.authc.credential.SimpleCredentialsMatcher 

jof = org.apache.shiro.jndi.JndiObjectFactory 
jof.resourceName = jdbc/UserDB 
jof.requiredType = javax.sql.DataSource 
jof.resourceRef = true 

realm = org.apache.shiro.realm.jdbc.JdbcRealm 
realm.permissionsLookupEnabled = true 
realm.credentialsMatcher = $pm 
; Note factories are automatically invoked via getInstance(), 
; see org.apache.shiro.authc.config.ReflectionBuilder::resolveReference 
realm.dataSource = $jof 

securityManager.realms = $realm 

[urls] 
/rest/** = authcBasic 
/prot/** = authcBasic 

und folgende Unterlagen in meiner Datenbank:

mysql> select * from users; 
+----------+------------------+----------+----------------------------------------------+--------------------------+ 
| username | email   | verified | password          | password_salt   | 
+----------+------------------+----------+----------------------------------------------+--------------------------+ 
| admin | [email protected]********* |  1 | ojSiTecNwRF0MunGRvz3DRSgP7sMF9EAR77Ol/2IAY8= | eHp9XedrIUa5sECfOb+KOA== | 
+----------+------------------+----------+----------------------------------------------+--------------------------+ 
1 row in set (0.00 sec) 

Wenn ich die SimpleCredentialsManager verwenden es authentifiziert Bußgeld gegen ein Klartext-Passwort in der Tabelle users . Der Versuch, das PasswordMatcher zu verwenden, war extrem frustrierend.

Das Passwort und Passwort_Salz wurden über das Dienstprogramm shiro-tools Hasher erhalten.

Wenn ich versuche, gegen eine grundlegende HelloWorld Servlet ich für den Test (path = rest/hallo, context =/ws) für die Authentifizierung verwenden, erhalte ich die folgende in den Protokollen:

15:35:38.667 [http-8080-2] TRACE org.apache.shiro.util.ClassUtils - Unable to load clazz named [ojSiTecNwRF0MunGRvz3DRSgP7sMF9EAR77Ol/2IAY8=] from class loader [WebappClassLoader 
    context: /ws 
    delegate: false 
    repositories: 
    /WEB-INF/classes/ 
----------> Parent Classloader: 
[email protected] 
] 

(Vollprotokoll an https://gist.github.com/recurse/5915693)

Es scheint zu versuchen, mein Hash-Passwort als Klassenname zu laden. Ist das ein Fehler oder ein Konfigurationsfehler meinerseits? Wenn es ein Fehler ist, wie kann ich es umgehen? Wenn es ein Konfigurationsfehler ist, was fehlt mir?

+0

genau das, was ich suchte, danke, btw folgte Sie eine Anleitung für diese Art von eingerichtet? Ich habe versucht, meinen jdbc-Bereich mit Sha-Hashes zu integrieren und konnte keine relevanten Tutorials finden. – abdu

+0

Nein. Ich habe die Dokumentation auf der Shiro-Site gelesen, um die grundlegende Struktur der API zu verstehen. Dann habe ich den Code ausgecheckt und die JDBC-Konfiguration rückgängig gemacht. – Recurse

Antwort

9

Zuerst, vielen Dank für die Bereitstellung von Informationen für diese Frage - es macht die Bereitstellung einer Antwort viel einfacher.

Wenn Sie Ihre Beispieldatenbankzeilenliste betrachten, scheint es nicht, dass Sie die Ausgabe speichern, die PasswordService erwartet, wenn Sie einen Hash-Passwortvergleich durchführen. Zum Beispiel:

$ java -jar ~/.m2/repository/org/apache/shiro/tools/shiro-tools-hasher/1.2.2/shiro-tools-hasher-1.2.2-cli.jar -p 
Password to hash: 
Password to hash (confirm): 
$shiro1$SHA-256$500000$uxaA2ngfdxdXpvSWzpuFdg==$hOJZc+3+bFYYRgVn5wkbQL+m/FseeqDtoM5mOiwAR3E= 

Der String, der mit $shiro1$ beginnt, ist, was Sie in die password Spalte in der Datenbank speichern würde. Es besteht keine Notwendigkeit für eine separate Salzsäule, da alle Informationen, die Shiro benötigt, in der $shiro1$... Schnur sind.

Die DefaultPasswordService verwendet die gleichen Standardkonfigurationsparameter (SHA-256, 500.000 Iterationen usw.). Wenn Sie das Hasher CLI-Tool wie oben gezeigt verwenden (keine zusätzliche Hash-Algorithmus-Konfiguration), müssen Sie dies nicht tun passen Sie die DefaultPasswordService POJO noch weiter an. Wenn Sie jedoch die Hashing-Parameter auf der CLI ändern, müssen Sie sicherstellen, dass die gleichen Parameter für die Bean DefaultPasswordService (und/oder ihren internen HashingService) konfiguriert sind.

Wenn Sie noch testen und Ihr DB-Schema ändern können, empfehle ich Ihnen, dies jetzt zu tun, um ein einzelnes Passwortfeld zu haben, in dem die Zeichenfolge $shiro1$... gespeichert wird. Dann verwenden Sie den Password wie hier dokumentiert unter Nutzungs:

http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authc/credential/PasswordService.html

+0

Die Konfiguration in 'shiro.ini' ist auf der Seite ** Usage ** beschrieben, die von @LesHazlewood verlinkt wird. Zur Konfiguration in Java siehe hier: https://stackoverflow.com/a/45225711/2969332 –

Verwandte Themen