我的应用程序同时提供网页和其他端点(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
但浏览器不再询问用户/密码了,我可以访问所有网址。
答案 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。