理解Token

Token介绍

Shiro中Token就是用户用于登录的信息,就是Subject调用login()函数的参数,一般是用户名密码,也可以是我们自定义的格式。

Token源码

我们可以看AuthenticationToken.java源码,定义了Token的接口,只需要实现这两个接口即可。

public interface AuthenticationToken extends Serializable {
  Object getPrincipal();
  Object getCredentials();
}

其中UsernamePasswordToken.java就实现了这两个接口,直接返回username和password。

public Object getPrincipal() {
    return getUsername();
}

public Object getCredentials() {
    return getPassword();
}

public String getUsername() {
    return username;
}

public void setPassword(char[] password) {
    this.password = password;
}

而我们想想,什么时候我们会创建一个新的UsernamePasswordToken来登录呢,实际上shiro-web这个库替我们实现了。在AuthenticatingFilter中,execute()方法会调用createToken()方法来创建一个UsernamePasswordToken来登录。

自定义Token

要自定义Token非常简单,只需要继承已有的AuthenticationToken或者UsernamePasswordToken类即可,然后实现两个方法返回特定对象。

public class AkskAuthenticationToken implements AuthenticationToken {
    @Override
    public Object getPrincipal() {
        return "";
    }

    @Override
    public Object getCredentials() {
        return "";
    }
}

一般实现Token时,我们也需要实现对应的Filter,在请求过来是根据请求内容构造我们自定义的Token,并且实现Realm时重载supports()方法这样我们根据Token类型只需要处理自己定义的Token即可。

这里我们需要知道Token就是用户请求过来是构建的对象,如果是默认的UsernamePasswordToken,那么从Token中获取的Principal就是username,获取的Credential就是加密后的password,当然我们也可以定制Token来返回任意的Java对象。至于这个Token怎样来验证是否通过认证,后面继续看Matcher详细介绍。

results matching ""

    No results matching ""