Как я могу исправить проблему с входом в систему, которая не работает после включения CSRF в Spring Boot и Spring Security? - PullRequest
0 голосов
/ 16 июня 2019

У меня есть приложение весенней загрузки. Я использую Spring Security. Когда я попытался включить CSRF, не удалось выполнить вход в систему. Это работало до включения весенней безопасности. Пожалуйста, найдите вложение и ниже шаги, которые я сделал, чтобы включить CSRF. Может кто-нибудь помочь мне решить эту проблему?

Настройка безопасности

      http
            .authorizeRequests()                 
            .antMatchers("/ui/static/assets/**").permitAll()  
             .antMatchers("/register","/forgotPassword").permitAll()
            .anyRequest().authenticated()
            .and()
    .formLogin()
            .loginPage("/login")
            .permitAll()
            .defaultSuccessUrl("/addDocument")                                
            .failureHandler(customAuthenticationFailureHandler)        
            .and().exceptionHandling().accessDeniedPage("/Access_Denied")
            .and().logout().permitAll().invalidateHttpSession(true);

login.jsp

    <form action="${pageContext.servletContext.contextPath}/login" class="form-horizontal" method="post" id="formLogin" data-parsley-validate="">                                       
<sec:csrfInput /> 
    <input class="form-control input-lg" type="email" name="username" id="username"  placeholder="Enter your email" data-parsley-required="true">
    <input class="form-control input-lg" type="password" id="pwd" name="password" placeholder="Enter your password" data-parsley-required="true">
    <button class="btn w-lg btn-rounded btn-lg btn-primary waves-effect waves-light" id="signInBtn" type="submit" value="Next" >Sign In
</form>

addDocument.jsp

<form:form method="POST" action="${pageContext.servletContext.contextPath}/submitDocument" id="fileUploadForm" enctype="multipart/form-data" modelAttribute="documentSignature">
                                                    <form:hidden path="rewrite" value="true" />     
                                                    <sec:csrfInput/>


                                                    <div class="form-group row">
                                                    <label class="control-label col-md-3">Upload Document <span class="text-danger">*</span></label>
                                                    <div class="controls col-md-9">                                                    
                                                         <div class="form-group">                                                           
                                                              <input type="file" class="filestyle" id="fileUpload" name="file" data-buttonname="btn-primary" data-iconname="fa fa-upload">
                                                          </div>


                                                    </div>
                                                    </div>
                                                     <div class="form-group row">
                                                         <label class="col-lg-12 control-label ">(*) Mandatory</label>
                                                     </div>  
                                                    <div class="actions clearfix">                                                                                                                              
                                                        <!-- <input class="btn btn-primary customButton" id="btnAddDocument" type="submit" value="Next" >
                                                        <i class="fas fa-spinner fa-spin" id="loadingBtn" style="display:none;"></i>     -->                                                        
                                                        <button class="btn customButton btn-primary waves-effect waves-light" id="btnAddDocument" type="submit" value="Next">Next
                                                        <i class="fas fa-spinner fa-spin" id="loadingBtn" style="display:none;"></i></button>                                   
                                                    </div> 
                                            </form:form> 

enter image description here

enter image description here

enter image description here

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Если CSRF включен, вы должны включить _csrf .token на страницу, которую хотите войти или выйти из системы. В вашем login.jsp я не вижу того, что включено, что может вызвать проблему. Из официального документа следующие два способа добавить заголовок csrf: В вашем JSP вы можете включить его в свою форму, как:

Если вы используете Spring MVC tag, CsrfToken автоматически включается для вас с помощью CsrfRequestDataValueProcessor.

<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}"
    method="post">
  <input type="submit"
    value="Log out" />
  <input type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/>
</form

Или, если вы предпочитаете использовать ajax для запроса, вы можете добавить заголовки csrf в запрос ajax вручную. В этом случае вы можете добавить токен csrf в качестве метатегов в html и использовать jquery или javascript для получения Ток из html, который будет добавлен в запрос ajax.

<html>
  <head>
    <meta name="_csrf" content="${_csrf.token}"/>
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    ...
  </head>


$(function () {
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });
});

Код выше взят из официальной документации. Официальный документ

1 голос
/ 16 июня 2019

Если вы определите свою пользовательскую страницу входа, то:
В loginPage("/showLoginPage") вы должны передать URL для сопоставления вашему контроллеру. И вам нужно добавить loginProcessingUrl("/authenticate") для отправки запроса. (вы могли видеть javadoc о FormLoginConfigurer.loginPage () )
Пример: ваш возможный контроллер входа в систему

   @Controller
    public class LoginController {

        @GetMapping("/showLoginPage")
        public String showLoginPage() {
            return "login";  // your login jsp page
        }
    }

В SecurityConfuration

protected void configure(HttpSecurity http) throws Exception {
http. 
...
.loginPage("/showLoginPage")
.loginProcessingUrl("/authenticate")

На странице JSP login.jsp:

 <form:form action="${pageContext.request.contextPath}/authenticate" method="post">   
    <%-- authenticate=loginProcessingUrl-->
    ...  
</form:form>
...