本系列博文目錄: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; } }