Tomcat安全

    有些web应用程序的内容是有限制的,只允许有权限的用户在提供正确的用户名和密码的情况下才允许访问。Servlet通过配置部署文件web.xml来对安全性提供技术支持。

    一个servlet通过一个叫authenticator的阀门(valve)来支持安全性限制。当容器启动的时候,authenticator被添加到容器的流水线上。

    authenticator阀门会在包装器阀门之前被调用。authenticator用于对用户进行验证,如果用户输入了正确的用户名和密码,authenticator阀门调用下一个用于处理请求servlet的阀门。如果验证失败,authenticator不唤醒下一个阀门直接返回。由于验证失败,用户并不能看到请求的servlet。

    在用户验证的时候authenticator阀门调用的是上下文域(realm)内的authenticate方法,将用户名和密码传递给它。该容器域可以访问合法的用户名密码。

域 Realm

    域是用于进行用户验证的一个组件,它可以告诉你一个用户名密码对是否是合法的。一个域跟一个上下文容器相联系,一个容器可以只有一个域。可以使用容器的setRealm方法来建立它们之间的联系。

    一个域是如何验证一个用户的合法性的?一个域拥有所有的合法用户的密码或者是可以访问它们。至于它们存放在哪里则取决于域的实现。在Tomcat的默认实现里,合法用户被存储在tomcat-users.xml文件里。但是可以使用域的其它实现来访问其它的源,如关系数据库。

在Catalina中,一个域用接口org.apache.catalina.Realm表示。该接口最重要的方法是四个authenticate方法:


第一个方法是最常用的方法,Realm接口还有一个getRole方法,签名如下:

    public boolean hasRole(Principal principal, String role);

另外,域还有getContainer和setContainer方法用于建立域与容器的联系。

    一个域的基本上实现是抽象类org.apache.catalina.realm.RealmBase。org.apache.catalina.realm包中还提供了其它一些类继承了RealmBase如:JDBCRealm, JNDIRealm, MemoryRealm,和 UserDatabaseRealm。默认情况下使用的域是MemoryRealm。

GenericPrincipal

    一个principal使用java.security.Principal接口来表示,Tomcat中该接口的实现为org.apache.catalina.realm.GenericPrincipal接口。一个GenericPrincipal必须跟一个域相关联,这个是通过构造函数实现的:


    GenericPrincipal必须拥有一个用户名和一个密码,此外还可选择性的传递一列角色。可以使用hasRole方法来检查一个principal是否有一个特定的角色,传递的参数为角色的字符串表示形式。这里是Tomcat4中的hasRole方法:

                

LoginConfig类

        一个login configuration包括一个域名,用org.apache.catalina.deploy.LoginConfig类表示。LoginConfig的实例封装了域名和验证要用的方法。可以使用LoginConfig实例的getRealmName方法来获得域名,可以使用getAuthName方法来验证用户。一个验证(authentication)的名字必须是下面的之一:BASIC, DIGEST, FORM, o或者CLIENT-CERT。如果用到的是基于表单(form)的验证,该LoginConfig对象还包括登录或者错误页面像对应的URL。

Tomcat一个部署启动的时候,先读取web.xml。如果web.xml包括一个login-confgi元素,Tomcat创建一LoginConfig对象并相应的设置它的属性。验证阀门调用LoginConfig的getRealmName方法并将域名发送给浏览器显示登录表单。如果getRealmName名字返回值为null,则发送给浏览器服务器的名字和端口名

Authenticator

        org.apache.catalina.Authenticator接口用来表示一个验证器。该方接口并没有方法,只是一个组件的标志器,这样就能使用instanceof来检查一个组件是否为验证器。

        Catalina提供了Authenticator接口的基本实现:org.apache.catalina.authenticator.AuthenticatorBase类。除了实现Authenticator接口外,AuthenticatorBase还继承了org.apache.catalina.valves.ValveBase类。这就是说AuthenticatorBase也是一个阀门。可以在org.apache.catalina.authenticator包中找到该接口的几个类:BasicAuthenticator用于基本验证, FormAuthenticator用于基于表单的验证, DigestAuthentication用于摘要(digest)验证, SSLAuthenticator用于SSL验证。NonLoginAuthenticator用于Tomcat没有指定验证元素的时候。NonLoginAuthenticator类表示只是检查安全限制的验证器,但是不进行用户验证。

        org.apache.catalina.authenticator包中类的UML结构图

    

一个验证器的主要工作是验证用户。因此,AuthenticatorBase类的invoke方法调用了抽象方法authenticate,该方法的具体实现由子类完成。在BasicAuthenticator中,它authenticate使用基本验证器来验证用户。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值