如何解决Spring Security会话管理重定向问题
我正在创建一个Spring-boot Web应用程序,该应用程序主要通过将从控制器返回的ModelAndViews附加到我的JSP页面上的div上,主要使用AJAX来部分呈现页面。我遇到两个问题:
- 登录到两个浏览器时,一个注销后,另一页会将html形式的登录表单视图附加到容器中,而不是重定向到登录URL。在用户注销的情况下如何处理这种情况,以便我可以告诉AJAX重定向到/ login?在我看来,如果这是控制器/ AJAX必须检查的内容,那么每次AJAX /控制器调用我都必须这样做-当然有更好的方法吗?
- 我的会话管理具有“ invalidSessionURL('/ login')”,并且当我将无效URL更改为/ login以外的其他名称(即/ Admin)时,尽管登录成功,该应用仍尝试重定向到此页面。为什么会这样?
我的WebSecurityConfig:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
@Autowired
DataSource dataSource;
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Autowired
BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource);
}
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationManager customAuthenticationManager() throws Exception {
return authenticationManager();
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/css/**","/js/**","/images/**");
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and().csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.antMatchers("/Admin").hasAnyAuthority("Admin","SuperAdmin")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.defaultSuccessUrl("/")
.permitAll()
.and()
.logout()
.permitAll()
.and()
.sessionManagement()
.invalidSessionUrl("/Admin");
}
}
Login.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Test</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
</head>
<body>
<div class="loginWrapper">
<div class="loginform">
<form id="loginform" action="/login" method="post">
<h2>Login</h2><br>
<label for="username">Username</label>
<input id="username" type="text" name="username" REQUIRED placeholder="Username/email">
<br>
<label for="password">Password</label>
<input id="password" type="password" name="password" REQUIRED placeholder="Password">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<br>
<p class="error">${error}</p>
<p class="logout">${logout}</p>
<input type="submit" name="login" value="Login">
</form>
</div>
</div>
</body>
</html>
我如何渲染视图的片段:
$(document).on("click",".adminLink",function(){
var clicked = $(this).attr("data-value");
alert(clicked);
$.ajax({
type: "GET",url: "/AdminData",data: {
"clicked": clicked
},dataType: "text",success: function(result){
$(".adminTable").html(result);
}
});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。