JBoss web 如何实现安全访问


   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。

   

 

你可能感兴趣的:(jboss)