接触和使用shiro还是有好大一段时间,可惜并没有搞明白其实的原理和机制。因为工作中使用的框架都封装好了,so......并没有去研究。
原来一直猜想的是shiro可以直接连接数据库,验证用户名和密码。但是又没在实体类中找到有什么特殊的标记注解之类的。
就有点好奇了,于是趁这两天工作不是那么紧张了,就跟了下源码。
如有不对,请留言指正。蟹蟹!
红色部分是主要代码;
UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(), password, rememberMe.equals("0") ? false : true);
Subject currentUser = AppUtils.getSubject();
try {
currentUser.login(token);
} catch (AuthenticationException e) {
token.clear();
model.addAttribute("user_err", "用户名或密码错误");
return loginUrl;
}
将登录委托给subjectManager
public void login(AuthenticationToken token) throws AuthenticationException {
clearRunAsIdentitiesInternal();
Subject subject = securityManager.login(this, token);
PrincipalCollection principals;
String host = null;
if (subject instanceof DelegatingSubject) {
DelegatingSubject delegating = (DelegatingSubject) subject;
//we have to do this in case there are assumed identities - we don't want to lose the 'real' principals:
principals = delegating.principals;
host = delegating.host;
} else {
principals = subject.getPrincipals();
}
if (principals == null || principals.isEmpty()) {