2015-02-23 5 views
0

У нас есть простое веб-приложение, работающее на Tomcat 7.0.56. Теперь мы хотим использовать наш собственный домен для аутентификации.Как доставить королевство с войной с 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) 
    .... 

Если мы делаем банку, положить его в $ TOMCAT/Lib все работает отлично.

Но это НЕ МОЖЕТ быть решением! Это будет означать, что каждый раз, когда я работаю над этим классом, я должен прикасаться к моему серверу tomcat и не могу использовать обычное развертывание.

Как я могу использовать встроенный механизм аутентификации, не касаясь коту всех timeß

+0

Возможно, вам это может понравиться, но '$ TOMCAT/lib' - это ответ. – EJP

+0

Если это единственный способ развертывания? Вы действительно закрываете tomcat, копируете библиотеки, делаете другой материал для развертывания, запускаете tomcat? Вместо того, чтобы просто развертывать его? – Marcel

+0

Вы также можете добавить его в путь запуска tomcat startup. – ramp

ответ

1

Как вы сказали, что я не люблю свои ответы :) Так что я сделал (и я 100% уверен, что вам это не нравится) заключалось в том, чтобы установить царство на возможном пути, но теперь я могу запустить его на 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() возвращает значение (частной) экземпляра переменной данного объекта
  • обеспечить ...(), как утверждают ... но он выбрасывает исключение