2013-07-03 4 views
11

Shiroを使用してTomcat 6内で実行されているサーブレットを認証しようとしています。Shiroを使用してJDBCRealmを使用してユーザーを認証する

私は、次のshiro.iniのファイルがあります:私はSimpleCredentialsManagerを使用している場合、それはユーザーテーブルに平文パスワードに対する罰金認証

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) 

[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 

そして、私のデータベースに次のように。 PasswordMatcherを使用しようとすると、非常にイライラしています。

パスワードとpassword_saltは、shiro-tools Hasherユーティリティで取得しました。

私は、私がテストに使用基本的なHelloWorldサーブレット(パス=休息/こんにちは、コンテキスト=/WS)に対して認証しようとすると、私はログに次を得る:

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

(フルログでhttps://gist.github.com/recurse/5915693

ハッシュされたパスワードをクラス名として読み込もうとしているようです。これはバグですか、私の設定エラーですか?バグの場合、どうすれば回避できますか?設定エラーの場合、何が欠けていますか?

+0

ところで、あなたは、セットアップのこの種の任意のチュートリアルに従うのですか?私は自分のjdbc領域をshaハッシュと統合しようとしていて、関連するチュートリアルを見つけることができませんでした。 – abdu

+0

いいえ。私はShiroサイトのドキュメントを読んで、APIの基本構造を理解しています。次に、コードをチェックアウトして、JDBC構成をリバース・エンジニアリングしました。 – Recurse

答えて

9

まず、この質問のために多くの情報を提供してくれてありがとうございます。

サンプルのデータベース行リストを見ると、ハッシュされたパスワード比較を実行するときにPasswordServiceが期待する出力が格納されているようには見えません。たとえば:

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

$shiro1$で始まる文字列は、データベース内password列に節約になるものです。シロが必要とするすべての情報が$shiro1$...の文字列であるため、別のソルトコラムは必要ありません。

DefaultPasswordServiceは同じ既定の構成パラメータ(SHA-256,500,000回の反復など)を使用しているため、上に示したようにHasher CLIツールを使用すると(余分なハッシュアルゴリズムの設定は必要ありません) DefaultPasswordService POJOをそれ以上カスタマイズしてください。ただし、CLIでハッシングパラメータを変更する場合は、同じパラメータがDefaultPasswordService Bean(および/または内部のHashingService)に設定されていることを確認する必要があります。

まだテスト中で、DBスキーマを変更できる場合は、$shiro1$...文字列を格納する1つのパスワードフィールドを使用するようにしてください。その後、の下にここに文書化され使用としてPasswordServiceを使用します、ありがとうございました、私が探していただけで何

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

+0

'shiro.ini'でこれを設定することは、@LesHazlewoodによってリンクされた** Usage **ページで説明されています。 Javaでの設定については、こちらをご覧ください:https://stackoverflow.com/a/45225711/2969332 –

関連する問題