您的位置:首页 > 其它

揭秘DNS后台文件:DNS系列之五

2009-09-25 14:24 225 查看
   JBoss Web 是 JBoss AS 服务器使用的 Servet contaner, 其实它是一个 Tomcat 的运行时,然后集成到了 JBoss AS 服务器中。 所以这里描述的安全性的实现同样适合于 Tomcat。

 

    Servlet 容器启动的时候, 会针对 HTTP 协议启动一系列的 Acceptor 线程,当一个 HTTP 的请求发送到 Servet 容器的时候, 其中一个 Acceptor 线程会再次启动一个新的线程处理该请求。 在对该请求做了一些列的 pre/post 处理后, tomcat 会调用:

connector.getContainer().getPipeline().getFirst().invoke(request, response);

 方法。

  该方法会调用容器的 pipeline 的第一个 Valve 的 invoke() 方法, 基本上每个 valve 的实现都会考虑调用:

getNext().invoke(request, response);

   这点和 HttpFilter 类似。

   

    而 org.apache.catalina.authenticator.AuthenticatorBase 就是其中一个 valve,我们先看下这个 valve 都作了什么,然后看看它是如何加进当前的 pipeline 的。

 

    首先它会检查当前请求里是否有 principal, 并且该 principal 是否有权限访问当前正在访问的资源, 如果没有, 那么会调用 authenticate 方法进行登录, 如果登录成功,调用 next valve 的 invoke 方法。

 

    那这个 valve 是怎么加到当前的 pipeline 的呢? 当一个 war 部署的时候, 容器会分析 web.xml, 如果web.xml 里有 security-constraint 定义, 那么它会根据当前 login-config 里定义的 auth-method 为其分配一个 Authenticator。 它同时也是一个 Valve,其中 auth-method 一般取值为: 

BASIC

FORM

CLIENT-CERT

DIGEST

NONE

  除此以外, 用户可以自定义 Authenticator 的 Valve,从而实现更多的 auth-method。以 jboss  下配置 SPNEGO authenticator 为例, 在 jboss-web.xml 里加上如下定义:

<valve>
<class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name>
</valve>

   
    该 Authenticator 会忽略 auth-method 的定义。  JBoss web 就会在该 war 部署的时候,由容器直接把这个 Authenticator 加入到 pipeline。

   
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: