2015-07-27 2 views
0

Я использую shiro 1.2.3 в проекте JSF2 + Hibernate. Не удастся получить аутентификацию пользователя. Не могу понять, что я делаю неправильно.Ошибка аутентификации Shiro

shiro.ini

[main] 
cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager 
securityManager.cacheManager = $cacheManager 

hashService = org.apache.shiro.crypto.hash.DefaultHashService 
hashService.hashIterations = 100000 
hashService.hashAlgorithmName = SHA-256 
hashService.generatePublicSalt = true 

passwordService = org.apache.shiro.authc.credential.DefaultPasswordService 
passwordService.hashService = $hashService 
passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher 
passwordMatcher.passwordService = $passwordService 

customSecurityRealm = com.sapienzo.common.CustomSecurityRealm 
customSecurityRealm.credentialsMatcher = $passwordMatcher 
securityManager.realms = $customSecurityRealm 

ShiroUtils класс (вспомогательный класс для создания соленую хэш)

public class ShiroUtils { 

private static int HASH_ITERATIONS = 100000; 

public static String createSaltedHash(String plainTextPassword) { 
    DefaultHashService hashService = new DefaultHashService(); 
    hashService.setHashIterations(HASH_ITERATIONS); 
    hashService.setHashAlgorithmName(Sha256Hash.ALGORITHM_NAME); 
    hashService.setGeneratePublicSalt(true); 

    DefaultPasswordService passwordService = new DefaultPasswordService(); 
    passwordService.setHashService(hashService); 
    String encryptedPassword = passwordService.encryptPassword(plainTextPassword); 

    return encryptedPassword; 
} 
} 

сохранения пользователя в базу данных при регистрации (получения имени пользователя и пароля из полей формы)

... 
user.setUsername(username); 
user.setPassword(ShiroUtils.createSaltedHash(password); 
userService.saveUser(user); 
... 

логин (снова имя пользователя и пароль из полей формы)

UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), ShiroUtils.createSaltedHash(user.getPassword())); 
Subject currentUser = SecurityUtils.getSubject(); 
currentUser.login(token); 

CustomSecurityRealm.java

public class CustomSecurityRealm extends AuthorizingRealm { 
    public CustomSecurityRealm() { 
     setName("CustomSecurityRealm"); 
    } 

    @Override 
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { 
     UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; 
     if (token.getUsername() == null) { 
      return null; 
     } 
     UserService userService = new UserService(); 
     String saltedHashPassword = userService.getPasswordByUsername(token.getUsername()); //get encrypted password from DB 

     if(saltedHashPassword != null) { 
      SimpleAuthenticationInfo authn = new SimpleAuthenticationInfo(token.getUsername(), saltedHashPassword, getName()); 
      return authn; 
     } else { 
      return null; 
     } 
    } 
    @Override 
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { 
     return null;  
    } 
} 

ответ

0

После выкапывания код построчно, я заметил, что passwordsMatch метод, который используется для сравнения паролей всегда возвращает ложные независимо от входов.

Например:

String plainTextPassword = "foo"; 
DefaultPasswordService passwordService = new DefaultPasswordService(); 
String encryptedPassword = passwordService.encryptPassword(plainTextPassword); 
boolean result = passwordService.passwordsMatch(plainTextPassword, encryptedPassword); 
System.out.println(result); 

Выход ложным. Найдено this post позже. Причиной этого является сообщение об ошибке. Если ваш языковой стандарт по умолчанию отличается от Английский shiro путается, когда (un) буквы с заглавной буквы. Вы должны установить свой стандарт по умолчанию на Locale.ENGLISH, чтобы исправить это.

 Смежные вопросы

  • Нет связанных вопросов^_^