В этой статье представлены Springboot в сочетании с Springsecurity для реализации функции кода графического проверки, и делится ее с вами следующим образом:
Генерировать графическую проверку кода
Процесс генерации кодов графической проверки относительно прост и не имеет ничего общего с Springsecurity. Итак, я только что опубликовал код
Генерировать изображения на основе случайных чисел
/** * Сгенерировать графический код проверки * @param запрос * @return */private ImageCode Generate (ServletWebRequest) {int width = 64; int height = 32; BufferedImage Image = new BufferedImage (ширина, высота, bufferedimage.type_int_rgb); Graphics g = image.getGraphics (); Случайный случайный = new Random (); g.setcolor (getrandcolor (200, 250)); G.FillRect (0, 0, ширина, высота); G.SetFont (новый шрифт («Times New Roman», Font.italic, 20)); g.setcolor (getrandcolor (160, 200)); for (int i = 0; i <155; i ++) {int x = random.nextint (ширина); int y = random.nextint (высота); int xl = random.nextint (12); int yl = random.nextint (12); g.drawline (x, y, x + xl, y + yl); } String srand = ""; for (int i = 0; i <4; i ++) {string rand = string.valueof (random.nextint (10)); srand += rand; g.setcolor (новый цвет (20 + random.nextint (110), 20 + random.nextint (110), 20 + random.nextint (110))); g.drawstring (rand, 13 * i + 6, 16); } g.dispose (); Вернуть новый ImageCode (Image, Srand, 60);}/** * Сгенерировать случайные фоновые полосы * * @param fc * @param bc * @return */private color getrandcolor (int fc, int bc) {randing random = new random (); if (fc> 255) {fc = 255; } if (bc> 255) {bc = 255; } int r = fc + random.nextint (bc - fc); int g = fc + random.nextint (bc - fc); int b = fc + random.nextint (bc - fc); вернуть новый цвет (r, g, b);}Сохранить случайные числа в сеансе и написать сгенерированное изображение в ответ интерфейса
@Restcontrollerpublic class validatecodecontroller {public static final String session_key = "session_key_image_code"; Private SessionStrategy SessionStrategy = new httpsessionsStarestrategy (); @Getmapping ("/code/image") public void createCode (httpservlectrequest, httpservletresponse response) throws ioexception {imageecode imageecode = Generate (new ServletWebRequest (запрос)); sessionstrategy.setattribute (новый ServletWebRequest (запрос), session_key, imageecode); Imageio.write (imageecode.getimage (), "jpeg", response.getOutputStream ()); }}Добавить графический код проверки в процесс аутентификации
В подробном объяснении процесса аутентификации Springsecurity мы упомянули, что Springsecurity проверяется через цепочку фильтров. Мы хотим проверить код графической проверки, чтобы мы могли проверить его до процесса аутентификации, то есть до того, как UsernamePasswordAuthenticationFilter .
Пользовательский фильтр кода графической проверки
@Componentpublic class validatecodefilter Extens OncePerrequestFilter {Private SessionStrategy SessionStrategy = new httpsessionsSessionStrategy (); частная аутентификация failureHandler AuthenticationFailureHandler; @Override Protected void dofilterinternal (httpservletrequest httpservletrequest, httpservletresponse httpservlectresponse, filterchain filterchain) thripting servletexcept StringUtils.equalsignorecase (httpservletrequest.getmethod (), "post")) {try {// 1. Проверьте проверку проверки кода (новый ServletwebRequest (httpservletrequest)); } catch (validAteCodeexception e) {// 2. Если проверка не удается, вызовов сбоя в процессе проверки подлинности. возвращаться ; }} // 3. Если проверка передается, выпустите FilterChain.dofilter (httpservletrequest, httpservletresponse); }}Процесс проверки проверки кода здесь относительно прост. В основном он определяет, соответствуют ли прошедшие параметры с сохраненными в сеансе, и истек ли срок службы проверки в сеансе.
После нашего собственного фильтра проверки кода нам также необходимо настроить его перед UserNamePassWordAuthenticationFilter:
@OverrideProtected void configure (httpsecurity http) выбрасывает Exception {validatecodefilter validatecodefilter = new ValidateCodefilter (); validatecodefilter.setauthenticationfailureHandler (myAuthenticationFailureHandler); // Настроить наши пользовательские фильтры в UserNamePassWordAuthenticationFilter до http.addfilterbefore (validatecodefilter, usernamepasswordauthenticationfilter.class) .formlogin () // Определить страницу входа в систему, на которую необходимо войти.Код скачать
Весенняя безопасность
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.