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。

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值