认证是一个确认身份凭证的过程,证明一个用户是不是合法的。要确认一个用户是不是合法的,需要用户提供一个身份(principals)和凭证(credentials)。
- Principals是用户提供的,能唯一标识一个用户的东西。可以是一个用户名,或者邮箱地址等能唯一表示用户的事物。
- Credentials通常是只有用户自身才知道的一个凭证。通常是密码,或者X.509格式的证书等。
认证的过程
认证一个用户的过程通常有三步:
//Example using most common scenario of username/password pair:
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//"Remember Me" built-in:
token.setRememberMe(true);
在这里我们使用的是UsernamePasswordToken
,支持常用的用户名和密码认证操作。它实现的是org.apache.shiro.authc.AuthenticationToken
认证系统最基本的接口。
Shiro并不关注username和password是怎么来的,可以是从html表单中或者是http请求头里获取的,或者其他的途径。这对shiro来说,都是一样的。
提交身份和凭证
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
认证结果处理
Shiro的认证运行时异常AuthenticationException下有很多个子类。通过catch不同的异常,可以大概得知认证失败的原因。
try {
currentUser.login(token);
} catch ( UnknownAccountException uae ) { ...
} catch ( IncorrectCredentialsException ice ) { ...
} catch ( LockedAccountException lae ) { ...
} catch ( ExcessiveAttemptsException eae ) { ...
} ... catch your own ...
} catch ( AuthenticationException ae ) {
//unexpected error?
}
//No problems, continue on as expected...