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

x33g5p2x  于2022-03-17 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(372)

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

领域

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

GenericPrincipal类

LoginConfig类

Authenticator接口

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

BasicAuthenticator的authenticate方法

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中权限与安全管理给我的一种启发和思考

相关文章