从零开始手写Tomcat的教程10节---安全性

2022-05-10 15:51:33 浏览数 (1)

从零开始手写Tomcat的教程10节---安全性

  • 领域
    • GenericPrincipal类
    • LoginConfig类
    • Authenticator接口
    • 安装验证器阀
  • 应用程序
    • SimpleContextConfig类
    • SimpleRealm类
    • SimpleUserDataBaseRealm类
    • Bootstarp1类
    • BootStrap2类
  • 总结

对tomcat中管道和阀门机制不懂的小伙伴,参考本篇文章


领域

目前可知结构,如图所示,下面继续分析


GenericPrincipal类


LoginConfig类


Authenticator接口

在Tomcat中的*Base类基本都是实现了接口中大部分方法的基础类,将会有不同实现需求的少量方法设置为抽象方法,让不同的子类实现,大家可以学习这种设计思想、

BasicAuthenticator的authenticate方法

代码语言:javascript复制
public boolean authenticate(HttpRequest request,
                                HttpResponse response,
                                LoginConfig config)
        throws IOException {

        // Have we already authenticated someone?
        Principal principal =
            ((HttpServletRequest) request.getRequest()).getUserPrincipal();
        if (principal != null) {
            if (debug >= 1)
                log("Already authenticated '"   principal.getName()   "'");
            return (true);
        }

        // Validate any credentials already included with this request
        HttpServletRequest hreq =
            (HttpServletRequest) request.getRequest();
        HttpServletResponse hres =
            (HttpServletResponse) response.getResponse();
        String authorization = request.getAuthorization();
        String username = parseUsername(authorization);
        String password = parsePassword(authorization);
        principal = context.getRealm().authenticate(username, password);
        if (principal != null) {
            register(request, response, principal, Constants.BASIC_METHOD,
                     username, password);
            return (true);
        }

        // Send an "unauthorized" response and an appropriate challenge
        String realmName = config.getRealmName();
        if (realmName == null)
            realmName = hreq.getServerName()   ":"   hreq.getServerPort();
    //        if (debug >= 1)
    //            log("Challenging for realm '"   realmName   "'");
        hres.setHeader("WWW-Authenticate",
                       "Basic realm=""   realmName   """);
        hres.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        //      hres.flushBuffer();
        return (false);

    }

安装验证器阀


应用程序


SimpleContextConfig类


SimpleRealm类


SimpleUserDataBaseRealm类


Bootstarp1类


BootStrap2类


总结

  • Principal主要是为了对用户的一些属性进行封装,所以也被称为主体对象,这里主体指的是用户,主要封装了用户姓名,密码,用户角色,当前关联的领域对象realm
  • realm主要负责完成认证功能,然后tomcat中一个Context容器关联一个Realm对象,并且不同的realm子类实现,通过不同的方式来加载有效用户信息,在authenticate方法中,对传入用户名密码进行验证,然后生成一个 Principal对象返回
  • AuthenticatorBase类主要按照实现的认证方式不同,采取不同的认证流程,但是对用户信息校验,都是调用realm的认证方法完成的,这也算是一种解耦,因为用户信息的读取有多种不同的方式

从tomcat的设计中,我们还可以思考一下rcpc权限管理框架设计的一种思想:

由于本人其实对于tomcat的安全这块没有做深入了解,上面写的内容可能会有偏差,包括个人的理解方面,可能也会有问题,但是我这里更想介绍的是tomcat中权限与安全管理给我的一种启发和思考

0 人点赞