Проблема с аутентификацией Springboot

У меня есть приложение для весенней загрузки с настроенной безопасностью 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;
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
477
1

Ответы 1

Вы забыли включить значения csrf. Это механизм безопасности для предотвращения межсайтовых атак. у вас есть два варианта обходного пути:

1. Отключение 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',

    ...
});

Больше информации

Я уже отключил csrf. Должны ли мы по-прежнему включать csrftoken, как упоминалось в шаге 2?

user3310115 09.09.2018 09:41

Не могли бы вы указать свой код конфигурации безопасности, чтобы я мог помочь вам лучше?

MohammadReza Alagheband 09.09.2018 09:49

Отредактировал свой вопрос. пожалуйста, проверьте

user3310115 09.09.2018 09:53

Пожалуйста, проверьте, отключены ли файлы cookie в вашем браузере, если да, включите их и еще раз проверьте

MohammadReza Alagheband 09.09.2018 10:09

вы имеете ввиду пропала ошибка 405? я не вижу вашего SuccessHandler (AuthenticationuccessHandler)? вам нужно где-то определить, аутентифицирован ли пользователь или нет

MohammadReza Alagheband 09.09.2018 10:22

но проблема в том, что у меня есть фильтры входа в систему, поэтому его даже не туда ..... не могу найти, куда он перенаправляется из j_spring_security_check. Есть ли какие-нибудь журналы, в которых я могу больше отладить это.

user3310115 09.09.2018 10:26

если ваша ошибка 405 ушла, закройте этот вопрос. вам следует поднять другой вопрос по другому вопросу. Вы можете упомянуть меня там, я отвечу вам

MohammadReza Alagheband 09.09.2018 10:29

Другие вопросы по теме