我创建一个简单的spring boot应用程序。当我在pom.xml中添加vaadin依赖项时。无法注销。该用户仍处于登录状态,不需要输入密码。
对于Vaadin 10和Vaadin 12,我得到相同的结果。春季版本是2.1.2.RELEASE
@RestController
@EnableAutoConfiguration
@SpringBootApplication
public class TestApplication {
@RequestMapping("/")
String home() {return "Hello World!";}
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and().
.authorizeRequests().anyRequest().fullyAuthenticated();
http.httpBasic().and().logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/")
.invalidateHttpSession(true).deleteCookies("JSESSIONID");
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("thomas")
.password(encoder.encode("xxx")).roles("USER");
}
}
Dependeny:
<dependency>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-spring-boot-starter</artifactId>
</dependency>
我希望关注结果
我呼叫localhost:xxx / =>浏览器询问用户名/密码
我呼叫localhost:xxx / logout =>浏览器再次询问用户名/密码
将vaadin依赖项添加到pom中之后
我得到关注结果
我呼叫localhost:xxx / =>浏览器询问用户名/密码
我呼叫localhost:xxx / logout =>浏览器不询问密码!
答案 0 :(得分:1)
问题是您使用的是基本身份验证,实际上并不支持注销。在每个请求中,浏览器都会发送用户名/密码,因此用户在注销后立即重新登录。
解决此问题的一种方法是将身份验证更改为表单,并为页面提供一个表单,用户可以在其中提交登录凭据。
http.formLogin().loginPage("/login").permitAll()
在/login
中,您应该提供一个带有<form>
标记的html页面,该标记用于发布登录凭据,例如:
<html>
<head></head>
<body>
<h1>Login</h1>
<form name='f' action="login" method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='username' value=''></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password' /></td>
</tr>
<tr>
<td><input name="submit" type="submit" value="submit" /></td>
</tr>
</table>
</form>
</body>
</html>