2013-05-24 2 views
3

Есть ли возможность получить список ограничений из web.xml?программно извлекает ограничения безопасности из web.xml

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>admin</web-resource-name> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 

Еще лучше есть программный способ добавления новых ограничений?

Спасибо, Виктор

+0

Возможно, релевантно: https://blogs.oracle.com/swchan/entry/follow_up_on_servlet_3 и это: https://weblogs.java.net/blog/kumarjayanti/archive/2009/12/24/using-servletsecurity- annotation-javaee-6 –

ответ

3

Если у вас есть ServletContainerInitializer, в его методе onStartup(), вы в основном будете делать то, что делает ваш контейнер, когда он анализирует ваш web.xml. Например:

@Override 
public void onStartup(Set<Class<?>> classes, ServletContext ctx) throws ServletException { 
    ServletRegistration.Dynamic servlet = ctx.addServlet("myServlet", "com.package.myServlet"); // loop through classes set to find all your servlets 
    HttpConstraintElement constraint = new HttpConstraintElement(); // many constructors with options 
    ServletSecurityElement securityElement = new ServletSecurityElement(constraint); // many different constructors 
    servlet.setServletSecurity(securityElement); 
} 

Есть много вариантов в конструкторах я комментировал для всех видов конфигураций, даже через сервлет 3,0 security annotations. Я позволю тебе открыть их все.

Что касается добавления новых ограничений после инициализации Javadoc для setServletSecurity() говорит:

* @throws IllegalStateException if the {@link ServletContext} from 
* which this <code>ServletRegistration</code> was obtained has 
* already been initialized 

Я не мог найти что-нибудь для получения списка ограничений через ServletContext интерфейс, но вы всегда можете разобрать web.xml сам.

+0

Я бы не хотел идти с решением, которое требует от меня отклонения от std, но «ServletContainerInitializer» звучит хорошо. Я видел здесь (http://piotrnowicki.com/2011/03/using-servlets-3-0-servletcontainerinitializer/), что я могу даже встроить его в свое веб-приложение. Хорошее решение Я попробую, чтобы посмотреть, подходит ли это: – victor

+0

@victor Ваш контейнер сначала проверит ваши «META-INF/services» для файла, содержащего полное имя класса вашего класса, который реализует [ServletContainerInitializer] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html). Ты не ограничиваешься только этим. Вы также можете иметь параллельную конфигурацию web.xml. –

0

По Servlet 3.0 on Annotations and Deployment descriptors нет никакого упоминания о добавлении нового security-constraints. Программно Поэтому я сомневаюсь, что вы можете добавить программные ограничения безопасности.