2016-06-11 50 views
0

我目前正在编写一个简单的网站,该网站可供登录用户和未登录用户查看。如何通过导航栏而不是页面创建登录

我能够使用spring/spring-security创建一个简单的登录页面,但我宁愿允许通过导航栏登录(如在facebook上)。春季安全可能吗?看来,spring-security只允许登录页面登录,而不是从html页面内的html块中登录。

编辑:我正在考虑使用成功处理程序,并在登录完成后更新页面而不是重定向。

+0

你怎么知道Facebook使用弹簧安全? –

+0

我不知道。我只是举了一个我想要实现的例子。 – ADOGCATFISH3333

+0

你的问题不是很清楚你想做什么。你绝对可以使用navber来放置你的登录表单。它与弹簧安全无关 – LynAs

回答

1

是的,这是可能的,但如果你想自动重新加载页面,你必须使用AJAX。 如果你使用Spring的Java配置,你可以将其配置如下:

@Configuration 
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http 
      .csrf() 
       .csrfTokenRepository(this.csrfTokenRepository()) 
      .and() 
       .authorizeRequests() 
        /* The configuration of which requests to intercept. */ 
      .and() 
       .formLogin() 
        .loginPage("/login") 
        .loginProcessingUrl("/login") 
        .failureUrl("/login/failed") 
        .defaultSuccessUrl("/o") 
        .usernameParameter("username") 
        .passwordParameter("password") 
        .permitAll() 
      .and() 
       .logout() 
        .logoutUrl("/logout") 
        .logoutSuccessUrl("/login/out") 
        .permitAll(); 
    } 

    /** 
    * Creates a {@link CsrfTokenRepository} that sets the token name to 
    * _csrf. 
    * 
    * @return The {@link CsrfTokenRepository}. 
    */ 
    private CsrfTokenRepository csrfTokenRepository() { 
     val csrfTokenRepository = new HttpSessionCsrfTokenRepository(); 
     csrfTokenRepository.setSessionAttributeName("_csrf"); 
     return csrfTokenRepository; 
    } 
} 

上面的配置执行以下操作:

  • 配置的CSRF令牌库来接受一个名为_csrf参数CSRF令牌。 (更多关于CSRF:。https://en.wikipedia.org/wiki/Cross-site_request_forgery
  • 设置可用上/login登录页面
  • 设置登录处理的URL /login这是你必须POST请求发送到的用户名,密码的URL,以及CSRF标记设置。
  • 设置故障网址/login/failed,这是一个用户被重定向他进入登录页面上错误的凭据时的页面。
  • 配置用户名和密码参数为usernamepassword 。这些是您必须在发送给POST请求的POST请求中与您的CSRF令牌一起设置的参数登录处理URL。
  • 允许登录页面上的所有访问。
  • 配置注销URL和注销成功URL。

这主要是你要在服务器端做的一切。在客户端,您必须配置一个表单,将操作设置为登录处理URL,将方法设置为POST以及名称为_csrf的隐藏字段,其中包含CSRF标记,或者您必须发送类似的AJAX请求。

问候,费边


我已经做到了这之前,所以这里是如何使用它的工作示例:https://github.com/lcmanager/gdb

Spring的Web配置:https://github.com/lcmanager/gdb/blob/master/gdb-web-control/src/main/java/org/lcmanager/gdb/config/WebSecurityConfiguration.java

的表格记录在:https://github.com/lcmanager/gdb/blob/master/gdb-web-control/src/main/resources/templates/modules/login.ftl

并通过JavaScript登录(使用AngularJS):https://github.com/lcmanager/gdb/blob/master/gdb-web-control/src/main/resources/static/js/modules/login.js