AndrewYuan 2012-11-14
有些web应用程序的内容是有限制的,只允许有权限的用户在提供正确的用户名和密码的情况下才允许访问。
Servlet通过配置部署文件web.xml来对安全性提供技术支持
一个servlet通过一个叫authenticator的阀门(valve)来支持安全性限制。
当容器启动的时候,authenticator被添加到容器的流水线上
authenticator阀门会在包装器阀门之前被调用。authenticator用于对用户进行验证,
如果用户熟人了正确的用户名和密码,authenticator阀门调用下一个用于处理请求servlet的阀门。
如果验证失败,authenticator不唤醒下一个阀门直接返回。由于验证失败,用户并不能看到请求的servlet。(域)Realm
域是用于进行用户验证的一个组件,它可以告诉你一个用户名密码对是否是合法的。
。一个域跟一个上下文容器相联系,一个容器可以只有一个域。可以使用容器的setRealm方法来建立它们之间的联系。
在Tomcat的默认实现里,合法用户被存储在tomcat-users.xml文件里。
但是可以使用域的其它实现来访问其它的源,如关系数据库。一个域用接口org.apache.catalina.Realm表示。该接口最重要的方法是四个authenticate方法:
public Principal authenticate(String username, String credentials);
publicPrincipalauthenticate(Stringusername,byte[]credentials);
publicPrincipalauthenticate(Stringusername,Stringdigest,
Stringnonce,Stringnc,Stringcnonce,
Stringqop,Stringrealm,
Stringmd5a2);
publicPrincipalauthenticate(X509Certificatecerts[]);
域还有getContainer和setContainer方法用于建立域与容器的联系。一个域的基本上实现是抽象类org.apache.catalina.realm.RealmBase。
org.apache.catalina.realm包中海提供了其它一些类继承了RealmBase
如:JDBCRealm, JNDIRealm, MemoryRealm,和 UserDatabaseRealm。默认情况下使用的域是MemoryRealmLoginConfig类
一个loginconfiguration包括一个域名,用org.apache.catalina.deploy.LoginConfig类表示。
LoginConfig的实例封装了域名和验证要用的方法。可以使用LoginConfig实例的getRealmName方法来获得域名,
可以使用getAuthName方法来验证用户。
Tomcat一个部署启动的时候,先读取web.xml。如果web.xml包括一个login-confgi元素,
Tomcat创建一LoginConfig对象并相应的设置它的属性。验证阀门调用LoginConfig的getRealmName方法并将域名发送给浏览器显示登录表单。Authenticator类
Authenticator接口用来表示一个验证器。该方接口并没有方法,只是一个组件的标志器,
这样就能使用instanceof来检查一个组件是否为验证器。
Catalina提供了Authenticator接口的基本实现:org.apache.catalina.authenticator.AuthenticatorBase类。
除了实现Authenticator接口外,AuthenticatorBase还继承了org.apache.catalina.valves.ValveBase类
BasicAuthenticator用于基本验证,FormAuthenticator用于基于表单的验证,DigestAuthentication用于摘要(digest)验证,
SSLAuthenticator用于SSL验证。
NonLoginAuthenticator用于Tomcat没有指定验证元素的时候。
一个验证器的主要工作是验证用户。因此,AuthenticatorBase类的invoke方法调用了抽象方法authenticate,该方法的具体实现由子类完成安装Authenticator阀门
在部署文件中,只能出现一个login-config元素,login-config元素包括了auth-method元素用于定义验证方法。
这也就是说一个上下文容器只能有一个LoginConfig对象来使用一个authentication的实现类。例子10