Spring Security是一个非常强大的安全框架,提供了很多实用的安全特性,可以使web应用程序更加安全可靠。其中,添加图片验证功能可以提高网站的安全性。下面是实现添加图片验证功能的完整攻略。
步骤一:添加依赖
在pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
依赖说明:
spring-boot-starter-security
:Spring Security的核心依赖,提供了基本的安全功能。jackson-databind
:JSON数据绑定工具,用于将图片验证码数据转换为JSON格式。kaptcha
:用于生成图片验证码。
步骤二:添加配置
在application.properties文件中添加如下配置:
# Security配置
spring.security.user.name=user
spring.security.user.password=password
# Kaptcha配置
kaptcha.border=no
kaptcha.border.color=255,255,255
kaptcha.textproducer.font.color=black
kaptcha.image.width=150
kaptcha.image.height=50
kaptcha.textproducer.char.length=4
kaptcha.textproducer.font.size=30
依赖说明:
spring.security.user.name
:Spring Security的用户名。spring.security.user.password
:Spring Security的密码。kaptcha.*
:用于配置图形验证码。
步骤三:实现验证码生成接口
在接口中,我们使用了com.google.code.kaptcha
包下的DefaultKaptcha
类来生成验证码。实现代码如下所示:
@RestController
@RequestMapping("/api/captcha")
public class CaptchaController {
@Autowired
private DefaultKaptcha captchaProducer;
@GetMapping(produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<BufferedImage> getCaptcha() {
HttpHeaders headers = new HttpHeaders();
headers.setCacheControl(CacheControl.noCache().getHeaderValue());
String text = captchaProducer.createText();
BufferedImage image = captchaProducer.createImage(text);
// 设置验证码到session
RequestContextUtils.getWebApplicationContext(
Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))
.getServletContext().setAttribute("captcha", text);
return new ResponseEntity<>(image, headers, HttpStatus.OK);
}
}
这个接口返回的ResponseEntity对象包含了验证码图片、响应头以及状态码。
步骤四:实现验证码验证过滤器
在Spring Security中,实现自定义的过滤器非常简单。我们只需要继承OncePerRequestFilter
类,并且重写doFilterInternal()
方法,实现验证码的逻辑。实现代码如下所示:
public class CaptchaFilter extends OncePerRequestFilter {
private static final String LOGIN_URL = "/login";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
if (LOGIN_URL.equals(request.getRequestURI()) && "POST".equalsIgnoreCase(request.getMethod())) {
String captcha = request.getParameter("captcha");
String sessionCaptcha = (String) request.getSession().getServletContext().getAttribute("captcha");
if (!captcha.equals(sessionCaptcha)) {
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding("UTF-8");
ObjectMapper mapper = new ObjectMapper();
Map<String, String> error = new HashMap<>();
error.put("error", "验证码错误");
response.getWriter().write(mapper.writeValueAsString(error));
return;
}
}
filterChain.doFilter(request, response);
}
}
在上面的代码中,我们可以看到,如果验证码不匹配,我们将返回一个JSON格式的错误信息。否则,我们将交由下一个过滤器处理。
步骤五:配置Spring Security
在Spring Security的配置类中添加上面的过滤器,并且关闭CSRF和HTTP Basic认证。示例代码如下所示:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CaptchaFilter captchaFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
// 关闭CSRF和HTTP Basic认证
http.csrf().disable().httpBasic().disable();
// 配置验证码过滤器
http.addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class);
// 配置登录页面和错误页面
http.formLogin()
.loginPage("/login")
.failureForwardUrl("/login?error")
.permitAll()
.and().logout().permitAll();
// 配置授权规则
http.authorizeRequests()
.antMatchers("/css/**", "/js/**", "/images/**").permitAll()
.anyRequest().authenticated();
}
}
示例一:登录页添加验证码
在login.html
的文件中,添加以下HTML代码:
<img class="img-captcha" src="/api/captcha" alt="验证码">
<input type="text" class="form-control" id="captcha" name="captcha" placeholder="请输入验证码" required>
在JQuery中添加以下代码:
$('form').submit(function (event) {
var form = $(this);
event.preventDefault();
$.get('/api/captcha')
.done(function () {
form.off('submit').on('submit', function () {
return true;
});
form.submit();
})
.fail(function () {
alert('获取验证码失败,请重试!');
});
$('#captcha').val('');
});
我们为“form”元素添加了一个submit事件的监听器,当用户点击“登录”按钮时,我们首先获取验证码,然后将其添加到请求中。如果我们没有获取到验证码,我们将提示用户重试。
示例二:实现后端验证
在login.html
的文件中,添加以下HTML代码:
<span style="color: #dc3545; display: none;" id="errorMessage">验证码错误,请重试!</span>
在JQuery中添加以下代码:
$.ajax({
type: 'post',
url: form.attr('action'),
data: form.serialize(),
success: function () {
// 登录成功
},
error: function (xhr) {
var errors = xhr.responseJSON;
if ('error' in errors && errors.error === '验证码错误') {
$('#captcha').val('');
$('#errorMessage').show();
}
}
});
在上述代码中,如果登录失败,我们通过检查响应JSON中的错误是否等于“验证码错误”来检查验证码是否错误。
到此,我们就成功地实现了添加图片验证功能的攻略。实现图片验证码可以使我们的Web应用更加安全可靠,为用户提供更好的用户体验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security实现添加图片验证功能 - Python技术站