shiro Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).异常
在使用shiro集成时往往会遇到如下异常:
Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - zhihuilijia12, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).
发生这种异常的原因很多,但有可能只是因为API或业务的使用不当导致的。
比如如下的业务代码:
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //从主体传过来的认证信息中,获取用户名 String userName = (String)authenticationToken.getPrincipal(); //通过用户名去到数据库中获取凭证 String password = userService.getPasswordByUsername(userName); if (StringUtils.isEmpty(password)) { return null; } SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userName, password, "costomRealm"); //设置盐salt simpleAuthenticationInfo.setCredentialsSalt(ByteSource.Util.bytes("pyy")); return simpleAuthenticationInfo; }
有些朋友喜欢在doGetAuthenticationInfo中处理校验的业务逻辑,校验失败时抛出自定义异常等。这就会导致上述异常的出现,主要原因时在该方法中只允许抛出继承自AuthenticationException的异常。
那么,密码等的校验怎么处理?当然是在注册、登录或修改密码的业务Controller或Service层进行校验。校验通过之后,再调用对应的方法来处理,比如:
Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password); //登录 subject.login(usernamePasswordToken);
在校验之后,再调用上述代码,然后直接存储设置校验之后的用户登录信息即可。
其他情况一
比如
正常运行时
org.apache.shiro.authc.AuthenticationException: Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken – wjh, rememberMe=false]. Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).报错
原因:
//构建SecurityManager环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //看看是不是少了这一行应该是少了一行代码吧。
其他情况二
在自定义的realm类里的方法doGetAuthenticationInfo处理加密验证的时候,password传成明文的了,应该是密文的。注意参数:userName明文, password密文。
ByteSource byteSourceSalt = ByteSource.Util.bytes(user.getSalt()); SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userName, password, byteSourceSalt, getName()); return simpleAuthenticationInfo;
其他情况
当然,因此该问题,还有可能是依赖jar包错误,注入Bean错误等其比较简单而容易忽略的原因引起的。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2020/12/17/shiro-authenticationexception/