У меня проблемы с ярлыками Spring Security внутри SiteMesh 3 в приложении Spring Boot 2, развернутом на Tomcat 8.
Вот сценарий: у меня есть меню в левой части экранакоторый показывает или скрывает параметры в зависимости от роли текущего пользователя.
Это меню определено внутри макета SiteMesh.
Вот пример элемента меню:
<sec:authorize access="hasAnyAuthority('ENCARGADO_RRHH','USUARIO_PERSONA','ADMINISTRADOR_EMPRESA')">
<li class="nav-item">
<a class="nav-link" href="<c:url value = "/personaForm"/>">
<i class="nav-icon fa fa-slideshare"></i>
<p>Persona</p>
</a>
</li>
</sec:authorize>
Все работает нормально, когда я запускаю приложение локально, но как только я разверну его на Tomcat 8, тег «sec: authorize» всегда возвращает false, поэтому не отображает никаких элементов меню.Я также пытался с другими оценками: 1. В значение «доступ» я добавил allowAll ().2. написать «url» вместо «access»: (').
Ни один из них не сработал.
Теперь это происходит, только если теги находятся внутри SiteMesh, потому что естьна других страницах, где есть и эти оценки, и на них все работает нормально.
Я читал, что фильтр SiteMesh должен быть после фильтров Spring Security, поэтому я сделал это:
Конфигурация Spring Security
@Configuration
//@EnableWebSecurity <-- Some say to put others to remove this annotation... but it won't make a difference
@Order(1)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.expressionHandler(new DefaultWebSecurityExpressionHandler())
.antMatchers("/home").hasAnyAuthority("ADMINISTRADOR_EMPRESA","ADMINISTRADOR_SUBEMPRESA","ENCARGADO_RRHH")
}
}
SiteMesh Config:
@Order(2)
public class WebSiteMeshFilter extends ConfigurableSiteMeshFilter{
@Override
protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
builder.addDecoratorPath("/*", "/WEB-INF/jsp/decorators/main.jsp");
builder.addDecoratorPath("/login", "/WEB-INF/jsp/decorators/mainWithoutMenu.jsp");
}
}
Main Config:
@Configuration
public class SpringBootConfig extends SpringBootServletInitializer {
@Bean
public FilterRegistrationBean siteMeshFilter(){
FilterRegistrationBean fitler = new FilterRegistrationBean();
WebSiteMeshFilter siteMeshFilter = new WebSiteMeshFilter();
fitler.setFilter(siteMeshFilter);
return fitler;
}
}
Мои 2 вопроса:
1. Почему он работает локально?
2. Я неправильно использую аннотации к ордеру или существуетлюбая другая проблема?
Большое спасибо и всего наилучшего!