下面我将为您详细介绍“SpringBoot Security前后端分离登录验证的实现”的完整攻略,包含了两条示例。
1. 概述
Spring Security 是 Spring Framework 的一个模块,用于提供身份认证和授权机制。SpringBoot Security是Spring Security的简化封装版本,可以更加方便的集成到SpringBoot项目中。
本篇教程将从前后端分离的角度出发,介绍如何使用SpringBoot Security实现登录验证。
2. 实现步骤
2.1 添加依赖
在 pom.xml
文件中添加 SpringBoot Security 的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2 配置类
创建一个配置类,用于配置身份认证和授权机制:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and().formLogin()
.loginProcessingUrl("/login").permitAll()
.successHandler((request, response, authentication) -> {
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(new ObjectMapper().writeValueAsString("登录成功"));
})
.failureHandler((request, response, exception) -> {
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(new ObjectMapper().writeValueAsString("登录失败"));
})
.and().logout().permitAll()
.deleteCookies("JSESSIONID")
.and().httpBasic();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
在该配置类中,我们通过 configure(HttpSecurity http)
方法配置了对 /login
路径的访问不需要认证,并且所有其他的路径都需要认证。同时,我们使用了一个自定义的登录模板,用于处理登录成功和登录失败的事件。登录成功时,返回 "登录成功" 的 JSON 格式信息;登录失败时,返回 "登录失败" 的 JSON 格式信息。在 configure(AuthenticationManagerBuilder auth)
方法中,我们使用了一个 UserService
对象作为认证处理器,并指定使用 BCryptPasswordEncoder
对密码进行加密。
2.3 安全层
在前后端分离的情况下,我们可以通过添加安全层来实现登录验证。
安全层可以通过编写拦截器的方式来实现:
@Component
public class SecurityInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String path = request.getRequestURI();
if ("/login".equals(path)) {
return true;
}
HttpSession session = request.getSession();
if (session.getAttribute("user") != null) {
return true;
}
response.getWriter().write(new ObjectMapper().writeValueAsString("未登录或登录已过期"));
return false;
}
}
在上述代码中,我们编写了一个拦截器,用于拦截除了 /login
以外的所有路径。我们检查用户是否登录,如果登录了,则允许放行,否则返回 "未登录或登录已过期" 的 JSON 格式信息。
2.4 控制层
在我们的控制层中,我们需要添加一个 /login
的路由,用于接收用户的登录请求,并调用Spring Security的API进行用户身份认证:
@RestController
public class LoginController {
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
Authentication authentication = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
session.setAttribute("user", authentication.getName());
return "登录成功";
}
@GetMapping("/logout")
public String logout(HttpSession session) {
session.removeAttribute("user");
return "退出成功";
}
}
在上述代码中,我们通过Spring Security的API对用户输入的用户名和密码进行身份认证,并将认证结果存入Spring Security的上下文中。如果认证成功,则将用户信息存入Session中。当用户点击退出登录时,我们清除Session中的用户信息。
到此为止,我们就完成了SpringBoot Security前后端分离登录验证的实现。
3. 示例
示例1:登录成功
请求:
curl -X POST http://localhost:8080/login -d 'username=admin&password=admin'
返回:
"登录成功"
示例2:已登录
请求:
curl -X GET http://localhost:8080/user
返回:
"未登录或登录已过期"
以上就是使用SpringBoot Security实现前后端分离登录验证的攻略了,希望可以对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot Security前后端分离登录验证的实现 - Python技术站