SpringSecurity入门

}

@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)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值