1、登陆测试中的:
UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");
执行subject.login(token)后,这个token传到了自定义的Realm中的方法:
//处理身份验证
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
这里的参数(AuthenticationToken token)即是我们的登陆用户“zhang”的token
2、我们自定义的Realm,我们一般选择继承shiro的AuthorizingRealm。
3、自定义realm中身份验证(doGetAuthenticationInfo)方法的返回值:
SimpleAuthenticationInfo info =
new SimpleAuthenticationInfo(user,
user.getPassword(),
getName());
SimpleAuthenticationInfo的第一个参数我么可以放入我们想要放入对象参数,如这里的对象User,我们还能存入id
或Username等等(难道这里是通过前端的登录token的username从数据库查询到的该账号的对象或者id,或者username?),这个参数体现在本类处理权限的方法中:
//处理权限
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)
这里的参数(PrincipalCollection principals)就是我们传入的对象User,我们可以这么使用它:
User User = (User) principals.getPrimaryPrincipal();
获取User对象后我们可以去数据库中查询权限信息,并加载到shiro中,第二个参数为通过前端登录token用户名从数据库获取的加密后的password,第三个参数为当前自定义realm的名称,即this.getName()
4、自定义realm中抛出的异常我们可以在登陆测试中的subject.login(token)处捕获
try {
subject.login(token);
} catch (UnknownAccountException unknownAccountEx) {
//处理无此用户
}catch(IncorrectCredentialsException wrongPasswordEx){
//处理用户名或密码不正确
}catch(LockedAccountException lockedAccountEx){
//账户被锁定
} catch ( AuthenticationException ae ) {
//不期望出现的错误 error?
}
然后返回友好的信息给用户