Spring Security注销问题

时间:2016-12-07 09:29:07

标签: java spring spring-security

我的应用程序同时提供网页和其他端点(Spring boot + Spring 4)

我试图设置一个基本的InMemoryAuth,但/ logout不起作用。

从浏览器中,它会重定向到带有404的/ login?logout,对用户会话没有影响。

@EnableWebSecurity
@Configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {


  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
        .antMatchers("/rest/**").hasRole("USER")
        .antMatchers("/ui/**").hasRole("USER")
      .and().logout()
            .logoutUrl("/logout")
      .and().httpBasic()
      .and().csrf().disable();
  }

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

修改

使用followind链

http
  .authorizeRequests().anyRequest().authenticated()
  .and().logout().logoutUrl("/logout").logoutSuccessUrl("/").permitAll()
  .and().httpBasic()
  .and().csrf().disable();

并定义了根页,没有404错误。

启用调试后,我能够看到

Logging out user 'org.springframework.security.authentication.UsernamePasswordAuthenticationToken@442b5a9f: Principal: org.springframework.security.core.userdetails.User@36ebcb: Username: user; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_USER' and transferring to logout destination
Invalidating session: B264148444D372CFC899A5B920818B68

但浏览器不再询问用户/密码了,我可以访问所有网址。

1 个答案:

答案 0 :(得分:2)

退出的默认成功网址为/login?logout。由于您没有配置formLogin(),因此您将获得/login,这就是您获得404的原因。您最好更改logout().logoutSuccessUrl("/"),以便将其重定向到root。

<强>更新

回答问题的编辑部分。您已启用HTTP Basic以及

httpBasic()

这意味着一旦您在浏览器提供的弹出窗口中输入用户名和密码,浏览器将为您对Spring Security Protected Site所做的所有请求发送以下标题。

Authorization: Basic base64(username+":"+password)

这就是您可以访问所有网址的原因。如果尚未登录,它将继续使用每个请求登录用户。可悲的是,目前还没有解决这个问题。这是根据维基百科。

  

现有浏览器保留身份验证信息,直到选项卡或   浏览器已关闭或用户清除历史记录。 [1] HTTP没有   提供一种服务器引导客户端丢弃这些的方法   缓存凭据。这意味着没有有效的方法   服务器到&#34;退出&#34;用户没有关闭浏览器。这是一个   需要浏览器制造商支持的重大缺陷   &#39;注销&#39;用户界面元素(在RFC 1945中提到,但不是   由大多数浏览器实现)或JavaScript可用的API   HTTP的扩展,或使用现有的替代技术,如   通过SSL / TLS检索页面,其中包含一个不可语句的字符串   URL。