PullRequest
       49

0 голосов
/ 20 сентября 2018

У меня проблемы с ярлыками 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. Я неправильно использую аннотации к ордеру или существуетлюбая другая проблема?

Большое спасибо и всего наилучшего!

...