Spring boot Springboot身份验证问题
我有一个配置了spring安全性的spring引导应用程序。我已将登录请求重定向到http://localhost:8000 我在python服务器上运行我的前端。现在,当我尝试将登录发布到我的springboot应用程序时,它不起作用。即使我从邮递员那里试过,上面也写着405错误。我怎样才能让它工作呢。如果我将它作为html放在同一个项目中,但不是从python服务器或邮递员处,那么它可以从/login开始工作。有什么区别 消息:不支持请求方法“POST”, 路径:/login 表单数据Spring boot Springboot身份验证问题,spring-boot,spring-security,Spring Boot,Spring Security,我有一个配置了spring安全性的spring引导应用程序。我已将登录请求重定向到http://localhost:8000 我在python服务器上运行我的前端。现在,当我尝试将登录发布到我的springboot应用程序时,它不起作用。即使我从邮递员那里试过,上面也写着405错误。我怎样才能让它工作呢。如果我将它作为html放在同一个项目中,但不是从python服务器或邮递员处,那么它可以从/login开始工作。有什么区别 消息:不支持请求方法“POST”, 路径:/login 表单数据 &l
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<!-- Add page specific code/html START -->
<div class="container">
<h1 th:text="#{welcome.message}"></h1>
<form class="form-signin" name="loginForm" th:action="@{/login}" action="/login" method="POST">
<h2 class="form-signin-heading">Please sign in</h2>
<label for="username" class="sr-only">Email address</label>
<input type="text" name="username" id="username" class="form-control" placeholder="Username" required="required" autofocus="autofocus" />
<label for="password" class="sr-only">Password</label>
<input type="password" name="password" id="password" class="form-control" placeholder="Password" required="required" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
</form>
</div> <!-- /container -->
</body>
</html>
安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${ldap.urls}")
private String ldapUrls;
@Value("${ldap.base.dn}")
private String ldapBaseDn;
@Value("${ldap.user.dn.pattern}")
private String ldapUserDnPattern;
@Value("${ldap.enabled}")
private String ldapEnabled;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/login**").permitAll()
.antMatchers("/assessments/**").fullyAuthenticated()
.antMatchers("/").permitAll()
.and()
.formLogin()
//.loginPage("http://htmlcode.s3-website.us-east-2.amazonaws.com")
.loginPage("http://localhost:8000")
.loginProcessingUrl("/j_spring_security_check")
.usernameParameter("j_username")
.passwordParameter("j_password")
//.loginPage("/login")
.failureUrl("/login?error")
.permitAll()
.and()
.logout()
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
.permitAll();
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/register");
// .antMatchers("/assessments/**");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
if(Boolean.parseBoolean(ldapEnabled)) {
auth.ldapAuthentication()
.userDetailsContextMapper(userDetailsContextMapper())
.userDnPatterns(ldapUserDnPattern)
.contextSource()
.url(ldapUrls+ldapBaseDn);
}
}
@Bean
public UserDetailsContextMapper userDetailsContextMapper() {
return new LdapUserDetailsMapper() {
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) {
UserDetails details = super.mapUserFromContext(ctx, username, authorities);
return details;
}
};
}
@Bean
CorsFilter corsFilter() {
CorsFilter filter = new CorsFilter();
return filter;
}
}
您忘记了包含csrf值。这是一种防止跨站点攻击的安全预防机制。您的解决方案有两个选项: 1.禁用CSRF: 由于默认情况下启用了csrf,因此启用csrf时不允许使用POST和PUT Http方法。 要禁用它,应将其添加到安全配置中
.csrf().disable()
例如,你可以有这样的东西:
http.
.csrf().disable().
authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.and()
.formLogin().loginPage("/login").failureUrl("/login?error")
.usernameParameter("username").passwordParameter("password")
.and()
.logout().logoutSuccessUrl("/login?logout")
.and()
.exceptionHandling().accessDeniedPage("/403");
2.发送csrf令牌值:
如果您将登录页面与登录表单一起使用,我们需要始终将CSRF令牌作为隐藏参数手动包含在登录表单的代码中:
<input
type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}" />
更多信息
我已经完成了csrf禁用。我们是否仍应包括第2步中提到的csrftoken?您是否可以包括您的安全配置代码,以便我可以更好地指导您?编辑了我的问题。请检查您的浏览器是否禁用了Cookie,如果是,请启用它并重新检查您的意思是405错误消失了?我看不到您的successHandlerauthenticationsuccessHandler?您需要在某个地方定义用户是否经过身份验证
http.
.csrf().disable().
authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.and()
.formLogin().loginPage("/login").failureUrl("/login?error")
.usernameParameter("username").passwordParameter("password")
.and()
.logout().logoutSuccessUrl("/login?logout")
.and()
.exceptionHandling().accessDeniedPage("/403");
<input
type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}" />
<script type="text/javascript">
var csrfParameter = '${_csrf.parameterName}';
var csrfToken = '${_csrf.token}';
</script>
var jsonParams = {};
jsonParams['parentId'] = 1;
jsonParams[csrfParameter] = csrfToken;
// include other values pass ,user, etc.
$.ajax({
type: 'POST',
cache: false,
url: /login,
data: jsonParams,
dataType = 'json',
contentType = 'application/json',
...
});