Spring Security简介 Spring Security 是针对 Spring 项目的安全框架也是 Spring Boot 底层安全模块默认的技术选型他可以实现强大的 Web 安全控制对于安全控制我们仅需要引入 spring-boot-starter-security 模块进行少量的配置即可实现强大的安全管理记住几个类WebSecurityConfigurerAdapter自定义 Security 策略AuthenticationManagerBuilder自定义认证策略EnableWebSecurity开启 WebSecurity 模式Spring Security 的两个主要目标是 “认证” 和 “授权”访问控制。“认证”Authentication“授权”Authorization这个概念是通用的而不是只在 Spring Security 中存在。参考官网: https://spring.io/projects/spring-security查看我们自己项目中的版本找到对应的帮助文档: https://docs.spring.io/spring-security/site/docs/5.2.0.RELEASE/reference/htmlsingle补充WebSecurityConfigurerAdapter 在 Spring Security5.7 之后已经废弃新版本不再推荐继承这个类改用注册 Bean 的方式写配置。一般性的权限分类• 功能权限• 菜单权限• 访问权限过去大量使用Interceptor、Fliter 底层代码太多过于繁琐。环境搭建在开始使用 Spring Security 之前需要先完成基础环境的准备工作。一个完整可运行的环境通常包含 JDK、构建工具如 Maven 或 Gradle以及一个支持 Servlet 规范的 Web 容器如 Tomcat。首先确保本机已安装 JDK 8 或更高版本并正确配置JAVA_HOME环境变量。接着通过 Maven 创建一个标准的 Spring Boot 项目并在pom.xml中引入 Spring Security 相关依赖。Spring Boot 的自动配置机制会帮助我们完成大部分默认设置让项目在启动时即可获得基础的安全防护能力。完成依赖引入后启动项目并访问任意接口浏览器会默认跳转到登录页面这说明 Spring Security 已经生效。接下来就可以在此基础上逐步配置用户认证、授权规则以及自定义登录页面等高级功能。用户认证与授权Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() //给kuangshen用户挂上三个角色 /* 例如学校后台 - vip1查看学生数据 - vip2修改学生数据 - vip3删除学生数据 这样写会出错提示要求密码编码在spring5中新增了很多加密方式 */ .withUser(kuangshen).password(123456).roles(vip1, vip2, vip3) .and() .withUser(root).password(123456).roles(vip1, vip2, vip3); }需要修改成Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) //给kuangshen用户挂上三个角色 /* 例如学校后台 - vip1查看学生数据 - vip2修改学生数据 - vip3删除学生数据 这样写会出错提示要求密码编码在spring5中新增了很多加密方式 */ .withUser(kuangshen).password(new BCryptPasswordEncoder().encode(123456)).roles(vip1, vip2, vip3) .and() .withUser(root).password(new BCryptPasswordEncoder().encode(123456)).roles(vip1, vip2, vip3); }// 定义认证规则 Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 在内存中定义也可以在jdbc中去拿.... // Spring security 5.0中新增了多种加密方式也改变了密码的格式。 // 要想我们的项目还能够正常登陆需要修改一下configure中的代码。我们要将前端传过来的密码进行某种方式加密 // spring security 官方推荐的是使用bcrypt加密方式。 auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) .withUser(subei).password(new BCryptPasswordEncoder().encode(123456)).roles(vip2,vip3) .and() .withUser(root).password(new BCryptPasswordEncoder().encode(123456)).roles(vip1,vip2,vip3) .and() .withUser(guest).password(new BCryptPasswordEncoder().encode(123456)).roles(vip1,vip2); }注销以及权限控制用户注销csrf: 一种网络攻击方式利用浏览器自动携带 Cookie 的特性诱导你在别的网站偷偷以你的身份提交 POST 请求。利用浏览器自动携带 Cookie 的特性诱导你在别的网站偷偷以你的身份提交 POST 请求。默认的情况下springsecurity自动开启。可以手动进行关闭可能导致无法登录的情况出现。记住我cookie及首页定制//记住我 本质上是一个cookie 默认保存两周 http.rememberMe().rememberMeParameter(remember);// 开启自动配置的登录功能 // /login 请求来到登录页 // /login?error 重定向到这里表示登录失败 http.formLogin() .usernameParameter(username) .passwordParameter(password) .loginPage(/toLogin) .loginProcessingUrl(/login);如果得到授权的角色登录了会自动跳转到login页面。注意这里的toLogin仅仅是一个接口的路由地址而已浏览器访问http://localhost:8080/toLogin→ 触发 Controller 方法 → returnlogin→ Thymeleaf 去templates/login.html找到页面渲染返回给浏览器。1.formLogin()开启表单登录模式不再使用默认 Basic 弹窗。 不写这个的话Security 默认会启用 Basic 认证2..usernameParameter(username)指定表单中用户名 input 的 name 属性。3..passwordParameter(password)指定密码 input 的 name 属性4..loginPage(/toLogin)自定义登录页面地址GET 请求含义当用户未登录访问受保护资源时Security 自动重定向到GET /toLogin/toLogin需要你自己写 Controller返回你自己写的 login.html 页面⚠️重点这个页面地址/toLogin默认是需要放行否则进入死循环必须在authorizeRequests加上.antMatchers(/toLogin).permitAll()不然访问登录页本身也要求登录无限重定向。5..loginProcessingUrl(/login)登录提交的处理接口POST 请求Spring security整合thymeleaf有权限则显示无权限则不显示