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

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始手写Tomcat的教程10节---安全性相关的知识,希望对你有一定的参考价值。

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


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

以上是关于从零开始手写Tomcat的教程10节---安全性的主要内容,如果未能解决你的问题,请参考以下文章

从零开始手写Tomcat的教程12节----StandardContext

从零开始手写Tomcat的教程6节----生命周期

从零开始手写Tomcat的教程9节---Session管理

从零开始手写Tomcat的教程5节---servlet容器

从零开始手写Tomcat的教程4节---Tomcat默认连接器

从零开始手写Tomcat的教程7节---日志记录器