У меня есть приложение для весенней загрузки с настроенной безопасностью Spring. Я перенаправил запрос на вход в http://localhost:8000, где я запускаю свой интерфейс на сервере python. Теперь, когда я пытаюсь опубликовать логин в своем приложении springboot, это не работает. Даже когда я пытаюсь у своего почтальона, он говорит об ошибке 405. Как я могу заставить это работать. Он работает из / login, если я помещаю его как html в тот же проект, но не с сервера python или почтальона. В чем разница.
"message": "Метод запроса POST не поддерживается", "путь": "/ логин"
Данные формы
<!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>
HTML-код, размещенный на сервере Photon
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Assessment App</title>
<link href = "../css/bootstrap.min.css" rel = "stylesheet">
<link href = "../css/main.css" rel = "stylesheet">
</head>
<body>
<div class = "container-fluid">
<div class = "panel panel-default main-header">
<div class = "panel-body">
<div class = "pull-left">Assessments</div>
</div>
</div>
<div class = "row">
<div class = "login-container col-md-4 col-md-offset-4 col-sm-10 col-sm-offset-1 col-xs-12 col-xs-offset-0">
<div class = "panel panel-login">
<div class = "panel-heading">
<div class = "panel-title">Sign In</div>
</div>
<div class = "panel-body">
<form id = "loginform" class = "form-horizontal" role = "form">
<div class = "input-group assessment-input-group">
<span class = "input-group-addon"><i class = "glyphicon glyphicon-user"></i></span>
<input id = "login-username" type = "text" class = "form-control" name = "username" value = "" placeholder = "Username">
</div>
<div class = "input-group assessment-input-group">
<span class = "input-group-addon"><i class = "glyphicon glyphicon-lock"></i></span>
<input id = "login-password" type = "password" class = "form-control" name = "password" placeholder = "Password">
</div>
<div class = "form-group">
<div class = "col-sm-12 controls">
<input class = "btn btn-primary" type = "submit" value = "Login">
</div>
</div>
</form>
<div class = "login-form-error-text hidden">Invalid credentials</div>
</div>
</div>
</div>
</div>
</div>
<script src = "../javascript/jquery-3.3.1.min.js"></script>
<script src = "../javascript/bootstrap.min.js"></script>
<script src = "../javascript/lodash.min.js"></script>
<script src = "../javascript/login.js"></script>
</body>
</html>
Соответствующий js
$(document).ready(function () {
$('#loginform').submit(function (event) {
event.preventDefault();
$.ajax({
url : 'http://localhost:8080/j_spring_security_check',
type : 'POST',
contentType : 'application/json',
data : JSON.stringify({ j_username : $('#login-username').val(), j_password : $('#login-password').val() }),
success : function () {
window.location.href = '../html/assessment.html';
},
error : function () {
event.preventDefault();
alert('failed');
}
});
});
$('.form-tab-header').on('click', function () {
$('.login-form-error-text').addClass('hidden');
$('.form-tab-header').removeClass('active');
$(this).addClass('active');
$('.form-horizontal').addClass('hidden');
$('.' + $(this).attr('id') + '-content').removeClass('hidden');
});
});
Конфигурация безопасности
@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. Это механизм безопасности для предотвращения межсайтовых атак. у вас есть два варианта обходного пути:
поскольку csrf включен по умолчанию, методы POST и PUT Http не разрешены с включенным CSRF. для его отключения вы должны добавить это в свою конфигурацию безопасности
.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}" />
если вы хотите войти в систему с помощью ajax, вы также должны включить эти два параметра:
сначала сохраните значения некоторых переменных:
<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',
...
});
Не могли бы вы указать свой код конфигурации безопасности, чтобы я мог помочь вам лучше?
Отредактировал свой вопрос. пожалуйста, проверьте
Пожалуйста, проверьте, отключены ли файлы cookie в вашем браузере, если да, включите их и еще раз проверьте
вы имеете ввиду пропала ошибка 405? я не вижу вашего SuccessHandler (AuthenticationuccessHandler)? вам нужно где-то определить, аутентифицирован ли пользователь или нет
но проблема в том, что у меня есть фильтры входа в систему, поэтому его даже не туда ..... не могу найти, куда он перенаправляется из j_spring_security_check. Есть ли какие-нибудь журналы, в которых я могу больше отладить это.
если ваша ошибка 405 ушла, закройте этот вопрос. вам следует поднять другой вопрос по другому вопросу. Вы можете упомянуть меня там, я отвечу вам
Я уже отключил csrf. Должны ли мы по-прежнему включать csrftoken, как упоминалось в шаге 2?