# repair **Repository Path**: lijingwei22/repair ## Basic Information - **Project Name**: repair - **Description**: 工单 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-07 - **Last Updated**: 2025-08-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springsecurity学习 ## 认证部分 #### 原理: > springsecurity可以理解为一个过滤器链,包含了各种权限校验的功能,并且我们可以在某过滤器链前面或者后面加上自定义过滤器 #### 方法步骤: > 1. 编写登录接口 > 2. 用户信息构造成“UsernamePasswordAuthenticationToken”然后放入(需要注入)AuthenticationManager.authenticate进行验证身份 > 3. 会经过UserDetailsService,一般身份信息会在数据库中所以我们需要写一个UserDetailsService的实现,通过username查找用户信息并返回 > 4. 自定义过滤器 > 5. 由于过滤器一个请求可能请求多次会造成麻烦故我们使用oncePerRequestFileFilter > 6. 实现doFilterInternal方法 > 1. 获取token > 2. 解析token > 3. 通过token解析出来的业务标识获取redis中用户信息 > 4. 将用户信息放入security上下文中 >7. 编写securityConfiguration > 8. 注入AuthenticationManager.authenticate > 9. 注入加密类型PasswordEncoder的实现均可BCryptPasswordEncoder > 10. 编写configure > 1. 关闭crsf > 2. 配置会话为不创建 > 3. 开放接口"/user/login" > 4. 指定其他接口都需要认证 > > 11. 配置自定义过滤器位置,放在UsernamePasswordAuthenticationFilter前面 ## 授权部分 > 1. 在配置类上加上注解@EnableGlobalMethodSecurity(prePostEnabled = true) > 2. 在UserDetailsService中查询用户信息时将用户权限放入返回的LoginUser中 > 3. 过滤器获取到用户信息之后将权限列表放入security上下文中SecurityContextHolder.getContext().setAuthentication(authenticationToken) > 4. 在接口上可以加上对应的权限@PreAuthorize("hasAnyAuthority('sys:test:abc')") > > ## 自定义异常 > 1. 实现异常类 具体见AccessDeniedHandlerImpl,AuthenticationEntryPointImpl > 2. 配置异常类 SecurityConfig