2017-02-08 18 views
0

Я использую Spring 4.3.3, и я пытаюсь реализовать функции входа/выхода для своего приложения. Проблема, с которой я сталкиваюсь, заключается в том, что если я войду в систему и снова вернусь обратно, все работы, как ожидалось. Я попал на страницу входа в URL: login? Logout с успешно зарегистрированным сообщением в поле входа. Однако, если я вхожу в систему и перехожу на другую страницу, то выйдите из системы, и я снова вернусь на страницу входа с успешно зарегистрированным сообщением в поле входа в систему, но когда я нахожу логин, я не вошел в систему. Вместо этого я взял пароль с URL: войти без сообщений, и мне нужно нажать кнопку входа в систему второй раз, чтобы быть авторизованы Ниже некоторые из кода я используюПроблемы с безопасностью входа/выхода в Spring

security.xml

<http pattern="/resources/**" security="none"/> 
<http pattern="/forgot**" security="none"/> 
<http pattern="/reset**" security="none" /> 
<!-- enable use-expressions --> 
<security:http 
    auto-config="false" 
    use-expressions="true"> 
    <headers><cache-control/></headers> 
    <security:intercept-url pattern="/resources**" access="permitAll" /> 
    <security:intercept-url pattern="/login**" access="permitAll" /> 
    <security:intercept-url pattern="/users**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/suppliers**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/reports**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/games**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/clients**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/servers**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/> 
    <security:intercept-url pattern="/logs**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/> 

<!-- access denied page --> 
    <access-denied-handler error-page="/403" /> 
    <security:form-login 
     login-page="/login" 
     authentication-failure-url="/login?error" 

     username-parameter="username" 
     password-parameter="password" 
     login-processing-url="/auth/login_check" /> 

    <security:logout 
     invalidate-session="true" 
     logout-success-url="/login" 
     logout-url="/login?logout" 
     delete-cookies="JSESSIONID"/> 
    <!-- enable csrf protection --> 
    <csrf/> 
    <!-- Default lifeTime 2 weeks can be configured --> 
    <!--<remember-me key="uniqueAndSecret"/>--> 
</security:http> 

контроллер Метод

@RequestMapping(value = "/login", method = RequestMethod.GET) 
public @ResponseBody ModelAndView login(@RequestParam(value = "error", required = false) String error, @RequestParam(value = "logout", required = false) String logout, HttpServletResponse response, HttpServletRequest request, SessionStatus sessionStatus) throws IOException { 

    ModelAndView model = new ModelAndView(); 

    if (error != null) { 
     model.addObject("error", getErrorMessage(request, "SPRING_SECURITY_LAST_EXCEPTION")); 
    } 

    if (logout != null) { 

     HttpSession session= request.getSession(false); 

     SecurityContextHolder.clearContext(); 
     session= request.getSession(false); 

     if(session != null) { 
      session.invalidate(); 
     } 

     for(Cookie cookie : request.getCookies()) { 
       cookie.setMaxAge(0); 
     } 

     //sessionStatus.setComplete(); 
     //request.getSession(false).invalidate(); 

     model.addObject("msg", "You've been logged out successfully."); 
    } 
    model.setViewName("login"); 
    return model; 

} 
.

login.jsp

<form name='loginForm' action="<c:url value='/auth/login_check?targetUrl=${targetUrl}' />" method='POST'> 
     <div class="form-group"> 
      <div id="emailError" class="alert alert-danger" style="display:none;"></div> 
      <label for="email">Email 
       <input class="form-control" id="email" type="email" name="username" placeholder="Email"> 
      </label> 
     </div> 
     <div class="form-group"> 
      <label for="password">Password 
       <input class="form-control" id="password" type="password" name="password" placeholder="Password"> 
      </label> 
     </div> 
      Remember Me: <input type="checkbox" name="remember-me" /> 
      <input id="login"class="btn btn-primary" name="submit" type="submit" value="Login"> 
      <div><a id="forgotPass">forgot password</a></div> 
     <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
    </form> 
+0

Привет, Не уверен. Я просто следил за учебником, и у него были две звездочки. Можете ли вы объяснить, почему/logs ** никогда не попадут? – user3389610

+0

Если у вас нет «/ auth» в списке «Разрешить все»? –

+0

@dur, так как метод формы задается с помощью auth/login_check, будет ли Spring обрабатывать эти запросы как упоминаемые как «URL-адрес для обработки входа»? Другая мысль заключается в том, что перенаправление происходит потому, что у него есть targetUrl = somereference, будет ли конфигурация изменена с помощью подстановочного соответствия login-processing-url = "/ auth/login_check *"? –

ответ

0

Судя по вашей конфигурации безопасности, я не уверен, что вы используете CookieCsrfTokenRepository или нет. Я вижу, что вы вручную истекающий все куки при выходе из:

for(Cookie cookie : request.getCookies()) { 
    cookie.setMaxAge(0); 
} 

Если у вас есть другие куки вручную, установленные в приложении, то куки сессии будут удалены по умолчанию, так как вы настроили его сделать так:

<security:logout 
    ... 
    delete-cookies="JSESSIONID"/> 

Я предполагаю, что вы также очищаете куки-файл курсора CSRF, поэтому страница входа в систему, которая отображается без маркера. Отправка формы может привести к ошибке из-за несоответствия CSRF, возвращая вас на страницу входа. На этот раз значение CSRF будет установлено снова, и последующая попытка входа будет успешной.

+0

Привет @ frederik-heremans Спасибо за ваш ответ. Я думаю, что это была проблема. я удалил код из контроллера, истекающего сессию, и файлы cookie, и он работает так, как ожидалось. Однако я заметил еще одну проблему. Как только я выйду из системы. Если я вручную отредактирую URL-адрес, я правильно перенаправлен на страницу входа, но если я вернусь, я перейду на предыдущую страницу и все еще выполнил вход в систему. – user3389610

+0

Как упомянуто в @dur, «Spring Security делает это за вас, вы уже настроили его. ». Либо вы используете механизм выхода из системы Spring-Security (который обрабатывает недействительность сеанса для вашего), либо вы реализуете свою собственную логику «выхода» (которую вы делаете) в контроллере - здесь вам все равно необходимо аннулировать сеанс. Это приведет к переадресации на страницу входа, так как нет действительных учетных данных, и пружины безопасности ... –