2017-03-09 153 views
0

我有src/main/webapp/my-login.html下的自定义登录页面的Spring Boot应用程序。我配置的Spring Security如下:Spring Security表单登录

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

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

我怎样才能让HTTP GET来/我登录回到我的HTML页面?我知道它被命名为“my-login.html”而不是简单的“my-login”,但是删除.html扩展名会使Chrome变得疯狂(它会尝试下载文件...)。我尝试在src/main/webapp或src/main/resources/static下放置HTML文件(带或不带扩展名)。

另请注意我没有使用Thymeleaf,目标前端框架将是AngularJS。我也对优雅的解决方案感兴趣(我认为我想实现的目标非常简单) - 我认为我使用loginPage(“/ my-login.html”)工作,但REST端点看起来不正确。

回答

3

您可以设置一个视图控制器将请求转发到我的-的login.html ...

@Configuration 
public class MvcConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addViewController("/my-login").setViewName("forward:/my-login.html"); 
     registry.setOrder(Ordered.HIGHEST_PRECEDENCE); 
    } 

} 
+0

工作,谢谢。我不确定这是否是最干净的解决方案,但我非常喜欢它+它直接回复了我的问题=我将它标记为我的工作解决方案:) – kabeen

1

如果您希望将AngularJS用于前端应用程序,那么创建API认证端点可能是最佳解决方案。你可以使用你想要的任何认证机制,但简单的基本认证(可选地带有一些持久性标记)对于开始来说可以。因此,您将拥有一个特殊的端点,例如:

/token POST受基本身份验证保护,并在成功时返回一个令牌对象,该对象稍后可用于所有请求(例如在请求标头中)。

您的AngularJS将是一个完全独立的应用程序,它只消耗您的API端点。此应用程序可以选择将身份验证令牌保留在客户端会话中,以便用户在每次打开应用程序时都不必输入凭据。此外,这是一个非常干净的解决方案,可以轻松地进行单独测试。另外,这种方式前端应用程序可以由其他团队开发,不需要任何有关Spring技术细节的知识。

1

我打得多一点与formLogin性能,得到了该解决方案:

formLogin().loginPage("/my-login.html").loginProcessingUrl("/my-login").defaultSuccessUrl("/my-home.html", true).permitAll() 

通过这种方式,我将HTML文件作为登录页面返回,并使用干净的POST端点传递登录数据。