2013-07-03 2 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 유틸리티를 통해 얻은 것입니다.

나는 시험 (경로 = 나머지/안녕하세요, 컨텍스트 =/WS), 나는 로그에 다음과 같은 수에 사용할 기본 HelloWorld 서블릿에 대해 인증 할 때 :

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

그냥 내가 무엇을 찾고 있었다, 당신이, BTW 사용자가 설정 이런 종류의에 대한 튜토리얼을 따라 않았다 감사 : 사용에서 여기에 설명 된대로 그럼 당신은 PasswordService를 사용할 수 있습니까? 내 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 열을 절약 할 것입니다. Shiro가 필요로하는 모든 정보가 $shiro1$... 문자열에 있으므로 별도의 소금 열이 필요하지 않습니다.

DefaultPasswordService은 동일한 기본 구성 매개 변수 (SHA-256, 500,000 반복 등)를 사용하므로 위에 표시된 것처럼 Hasher CLI 도구를 사용하는 경우 (추가 해시 알고리즘 구성 필요 없음) DefaultPasswordService POJO를 더 이상 사용자 정의 할 수 없습니다. 그러나 CLI에서 해싱 매개 변수를 변경하는 경우 동일한 매개 변수가 DefaultPasswordService bean (및/또는 내부 HashingService)에 구성되어 있는지 확인해야합니다.

아직 테스트 중이며 DB 스키마를 변경할 수있는 경우 $shiro1$... 문자열을 저장하는 단일 암호 필드를 사용하는 것이 좋습니다.

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를 참조하십시오. –

관련 문제