默认URL映射安全Spring MVC应用程序

时间:2015-08-04 20:52:40

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

我已经配置了一个简单的安全单页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")注释掉后,我会看到如下所示的默认登录页面: no problems here

一切都按预期工作。

但是,如果我取消注释.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的配置。

1 个答案:

答案 0 :(得分:0)

<强>更新

事实证明,通过将这两行添加到application.properties,您可以在弹簧启动时获得相同的结果:

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

,这应该有用