这几天在集成Shiro,从网上找了代码,自己参考着写自己的Demo的。
参照着他的代码,mybatis部分没有集成,自己返回的固定数据,执行登录的时候出现以下问题。
Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
java.lang.IllegalArgumentException: Odd number of characters.
网上搜了下,这个问题出现的很多,基本都是说加密这块出了问题。最终还是仔细阅读那位兄弟代码的时候发现有个password加密的部分。而且也提供了相应的加密。
首先,我这里进入Shiro的时候会执行doGetAuthenticationInfo方法,这里会使用hashedCredentialsMatcher对密码进行加密,仔细对比后确定问题就出在这,所以讲自己返回的数据中的密码进行如下加密后测试OK了。
public class PasswordHelper {
private String algorithmName = "md5";
private int hashIterations = 2;
public void encryptPassword(User user) {
//String salt=randomNumberGenerator.nextBytes().toHex();
String newPassword = new SimpleHash(algorithmName, user.getPassword(), ByteSource.Util.bytes(user.getUsername()), hashIterations).toHex();
//String newPassword = new SimpleHash(algorithmName, user.getPassword()).toHex();
user.setPassword(newPassword);
}
public static void main(String[] args) {
PasswordHelper passwordHelper = new PasswordHelper();
User user = new User();
user.setUsername("admin");
user.setPassword("admin");
passwordHelper.encryptPassword(user);
System.out.println(user);
}
这里的hashIterations次数要跟hashedCredentialsMatcher方法设置中的次数相同,加密方式也要相同(一般MD5足够了)。