Pytanie Używanie JDBCRealm do uwierzytelniania użytkownika za pomocą Shiro


Próbuję uwierzytelnić serwlet działający w Tomcat 6 przy użyciu Shiro.

Mam następujący plik shiro.ini:

[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

I następujące w mojej bazie danych:

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

Jeśli używam SimpleCredentialsManager uwierzytelnia się dobrze przeciwko hasłu w postaci zwykłego tekstu w tabeli użytkowników. Próbujesz użyć PasswordMatcher był niezwykle frustrujący.

Hasło i password_salt zostały uzyskane za pomocą shiro-tools Hasher użyteczność.

Kiedy próbuję uwierzytelnić się na podstawowym HelloWorld servlet, którego używam do testowania (path = rest / hello, context = / ws), otrzymuję następujące informacje w dziennikach:

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:
org.apache.catalina.loader.StandardClassLoader@79ddd026
]

(Pełny log na https://gist.github.com/recurse/5915693 )

Wygląda na to, że próbuję załadować moje hasłowe hasło jako nazwę klasy. Czy to błąd, czy błąd konfiguracji z mojej strony? Jeśli jest to błąd, jak mogę go obejść? Jeśli jest to błąd konfiguracji, czego mi brakuje?


11
2017-07-03 05:43


pochodzenie


właśnie to, czego szukałem, dziękuję, btw czy skorzystałeś z samouczka dla tego rodzaju konfiguracji? Próbowałem zintegrować moją domenę jdbc z sha hashe i nie mogłem znaleźć żadnych odpowiednich tutoriali. - abdu
Nie. Czytałem dokumentację na stronie Shiro, aby zrozumieć podstawową strukturę API; następnie sprawdziłem kod i przetasowałem konfigurację JDBC. - Recurse


Odpowiedzi:


Po pierwsze, dziękuję za dostarczenie dużej ilości informacji na to pytanie - to sprawia, że ​​udzielenie odpowiedzi jest o wiele łatwiejsze.

Patrząc na przykładową listę wierszy bazy danych, nie wydaje się, że przechowujesz dane wyjściowe oczekiwane przez usługę PasswordService podczas porównywania hashowanych haseł. Na przykład:

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

Ciąg, który zaczyna się od $shiro1$ jest to, co można zapisać na password kolumna w bazie danych. Nie ma potrzeby stosowania osobnej kolumny z solą, ponieważ wszystkie informacje, jakich potrzebuje Shiro, znajdują się w $shiro1$... Strunowy.

The DefaultPasswordService używa tych samych domyślnych parametrów konfiguracyjnych (SHA-256, 500 000 iteracji, itd.), więc jeśli użyjesz narzędzia Hasher CLI, jak pokazałem powyżej (bez dodatkowej konfiguracji algorytmu skrótu), nie musisz dostosowywać DefaultPasswordService POJO dalej. Jeśli jednak zmienisz parametry mieszania w interfejsie CLI, musisz upewnić się, że te same parametry są skonfigurowane na DefaultPasswordService bean (i / lub jego wewnętrzna usługa HashingService).

Jeśli nadal testujesz i możesz zmienić swój schemat bazy danych, polecam zrobić to teraz, aby mieć jedno pole hasła, które przechowuje $shiro1$... strunowy. Następnie użyj usługi PasswordService, zgodnie z dokumentacją tutaj Stosowanie:

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


9
2017-07-03 16:08



Konfiguruję to w shiro.ini jest opisany na Stosowanie strona powiązana z @LesHazlewood. Dla konfiguracji wykonanej w Javie zobacz tutaj: stackoverflow.com/a/45225711/2969332 - Robert Mikes