Мне нужно создать пользовательскую область в Широ, и я должен использовать пароль с «солью».
Код, который я использую, выглядит примерно так:
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
throws AuthenticationException {
...
Admin admin = query.getByUsername(username);
String passwordSalted = admin.getPassword();
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, passwordSalted, new SimpleByteSource(MY_PRIVATE_SALT), getName());
return info;
}
public Admin createAdmin(AuthenticationToken authenticationToken){
DefaultHashService hashService = new DefaultHashService();
hashService.setHashIterations(500000);
hashService.setHashAlgorithmName(Sha256Hash.ALGORITHM_NAME);
hashService.setPrivateSalt(new SimpleByteSource(MY_PRIVATE_SALT)); // Same salt as in shiro.ini, but NOT base64-encoded.
hashService.setGeneratePublicSalt(true);
DefaultPasswordService passwordService = new DefaultPasswordService();
passwordService.setHashService(hashService);
String encryptedPassword = passwordService.encryptPassword(authenticationToken.getCredentials());
Admin admin = new Admin();
String principal = authenticationToken.getPrincipal().toString();
admin.setUsername(principal);
admin.setPassword(encryptedPassword);
return admin;
}
Я использую функцию createAdmin для создания администратора, а затем сохраняю его в базе данных, например:
UsernamePasswordToken u = new UsernamePasswordToken("foo","qwerty") ;
Admin admin = createAdmin(u);
query.save(admin);
Сохраненный пароль выглядит примерно так:
$shiro1$SHA-256$50000$M7T93MZ65TCxXBsD7JFa9A==$gJcEf2oSKE/RKXifwYiJCaHU7X10ng1PxqL3AEMvmjE=
Я не знаю, почему он не прошел аутентификацию:
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
AuthenticationToken authenticationToken = new UsernamePasswordToken("foo", "qwerty");
Subject usr = SecurityUtils.getSubject();
try {
securityManager.login(usr, authenticationToken);
} catch (Exception e) {
log.error("error");
}
И мой shiro.ini:
[main]
customSecurityRealm=cl.fooproyect.CustomRealm
Решено:
Чтобы решить проблему, мне нужно изменить shiro.ini и файл createAdmin. Я отдаю ответственность Широ за создание соли. Это решение работает для меня.
Изменения в shiro.ini
[main]
passwordService = org.apache.shiro.authc.credential.DefaultPasswordService
passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher
passwordMatcher.passwordService = $passwordService
customSecurityRealm=cl.doman.punto.vaadin.shiro.CustomRealm
customSecurityRealm.credentialsMatcher = $passwordMatcher
securityManager.realms = $customSecurityRealm
Изменения в createAdmin:
public Admin createAdmin(AuthenticationToken authenticationToken){
DefaultHashService hashService = new DefaultHashService();
DefaultPasswordService passwordService = new DefaultPasswordService();
String encryptedPassword = passwordService.encryptPassword(authenticationToken.getCredentials());
Admin admin = new Admin();
String principal = authenticationToken.getPrincipal().toString();
admin.setUsername(principal);
admin.setPassword(encryptedPassword);
return admin;
}
login
- person Serge Ballesta   schedule 09.08.2014