3.2. 重写UsernamePasswordAuthenticationFilter过滤器
3.4. 重写AuthenticationSuccessHandler处理用户登录成功操作
3.5. 重写AuthenticationFailureHandler处理用户登录失败操作
3.9. 重写LogoutSuccessHandler处理用户退出成功操作
1. Spring Security 介绍
Spring Security 是基于 Spring 的身份认证(Authentication)和用户授权(Authorization)框架,提供了一 套 Web 应用安全性的完整解决方案。其中核心技术使用了 Servlet 过滤器、IOC 和 AOP 等
1.1. 什么是身份认证
身份认证指的是用户去访问系统资源时,系统要求验证用户的身份信息,用户身份合法才访问对应资源。 常见的身份认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
1.2. 什么是用户授权
当身份认证通过后,去访问系统的资源,系统会判断用户是否拥有访问该资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。 比如 会员管理模块有增删改查功能,有的用户只能进行查询,而有的用户可以进行修改、删除。一般来说, 系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。
2. 开发环境搭建
2.1. 所用工具版本
依赖 | 版本 |
---|---|
Spring Boot | 2.6.14 |
java | 1.8 |
redis | 6.2 |
2.2. pom依赖
- 引入SpringBoot依赖
- 引入Spring Security依赖
- 引入redis依赖
- 引入JWT依赖
3. 核心代码编写
3.1. 编写Security授权配置主文件
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier(“authUserDetailsServiceImpl”)
private UserDetailsService userDetailsService;
@Autowired
private SecurOncePerRequestFilter securOncePerRequestFilter;
@Autowired
private SecurAuthenticationEntryPoint securAuthenticationEntryPoint;
@Autowired
private SecurAccessDeniedHandler securAccessDeniedHandler;
//登录成功处理器
@Autowired
private SecurAuthenticationSuccessHandler securAuthenticationSuccessHandler;
@Autowired
private SecurAuthenticationFailureHandler securAuthenticationFailureHandler;
//退出处理器
@Autowired
private SecurLogoutHandler securLogoutHandler;
@Autowired
private SecurLogoutSuccessHandler securLogoutSuccessHandler;
@Autowired
BCryptPasswordEncoderUtil bCryptPasswordEncoderUtil;
/**
- 从容器中取出 AuthenticationManagerBuilder,执行方法里面的逻辑之后,放回容器
- @param authenticationManagerBuilder
- @throws Exception
*/
@Autowired
public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoderUtil);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//第1步:解决跨域问题。cors 预检请求放行,让Spring security 放行所有preflight request(cors 预检请求)
http.authorizeRequests().requestMatchers(CorsUtils::isPreFlightRequest).permitAll();
//第2步:让Security永远不会创建HttpSession,它不会使用HttpSession来获取SecurityContext
http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().headers().cacheControl();
//第3步:请求权限配置
//放行注册API请求,其它任何请求都必须经过身份验证.
http.authorizeRequests()
.antMatchers(HttpMethod.POST,“/sys-user/register”).permitAll()
.antMatchers(“/v2/api-docs”, “/v2/feign-docs”,
“/swagger-resources/configuration/ui”,
“/swagger-resources”,“/swagger-resources/configuration/security”,
“/swagger-ui.html”, “/webjars/**”).permitAll()
.anyRequest().authenticated();
//第4步:拦截账号、密码。覆盖 UsernamePasswordAuthenticationFilter过滤器
http.addFilterAt(securUsernamePasswordAuthenticationFilter() , UsernamePasswordAuthenticationFilter.class);
//第5步:拦截token,并检测。在 UsernamePasswordAuthenticationFilter 之前添加 JwtAuthenticationTokenFilter
http.addFilterBefore(securOncePerRequestFilter, UsernamePasswordAuthenticationFilter.class);
//第6步:处理异常情况:认证失败和权限不足
http.exceptionHandling().authenticationEntryPoint(securAuthenticationEntryPoint).accessDeniedHandler(securAccessDeniedHandler);
//第7步:登录,因为使用前端发送JSON方式进行登录,所以登录模式不设置也是可以的。
http.formLogin();
//第8步:退出
http.logout().addLogoutHandler(securLogoutHandler).logoutSuccessHandler(securLogoutSuccessHandler);
}
/**
- 手动注册账号、密码拦截器
- @return
- @throws Exception
*/
@Bean
SecurUsernamePasswordAuthenticationFilter securUsernamePasswordAuthenticationFilter() throws Exception {
SecurUsernamePasswordAuthenticationFilter filter = new SecurUsernamePasswordAuthenticationFilter();
//成功后处理
filter.setAuthenticationSuccessHandler(securAuthenticationSuccessHandler);
//失败后处理
filter.setAuthenticationFailureHandler(securAuthenticationFailureHandler);
filter.setAuthenticationManager(authenticationManagerBean());
return filter;
}
}
3.2. 重写UsernamePasswordAuthenticationFilter过滤器
public class SecurUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Autowired
ISysUserService userService;
@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) throws AuthenticationException {
if (request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE)
|| request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)) {
ObjectMapper mapper = new ObjectMapper();
UsernamePasswordAuthenticationToken authRequest = null;
//取authenticationBean
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
2590582504)]
[外链图片转存中…(img-EwdJNNbj-1712590582505)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
[外链图片转存中…(img-7ruVEucn-1712590582505)]