2015-02-23 57 views
0

我們有一個運行在Tomcat 7.0.56上的簡單Web應用程序。現在我們想使用我們的 自己的領域進行身份驗證。如何在與Tomcat的戰爭中交付領域?

public class SpecialAuth extends DataSourceRealm{ 
    @Override 
    public Principal authenticate(String username, String credentials){ 
     .... 
    } 
} 

這是在/META-INF/context.xml定義的戰爭

<Context> 
    <Realm className="some.package.SpecialAuth" dataSourceName="jdbc/MySQL" /> 
</Context> 

哪裏擺放SpecialAuth.class裏面?

我們預計什麼只是有SpecialAuth.class我們的戰爭中,但隨後我們正在啓動

Caused by: java.lang.ClassNotFoundException: some.package.BackOfficeAuth 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    .... 

越來越folling例外,如果我們做一個罐子,把它變成$ TOMCAT/lib中的一切工作正常。

但這不可能是解決方案!這意味着每次我在這個類上工作時,都必須觸摸我的tomcat服務器,並且不能使用正常的部署。

我如何使用內置的身份驗證機制不接觸tomcat的所有timeß

+0

你可能喜歡它,也可能不喜歡它,但'$ TOMCAT/lib'就是答案。 – EJP 2015-02-23 08:40:26

+0

如果這是您部署的唯一方式?你真的關閉tomcat,複製庫,​​做其他部署的東西,啓動tomcat?而不是部署它? – Marcel 2015-02-23 09:12:17

+0

你也可以將它添加到tomcat啓動類路徑中。 – ramp 2015-02-23 11:02:32

回答

1

正如你說的,我不喜歡你的答案:)所以我做了什麼(我敢肯定,100%你不喜歡它)是設置可能的方式dirties領域,但現在我可以運行它ontouched tomcat。在163個驗收測試之後,似乎沒有任何事情可以打破

public final class ContextListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     ServletContext servletContext = event.getServletContext(); 
     TomcatContextManipulator tomcat = new TomcatContextManipulator(servletContext); 
     tomcat.applyRealm(new MyOwnRealm()); 
    } 
} 

public class TomcatContextManipulator { 
    private static final String EXPEXCTED_TOMCAT_VERSION = "7.0.52.0"; 

    private ApplicationContextFacade servletContext; 

    /** 
    * @param servletContext must be of type {@link ApplicationContextFacade} 
    */ 
    public TomcatContextManipulator(ServletContext servletContext) { 
     checkTomcatVersion(); 

     ensureEquals(servletContext.getClass(), ApplicationContextFacade.class, "class of servletContext"); 
     this.servletContext = (ApplicationContextFacade) servletContext; 
    } 

    /** 
    * checks if the correct version of tomcat is in use, throws {@link IllegalStateException} if not 
    */ 
    private void checkTomcatVersion() { 
     // we use several internal parts of tomcat (for example with reflection) 
     // by doing this we bind ourself hardly to a explicit version 
     ensureEquals(EXPEXCTED_TOMCAT_VERSION, ServerInfo.getServerNumber(), "Tomcat-Server-Version"); 
    } 

    /** 
    * overrides the existing realm with the given on 
    */ 
    public void applyRealm(Realm realm) { 
     ensureNotNull(realm, "realm"); 
     ApplicationContext applicationContext = (ApplicationContext) ReflectionUtil.get(servletContext, "context"); 
     StandardContext standardContext = (StandardContext) ReflectionUtil.get(applicationContext, "context"); 
     standardContext.setRealm(realm); 
    } 
} 

注:

  • Reflection.get()返回給定對象
  • 保證的(私人)實例變量的值...()是一樣的斷言......但它拋出異常