【Spring Security系列】Spring Security,进阶学习

1. Spring Security 介绍

1.1. 什么是身份认证

1.2. 什么是用户授权

2. 开发环境搭建

2.1. 所用工具版本

2.2. pom依赖

3. 核心代码编写

3.1. 编写Security授权配置主文件

3.2. 重写UsernamePasswordAuthenticationFilter过滤器

3.3. 编写拦截器拦截请求token

3.4. 重写AuthenticationSuccessHandler处理用户登录成功操作

3.5. 重写AuthenticationFailureHandler处理用户登录失败操作

3.6. 身份校验失败处理器

3.7. 编写权限校验处理器

3.8. 重写LogoutHandler处理用户退出操作

3.9. 重写LogoutSuccessHandler处理用户退出成功操作

3.10 编写JWT工具类

4. 代码测试

4.1. 登录测试

4.2. 退出测试


1. Spring Security 介绍

Spring Security 是基于 Spring 的身份认证(Authentication)和用户授权(Authorization)框架,提供了一 套 Web 应用安全性的完整解决方案。其中核心技术使用了 Servlet 过滤器、IOC 和 AOP 等

1.1. 什么是身份认证

身份认证指的是用户去访问系统资源时,系统要求验证用户的身份信息,用户身份合法才访问对应资源。 常见的身份认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。

1.2. 什么是用户授权

当身份认证通过后,去访问系统的资源,系统会判断用户是否拥有访问该资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。 比如 会员管理模块有增删改查功能,有的用户只能进行查询,而有的用户可以进行修改、删除。一般来说, 系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

2. 开发环境搭建

2.1. 所用工具版本
依赖版本
Spring Boot2.6.14
java1.8
redis6.2
2.2. pom依赖
  1. 引入SpringBoot依赖
org.springframework.boot spring-boot-starter-parent 2.6.14
  1. 引入Spring Security依赖
org.springframework.boot spring-boot-starter-security
  1. 引入redis依赖
org.springframework.boot spring-boot-starter-data-redis 2.6.14
  1. 引入JWT依赖
io.jsonwebtoken jjwt 0.9.0

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年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

2590582504)]
[外链图片转存中…(img-EwdJNNbj-1712590582505)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
[外链图片转存中…(img-7ruVEucn-1712590582505)]

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值