2016-12-10 4 views
2

У меня есть Maven, Spring Boot, Spring MVC, проект стека AngularJS. Для страницы входа я использую Spring Security для обработки подтверждения подтверждения имени пользователя/пароля (от клиента angularJS). Он отлично работает, но мне также нужно проверить, что поле входящего пароля не длиннее определенной длины (до того, как оно было проверено для проверки) (я читал, что это предоставляет определенный риск безопасности при использовании ByCrypt, поскольку пользователи могут отправлять чрезвычайно длинные пароли , что занимает слишком много времени для хеширования)Весенняя безопасность: как проверить длину пароля

В любом случае есть ли способ выполнить это с помощью Spring Security? Вероятно, я мог бы сделать это в своем классе CustomUserDetailService или SpringSecurityConfiguration, но не мог понять, как это сделать.

+0

Вы аутентичности как этот 'аутентификации Authentication = authenticationManager.authenticate ( новый UsernamePasswordAuthenticationToken ( имя пользователя, пароль() ) );' –

ответ

1

Вы можете иметь подтверждение в Spring MVC, вы должны реализующий интерфейс Validator как

public class PassValidator implements Validator { 

    @Override 
    public boolean supports(Class<?> clazz) { 
     return yourclass.class.equals(clazz); 
    } 

    @Override 
    public void validate(Object obj, Errors errors) { 
     YourClass myClass = (YourClass) obj; 

     if(myClass.getPassword().length() < 8){ 
      errors.rejectValue("password", "myClass.pass", "The name is too short"); 
     } 

    } 

} 

и в классе контроллера определяют

@InitBinder 
public void initBinder(WebDataBinder binder){ 
    binder.addValidators(new PassValidator()); 
} 

имея этот метод, вы можете использовать проверить введенные данные например

@RequestMapping(value="/yourUrl", method=RequestMethod.POST) 
    public String foo(@Valid @ModelAttribute YourClass myClass , Errors errors){ 

     if(!errors.hasErrors()){ 
      System.out.println("The password validated."); 
     }else{ 
      System.out.println("the password did not validate"); 
     } 

     return "somewhere"; 
    } 

также вы должны добавить

<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.1.0.Final</version> 
</dependency> 

к вашему pom.xml

другой подход Bean Validation вы можете добавить аннотации к вашим лицам вы можете прочитать documentations

+0

Тпх. Это выглядит сложнее, чем я думал. Тогда это не просто добавление к классу сущностей. Поле пароля @Size (max = 14) будет достаточно? Но тогда как я могу быть уверен, что его подтвердили до того, как он достигнет весеннего уровня безопасности? – Spring

+0

Проверка выполняется до достижения уровня безопасности Spring, поскольку он будет проверяться в вашем контроллере просмотра, а затем он будет получать учетные данные из вашей базы данных или LDAP. –

+0

Я просто понял, что не могу использовать этот подход выше, у меня нет конечной точки, где я могу установите валидатор. Его все связано с регистрацией весны. – Spring

2

Мне интересно, где вы читали информацию о Bcrypt а длина пароля? Время, затрачиваемое алгоритмом, должно зависеть только от стоимостного коэффициента. Алгоритм использует пароль для создания потока из 18 слов, которые он многократно выполняет. Таким образом, размер используемого пароля ограничен теоретически до 72 байтов. Все, кроме этого, будет проигнорировано.

Вот быстрый тест (в Haskell РЕПЛ, поэтому не представитель бинарными раз), чтобы продемонстрировать:

Data.ByteString> hashPassword 5 p :: IO ByteString 
"$2a$05$D2.hLTr0U1xMul/Y2Wsbjeddxp9SNumh5rAe.1oyaZUL4SceCZqUK" 
(0.46 secs, 1,673,001,216 bytes) 
Data.ByteString> hashPassword 5 tags :: IO ByteString 
"$2a$05$bu9zO6ricNsrDTynjLm72emmiIdxulTXFGz0F11WOpSkh/R5viSmC" 
(0.43 secs, 1,672,997,088 bytes) 
Data.ByteString> Data.ByteString.length p 
8 
Data.ByteString> Data.ByteString.length tags 
1274875 

p является строка «пароль» и tags мой Emacs теги файл, который является 1.2MB в размере. Поскольку вы можете видеть, что время, затраченное на хэш, одинаково. Как и ожидалось, увеличение коэффициента затрат на единицу удваивает время хеширования:

Data.ByteString> hashPassword 6 p :: IO ByteString 
"$2a$06$UCIg6bMg57zvl2BM38cAeeg028oQ015Kt4V10J9OpZ3NsInOH.KJW" 
(0.87 secs, 3,311,739,024 bytes) 
Data.ByteString> hashPassword 6 tags :: IO ByteString 
"$2a$06$GpqdSvGMJ/v3H9NycKjBceKE.J9VzrwtYneIFyvlLMyAjUI71AnCe" 
(0.85 secs, 3,311,748,456 bytes) 

Так что я думаю, что предположение, на котором основан этот вопрос является ложным. Размер HTTP-запросов в целом должен быть ограничен для вашего приложения, но вам, вероятно, не нужно беспокоиться о длительности паролей.

+0

спасибо, что вы правы. И как вы предлагаете ограничить размер HTTP-запросов в моем стеке? – Spring

+0

Это зависит от того, из чего состоит ваш стек. У разъемов Tomcat есть настройки для этого, так же как и nginx. Это довольно стандартная вещь с веб-серверами, поэтому вы найдете ее, если будете искать. –

Смежные вопросы