security
认证流程
导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.6.8</version> </dependency>
导入spring-boot-starter-security启动器后,Spring Security已经生效,默认拦截全部请求,如果用户没有登录,跳转到内置登录页面。
WebSecurityConfigurerAdapter
需要自定义一个类用于继承WebSecurityConfigurerAdapter,并且开启@EnableWebSecurity支持
//@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/login.html").hasRole("vip1"); //没有权限就跳回登陆页面 http.formLogin(); //走自己的登陆页面 //http.formLogin().loginPage(""); //开启注销功能 http.logout().logoutSuccessUrl("/main.html"); //开启记住我功能 http.rememberMe().rememberMeParameter("remember"); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //auth.jdbcAuthentication().连接数据库的方式 auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) .withUser("hp") .password(new BCryptPasswordEncoder().encode("111111")) .roles("vip1"); } }
WebSecurityConfigurerAdapter
提供了一种便利的方式去创建 WebSecurityConfigurer的实例,只需要重写 WebSecurityConfigurerAdapter 的方法,即可配置拦截什么URL、设置什么权限等安全控制。
configure(HttpSecurity http)
匹配的权限是从上到下的,如果前面匹配了被放行,下面匹配的就无效了,使用匹配顺序很重要
该方法定义了哪些URL路径应该被拦截,以及访问资源需要的权限,以及一些功能如记住我,自定义的页面
configure(AuthenticationManagerBuilder auth)
该方法提供访问内存或者数据库等方式去给用户授予角色
解除跨站请求限制
PasswordEncoder
为了保证密码的安全性,应该在自定义用于实现WebSecurityConfigurerAdapter中定义密码编码方式
@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } }
UserDetailsService接口详解
自定义逻辑时,只需要实现UserDetailsService接口即可
UserDetailsService只负责从特定的地方(通常是数据库)加载用户信息,UserDetailsService常见的实现类有JdbcDaoImpl,InMemoryUserDetailsManager
public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }
loadUserByusername(Sting username)方法
UserDetails接口
这个接口是我们自己用来定义用户表的结构的
SpringSecurity自己的用户信息只包含了Username,password,roles,假如我希望用户的实体类中还有性别sex字段,那么就没有办法了,所以SpringSecurity提供了UserDetails接口,我们可以自己新建一个包含sex字段的类,然后该类implements UserDetails接口,就可以获取我们说的这个sex字段
UserDetails实例是通过UserDetailsService接口的loadUserByUsername方法返回的,可以参考这篇文章创建自己的UserDetails(本文中包含sex的那个类)
UserDetails接口中有一个getAuthorities方法,这个方法返回的是权限,但是我们返回的权限必须带有“ROLE_”开头才可以,spring会自己截取ROLE_后边的字符串,也就是说,比如:我的权限叫ADMIN,那么,我返回告诉spring security的时候,必须告诉他权限是ROLE_ADMIN,这样spring security才会认为权限是ADMIN
会话管理
通过SecurityContextHolder获取用户信息
方法授权
如果选择基于方法的授权,可以不用像什么那样单独对路径进行拦截
@Secured
需要在@Configuration实例上添加@EnableGlobalMethodSecurity(securedEnable=true)注解
@PreAuthorize,@PostAuthorize
需要在@Configuration实例上添加@EnableGlobalMethodSecurity(prePostEnable=true)注解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现