Spring security mvcMatchers - PullRequest
       43

Spring security mvcMatchers

0 голосов
/ 28 мая 2018

Я изучаю Spring-Security и создал простое приложение для изучения соответствия.К сожалению, я не могу заставить mvcMatchers работать.Другое дело, что он отлично работает с antMatchers.Пожалуйста, посмотрите его источник ниже.
1) зависимости в pom.xml:

<dependencies>
  <dependency>
     <groupId>org.springframework.security</groupId>
     <artifactId>spring-security-web</artifactId>
     <version>5.0.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.0.5.RELEASE</version>
  </dependency>
  <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-webmvc</artifactId>
     <version>5.0.5.RELEASE</version>
  </dependency>
  <dependency>
     <groupId>org.thymeleaf</groupId>
     <artifactId>thymeleaf-spring5</artifactId>
     <version>3.0.9.RELEASE</version>
  </dependency>
  <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>4.0.0</version>
     <scope>provided</scope>
  </dependency>
</dependencies>

2) MvcWebApplicationInitializer:

public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
   @Override
   protected Class<?>[] getRootConfigClasses() {
      return new Class[]{SecurityConfig.class};
   }

   @Override
   protected Class<?>[] getServletConfigClasses() {
      return new Class[] { MvcWebConfig.class };
   }

   @Override
   protected String[] getServletMappings() {
      return new String[] { "/" };
   }
}

3) MvcWebConfig

@Configuration
@EnableWebMvc
@ComponentScan("com.example.controller")
public class MvcWebConfig implements WebMvcConfigurer {

   @Autowired
   private ApplicationContext applicationContext;

   @Bean
   public SpringResourceTemplateResolver templateResolver() {
      SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
      templateResolver.setApplicationContext(applicationContext);
      templateResolver.setPrefix("/WEB-INF/views/");
      templateResolver.setSuffix(".html");
      return templateResolver;
   }

   @Bean
   public SpringTemplateEngine templateEngine() {
      SpringTemplateEngine templateEngine = new SpringTemplateEngine();
      templateEngine.setTemplateResolver(templateResolver());
      templateEngine.setEnableSpringELCompiler(true);
      return templateEngine;
   }

   @Override
   public void configureViewResolvers(ViewResolverRegistry registry) {
      ThymeleafViewResolver resolver = new ThymeleafViewResolver();
      resolver.setTemplateEngine(templateEngine());
      registry.viewResolver(resolver);
   }
}

4) SecurityConfig:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER").and()
            .withUser("admin").password("password").roles("USER", "ADMIN");
    }

    @Bean
    public static NoOpPasswordEncoder passwordEncoder() {
        return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/secured/**").hasRole("ADMIN")
            //.mvcMatchers(HttpMethod.GET, "/secured/**").hasRole("ADMIN")
            .anyRequest().permitAll()
            .and()
            .formLogin();
    }
}

5) SecurityWebInitializer:

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {}

6) MyController

@Controller
public class MyController { 
    @GetMapping("unsecured")
    public String unsecured(Model model) {
        model.addAttribute("message", "Unsecured");
        return "index";
    }

    @GetMapping("secured/msg")
    public String secured(Model model) {
        model.addAttribute("message", "Secured");
        return "index";
    }
}

7) index.html - это простой шаблон Themeleaf длявыходное сообщение

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">

</head>
<body>
   <p th:text="${message}"></p>
</body>
</html>

Я упаковываю приложение как war, развертываю его на сервере приложений Tomcat 9 и открываю URL-адреса warname/unsecured и warname/secured/msg, и оно работает как положено (незащищенный, просто выводит сообщение «незащищенный», защищенныйзапрашивает логин / пароль. После входа в систему отображается страница с сообщением «Защищено»).Когда я комментирую antMatchers и раскомментирую mvcMatchers в SecurityConfig, переход к любому из этих 2 URL-адресов дает мне стандартную страницу Tomcat 404.Я пытался предоставить mvcMatchers с различными шаблонами, такими как: /secured/msg, /secured/msg/, secured/msg, /secured/msg/*, и каждый раз, когда я получал 404. При удаленной отладке приложения я обнаружил, что кажется, что mvcMatcher.match не вызывается, в то время как antMatcher.match вызывается во время попытки доступа к странице warname/secured/msg.Подскажите, пожалуйста, как я могу заставить приложение работать с mvcMatchers так же, как теперь оно работает с antMatchers?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...