本系列博文目录:http://www.javashuo.com/article/p-ewndobct-kn.htmljava
Token(令牌)负责传递登陆时用户输入的登陆数据。apache
CasToken数组
CA证书认证令牌。令牌属性包括 证书、用户id和记住我等。ide
UsernamePasswordTokenthis
用户名密码登陆。令牌属性包括 用户名、密码和记住我等。spa
令牌是经过登陆拦截器的createToken方法进行建立的。.net
/** * 建立Token */ @Override protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) { String username = getUsername(request);//获取用户名 表单name:username String password = getPassword(request);//获取密码 表单name:password boolean rememberMe = isRememberMe(request);//获取是否记住我 表单name:rememberMe String captchaId = WebUtils.getCleanParam(request, "captchaId");//获取验证码id String captcha = WebUtils.getCleanParam(request, "captcha");//获取用户输入的验证码字符 return new CaptchaAuthenticationToken(username, password,captchaId, captcha, rememberMe);//存入本身定义的包含验证码的Token }
令牌在登陆认证时被doGetAuthenticationInfo做为入参引入,用于获取登陆时用户所填写的数据。code
/** * 登陆认证(身份验证) */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { CaptchaAuthenticationToken authenticationToken = (CaptchaAuthenticationToken) token; //得到登陆令牌 String username = authenticationToken.getUsername(); String password = new String(authenticationToken.getPassword());//将char数组转换成String类型 String captchaId = authenticationToken.getCaptchaId(); String captcha = authenticationToken.getCaptcha(); // 验证用户名密码和验证码是否正确 usernamePasswordAndCaptchaAuthentication(username,password,captchaId,captcha); //建立身份信息类(自定义的) Principal principal = new Principal(1L, username); //认证经过返回认证信息类 return new SimpleAuthenticationInfo(principal, password, getName()); }
若是shiro现有令牌没法知足咱们的认证须要,则能够实现本身的令牌。blog
一个典型的状况就是,登陆时须要校验验证码。继承
package pub.lichao.shiro.shiro; import org.apache.shiro.authc.UsernamePasswordToken; /** * Token - 自定义登陆令牌 * 继承并重写默认的登陆令牌 */ public class CaptchaAuthenticationToken extends UsernamePasswordToken { /** * 自定义构造方法 */ public CaptchaAuthenticationToken(String username, String password, String captchaId, String captcha, boolean rememberMe) { super(username, password, rememberMe); this.captcha=captcha; this.captchaId=captchaId; } /** * 自定义参数 */ private String captchaId; //验证码id private String captcha; //录入的验证码字符 public String getCaptchaId() { return captchaId; } public void setCaptchaId(String captchaId) { this.captchaId = captchaId; } public String getCaptcha() { return captcha; } public void setCaptcha(String captcha) { this.captcha = captcha; } }