Spring Security之认证,2024年最新算法+分布式+微服务

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

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

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

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

mysql mysql-connector-java runtime com.baomidou mybatis-plus-boot-starter 3.5.0 org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test

3.为SpringBoot项目编写配置文件



server:
port: 80

#日志格式
logging:
pattern:
console: ‘%d{HH:mm:ss.SSS} %clr(%-5level) — [%-15thread] %cyan(%-50logger{50}):%msg%n’

数据源

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///mysecurity?serverTimezone=UTC
username: root
password: root


4.在template文件夹编写项目主页面main.html



主页面

主页面


5.编写访问页面控制器



@Controller
public class PageController {
@RequestMapping(“/{page}”)
public String showPage(@PathVariable String page){
return page;
}
}


### 数据库认证


在实际的项目中,用户通过输入用户名和密码,待验证通过后即登录成功,而用户信息大多保存在数据库中。而用户身份验证的这个过程,我们称之为认证逻辑。  
 1.准备数据库数据,用户信息数据都是保存在该数据库中



CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255),
password varchar(255) ,
phone varchar(255) ,
PRIMARY KEY (id)
);

INSERT INTO users VALUES (1, ‘baizhan’, ‘baizhan’, ‘13812345678’);
INSERT INTO users VALUES (2, ‘sxt’, ‘sxt’, ‘13812345678’);


2.编写用户实体类



@Data
public class Users {
private Integer id;
private String username;
private String password;
private String phone;
}


3.编写dao接口



public interface UsersMapper extends BaseMapper {
}


4.在 SpringBoot启动类中添加 @MapperScan 注解,扫描Mapper文件夹



@SpringBootApplication
@MapperScan(“com.itbaizhan.myspringsecurity.mapper”)
public class MysecurityApplication {
public static void main(String[] args) {
SpringApplication.run(MysecurityApplication.class, args);
}
}


#### 自定义认证逻辑


在实际项目中,认证逻辑是需要自定义控制的。将 UserDetailsService 接口的实现类放入Spring容器即可自定义认证逻辑。UserDetailsService 的实现类必须重写 loadUserByUsername 方法,该方法定义了具体的认证逻辑,参数 username 是前端传来的用户名,我们需要根据传来的用户名查询到该用户(一般是从数据库查询),并将查询到的用户封装成一个UserDetails对象,该对象是Spring Security提供的用户对象,包含用户名、密码、权限。Spring Security会根据UserDetails对象中的密码和客户端提供密码进行比较。相同则认证通过,不相同则认证失败。


5.创建UserDetailsService的实现类,编写自定义认证逻辑



@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UsersMapper usersMapper;

// 自定义认证逻辑
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 1.构造查询条件
QueryWrapper wrapper = new QueryWrapper().eq(“username”, username);
// 2.查询用户
Users users = usersMapper.selectOne(wrapper);
// 3.封装为UserDetails对象
UserDetails userDetails = User
.withUsername(users.getUsername())
.password(users.getPassword())
.authorities(“admin”)
.build();
// 4.返回封装好的UserDetails对象
return userDetails;
}
}


### PasswordEncoder


在实际的项目开发中,我们往数据库的密码不会是明文密码,而是经过我们加密后的密码。当用户传入的明文密码后,SpringSecurity使用密码解析器将明文密码加密成密文密码,然后再将数据库中的密文密码进行比对,匹配成功则通过,反之不通过。


创建SecurityConfig配置类,添加SpringSecurity密码解析器(PasswordEncoder)



// Security配置类
@Configuration
public class SecurityConfig {

//密码编码器
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

}


### 自定义登录页面


SpringSecurity给我们提供了登录界面,但是再实际的项目中,登录页面都是用的自己的,这样更能突出项目特色,所以我们要自定义登录界面。  
 1.编写登录界面  
 2.在Spring Security配置类自定义登录页面



@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
//Spring Security配置
@Override
protected void configure(HttpSecurity http) throws Exception {
// 自定义表单登录
http.formLogin()
.loginPage(“/login.html”) // 自定义登录页面
.usernameParameter(“username”) // 表单中的用户名项
.passwordParameter(“password”) // 表单中的密码项
.loginProcessingUrl(“/login”) // 登录路径,表单向该路径提交,提交后自动执行UserDetailsService的方法
.successForwardUrl(“/main”) //登录成功后跳转的路径
.failureForwardUrl(“/fail”); //登录失败后跳转的路径

// 需要认证的资源
http.authorizeRequests()
   .antMatchers("/login.html").permitAll() //登录页不需要认证
   .anyRequest().authenticated(); //其余所有请求都需要认证


//关闭csrf防护
http.csrf().disable();

}

@Override
public void configure(WebSecurity web) throws Exception {
// 静态资源放行
web.ignoring().antMatchers(“/css/**”);
}
}


### 突破CSRF防护


CSRF:跨站请求伪造,通过伪造用户请求访问受信任的站点从而进行非法请求访问,是一种攻击手段。SpringSecurity默认开启CSRF防护,这就限制了除了GET请求以外的大多数请求。我们可以通过关闭CSRF防护来解决问题,但是这就不够安全了。CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为\_csrf值为令牌,令牌在服务端产生,如果携带的令牌和服务端的令牌匹配成功,则正常访问。



登录

### 会话管理


SpringSecurity提供了会话管理功能,它将用户信息保存再会话中,我们可以通过SecurityContext对象中获取用户信息。



@RestController
public class MyController {
// 获取当前登录用户名
@RequestMapping(“/users/username”)
public String getUsername(){
// 1.获取会话对象
SecurityContext context = SecurityContextHolder.getContext();
// 2.获取认证对象
Authentication authentication = context.getAuthentication();
// 3.获取登录用户信息
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
return userDetails.getUsername();
}
}


### 认证成功后的处理


如果在认证成功后,需要处理一些自定义的逻辑,可以使用登陆成功处理器。  
 1.自定义登录成功处理器



public class MyLoginSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
// 拿到登录用户的信息
UserDetails userDetails = (UserDetails)authentication.getPrincipal();
System.out.println(“用户名:”+userDetails.getUsername());
System.out.println(“一些操作…”);

// 重定向到主页
response.sendRedirect("/main");

}
}


2.配置登录成功处理器



http.formLogin() // 使用表单登录
.loginPage(“/login.html”) // 自定义登录页面
.usernameParameter(“username”) // 表单中的用户名项
.passwordParameter(“password”) // 表单中的密码项
.loginProcessingUrl(“/login”) // 登录路径,表单向该路径提交,提交后自动执行UserDetailsService的方法
// .successForwardUrl(“/main”) //登录成功后跳转的路径
.successHandler(new MyLoginSuccessHandler()) //登录成功处理器
.failureForwardUrl(“/fail”); //登录失败后跳转的路径


### 认证失败后的处理


如果在认证成功后,需要处理一些自定义的逻辑,可以使用登陆失败处理器。  
 1.自定义登录失败处理器



public class MyLoginFailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
System.out.println(“记录失败日志…”);
response.sendRedirect(“/fail”);
}
}


2.配置登录失败处理器



http.formLogin() // 使用表单登录
.loginPage(“/login.html”) // 自定义登录页面
.usernameParameter(“username”) // 表单中的用户名项
.passwordParameter(“password”) // 表单中的密码项
.loginProcessingUrl(“/login”) // 登录路径,表单向该路径提交,提交后自动执行UserDetailsService的方法
// .successForwardUrl(“/main”) //登录成功后跳转的路径
.successHandler(new MyLoginSuccessHandler()) //登录成功处理器
// .failureForwardUrl(“/fail”) //登录失败后跳转的路径
.failureHandler(new MyLoginFailureHandler()); //登录失败处理器

// 需要认证的资源
http.authorizeRequests()
.antMatchers(“/login.html”).permitAll() // 登录页不需要认证
.antMatchers(“/fail”).permitAll() // 失败页不需要认证
.anyRequest().authenticated(); //其余所有请求都需要认证


### 退出登录




### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/d0227a65cca7429199a3faa02ac18ccf.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

t/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-gpm4VrnO-1713404143968)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值