SpringBoot学习(二)—— springboot快速整合spring security组件
Spring Security
简介
spring security的核心功能为认证(Authentication),授权(Authorization),即认证用户是否能访问该系统,和授权用户可以在系统中进行哪些操作。
引入spring security组件
在 pom.xml 中加入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency>
验证组件是否起到作用,现在不更改框架内的任何内容,启动项目,浏览器中依旧输入 http://localhost:8080 ,可看到如下界面,之前可以直接进入spring boot的初始界面,现在已经看不见了,spring security 导入后默认已经开启了验证,必须先登录验证通过后才能访问。
如果代码中不做任何设置,默认的账户是 user,默认的密码随着项目的启动,会打印在控制台中。
输入账号密码,即可进入默认的初始界面。
代码实战
为了最快最简单最直接的认识这个组件,直接把用户密码写入内存中,项目启动即存在,避免还有建表,实体类,数据库操作等与之无关的内容。命名使用最为简单粗暴的方式,排除一切干扰,用最少的精力掌握该组件的使用。
新增代码目录
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> SPRING BOOT !!! </body> </html>
error.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 错误 </body> </html>
UserController
package com.example.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("user") public class UserController { @RequestMapping("/addUser") @ResponseBody String addUser() { return "这是添加用户!!!"; } @RequestMapping("/deleteUser") @ResponseBody String deleteUser() { return "这是删除用户!!!"; } @RequestMapping("/updateUser") @ResponseBody String updateUser() { return "这是修改用户!!!"; } @RequestMapping("/findAllUsers") @ResponseBody String findAllUsers() { return "这是查询用户!!!"; } }
UserSecurityConfig
package com.example.config; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; //注解开启 Spring Security 安全认证与授权 @EnableWebSecurity public class UserSecurityConfig extends WebSecurityConfigurerAdapter { //用户认证 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //内存里面放着 auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()) //添加用户,密码,角色 .withUser("zs").password("123456").roles("AAA") //链式编程 .and() .withUser("ls").password("123456").roles("BBB") .and() .withUser("ww").password("123456").roles("CCC", "primary") .and() .withUser("zl").password("123456").roles("primary"); } //用户授权 @Override protected void configure(HttpSecurity http) throws Exception { /** * permitAll():允许一切用户访问 * hasRole():url请求允许访问的角色 * hasAnyRole() : url请求允许访问的多个角色 * access():允许访问的角色,permitAll、hasRole、hasAnyRole 底层都是调用 access 方法 * access("permitAll") 等价于 permitAll() */ http.authorizeRequests().antMatchers("/").permitAll(); // "/":应用首页所以用户都可以访问 http.authorizeRequests() .antMatchers("/user/addUser").hasRole("AAA") // 首斜杠"/"表示应用上下文,/user/addUser 请求允许 AAA 角色访问 .antMatchers("/user/deleteUser/**").hasAnyRole("AAA", "BBB") //"/user/deleteUser/**"允许 "AAA", "BBB" 角色访问,/**匹配任意 .antMatchers("/user/updateUser").hasAnyRole("AAA", "BBB", "CCC")//除了这种链式编程,也可以分开写 .antMatchers("/user/findAllUsers").access("permitAll"); http.authorizeRequests().anyRequest().authenticated(); /** * formLogin:指定支持基于表单的身份验证 * 当用户没有登录、没有权限时就会自动跳转到登录页面(默认 /login) * 当登录失败时,默认跳转到 /error * 登录成功时会放行 */ http.formLogin(); } }
MyPasswordEncoder
package com.example.config; import org.springframework.security.crypto.password.PasswordEncoder; //密码编码,Spring Security 高版本必须进行密码编码,否则报错 public class MyPasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence charSequence) { return charSequence.toString(); } @Override public boolean matches(CharSequence charSequence, String s) { return s.equals(charSequence.toString()); } }
亲测效果是
以用户名 zs 登录(其角色权限为AAA),可以进入系统,浏览器输入地址可以访问, localhost:8080,localhost:8080/user/addUser,localhost:8080/user/deleteUser,localhost:8080/user/updateUser,localhost:8080/user/findAllUsers
以用户名 ls 登录(其角色权限为BBB),可以进入系统,浏览器输入地址可以访问, localhost:8080,localhost:8080/user/deleteUser,localhost:8080/user/updateUser,localhost:8080/user/findAllUsers
以用户名 ww 登录(其角色权限为CCC),可以进入系统,浏览器输入地址可以访问, localhost:8080,localhost:8080/user/deleteUser,localhost:8080/user/updateUser,localhost:8080/user/findAllUsers
以用户名 zl 登录(其角色权限为CCC),可以进入系统,浏览器输入地址可以访问, localhost:8080,localhost:8080/user/updateUser,localhost:8080/user/findAllUsers
以用户名 admin 登录,不可以进入系统,因为系统中还没有该用户。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)