【问题标题】:Default URL Mapping Secure Spring MVC application默认 URL 映射安全 Spring MVC 应用程序
【发布时间】:2015-08-04 20:52:40
【问题描述】:

我已经配置了一个简单的安全单页 Web 应用程序,如下所示:

@Configuration
@EnableAutoConfiguration
@EnableWebMvcSecurity
public class MvcConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
            .formLogin()
                //.loginPage("/login")
                .permitAll()
                .and()
            .logout()
            .permitAll();
    }


    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

.loginPage("/login") 被注释掉后,我得到一个默认登录页面,如下所示:

一切都按预期进行。

但是,如果我取消注释 .loginPage("/login") 使其指向我的自定义 login.html 页面,我会收到 404 错误。

这是我当前的文件结构:

main
 L resources
    L static
        - index.html
        - login.html

我知道我可以使用 XML 设置 viewResolver 并在阳光下配置每件小事,但我也知道 Spring Boot 有一些默认设置,如果我想让事情尽可能简洁,我可以利用这些设置.

我的问题是:Spring 在哪里寻找 login.html 文件?为了避免出现 404 错误,我必须放置 login.html 文件的绝对 URL 是什么?

另外,如果解决方案无论如何都必须涉及配置 spring,我宁愿避免使用 XML 并尽可能选择基于 Java 的配置。

【问题讨论】:

  • 控制台有异常吗?你有ViewResolver 吗?我认为thymeleaf模板的默认位置是在resources -> templates
  • 嗨@ManuZi,控制台中没有错误,浏览器中仅显示春天的404消息。我没有 ViewResolver(我希望自动配置能解决这个问题)。我尝试使用模板文件夹而不是静态文件夹,但仍然得到相同的结果。
  • 在你的例子和 spring io 例子之间我能做到的最后一个不同是你在方法中有一个斜线。尝试这样的事情:.loginPage("/login")。你有这个页面的代码吗:spring.io/guides/gs/securing-web

标签: java spring spring-mvc spring-security spring-boot


【解决方案1】:

更新

事实证明,通过将这两行添加到application.properties,您可以在 Spring Boot 上实现相同的结果:

spring.thymeleaf.prefix = /WEB-INF/templates/
spring.thymeleaf.suffix = .html

原始答案

如果其他人有类似的问题,这对我有用:

除了问题中显示的MvcConfig 之外,我还必须创建另一个类:

@EnableAutoConfiguration
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Bean public ViewResolver viewResolver() {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setTemplateMode("LEGACYHTML5");
        templateResolver.setPrefix("templates/");
        templateResolver.setSuffix(".html");
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver);

        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(engine);
        return viewResolver;
    }


    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/login").setViewName("login");
    }

}

如您所见,这个类有一个带有 viewResolver 的 Bean,它将呈现您可能拥有的任何 Thymeleaf 模板。它还为登录页面和索引页面添加了视图控制器。两者都放置在templates 文件夹而不是static 中。

如果您尝试复制 this example,这应该可以工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2013-06-14
    • 2013-05-30
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多