}
@RequestMapping("/success")
public String success(){
return "success";
}
@RequestMapping("/fail")
public String fail(){
return "fail";
}
}
#### 2、测试
地址:localhost:8080/hello
![](https://img-blog.csdnimg.cn/direct/2fe284fc8354490abd109a2260922661.png)
初始用户:user ,密码:控制台输出。
### 三、认证
#### 1、登录校验流程
![](https://img-blog.csdnimg.cn/direct/dd4e9b5dfe4a46b09b21ecc0ced2011e.png)
SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。
![](https://img-blog.csdnimg.cn/direct/80185f2075ed4f79aeab0ea4816782ed.png)
1. UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
2. ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException。
3. FilterSecurityInterceptor:负责权限校验的过滤器。
#### 2、认证流程
![](https://img-blog.csdnimg.cn/direct/8a215a8555d54735bb365c67e6c42311.png)
1. Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
2. AuthenticationManager接口:定义了认证Authentication的方法
3. UserDetailsService接口:加载用户特定数据的核心接口。里面定义了一个根据用户名查询用户信息的方法。
4. UserDetails接口:提供核心用户信息。通过UserDetailsService根据用户名获取处理的用户信息要封装成UserDetails对象返回。然后将这些信息封装到Authentication对象中。
#### 3、自定义认证方式
所以根据流程图可知我们只需要实现UserDetailsService接口,就可以实现我们自己的认证
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>().eq(User::getName, username);
User user = userMapper.selectOne(queryWrapper);
//if(null == user){
if(Objects.isNull(user)){
throw new RuntimeException("用户名或密码错误");
}
LoginUser loginUser = new LoginUser(user);
//TODO:查询用户权限
//继承UserDetails类
return loginUser;
}
}
security配置:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Autowired
private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
/**
*加密解密
*/
@Bean
public PasswordEncoder passwordEncoder(){
//加密器的实现器
//return new BCryptPasswordEncoder(10);
//明文密码
return NoOpPasswordEncoder.getInstance();
}
/**
* 登录时需要调用AuthenticationManager.authenticate执行一次校验
*
* @param config
* @return
* @throws Exception
*/
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
return config.getAuthenticationManager();
}
/**
* 放行
*/
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// 禁用basic明文验证
//.httpBasic().disable()
// 前后端分离架构不需要csrf保护
.csrf().disable()
// 禁用默认登录页
//.formLogin().disable()
// 禁用默认登出页
//.logout().disable()
// 设置异常的EntryPoint,如果不设置,默认使用Http403ForbiddenEntryPoint
//.exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(invalidAuthenticationEntryPoint))
// 前后端分离是无状态的,不需要session了,直接禁用。
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests
// 允许所有OPTIONS请求
//.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
// 允许直接访问授权登录接口
.requestMatchers(HttpMethod.POST, "/user/login").permitAll()
// 允许 SpringMVC 的默认错误地址匿名访问
//.requestMatchers("/error").permitAll()
// 其他所有接口必须有Authority信息,Authority在登录成功后的UserDetailsImpl对象中默认设置“ROLE_USER”
//.requestMatchers("/**").hasAnyAuthority("ROLE_USER")
// 允许任意请求被已登录用户访问,不检查Authority
.anyRequest().authenticated())
//.authenticationProvider(authenticationProvider())
// 加我们自定义的过滤器,替代UsernamePasswordAuthenticationFilter
.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
此时就可以使用数据库中的用户名和密码进行登录校验
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/0b093ade23885ac1ec31b21e7090a7ad.png)
![img](https://img-blog.csdnimg.cn/img_convert/08c0cac498ceb89594074801b30fd25a.png)
![img](https://img-blog.csdnimg.cn/img_convert/1104a52d89e8e127f24db69add094a96.png)
![img](https://img-blog.csdnimg.cn/img_convert/cabea59fe5e62e67285e79fcd8a37cd5.png)
![img](https://img-blog.csdnimg.cn/img_convert/00433270d37c943ed6bfc2010ace965d.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**