百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

如何基于Spring Security框架实现权限管理

ccwgpt 2025-06-23 15:29 4 浏览 0 评论

Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序。

Spring Security主要是从两个方面解决安全性问题:

  1. web请求级别:使用Servlet规范中的过滤器(Filter)保护Web请求并限制URL级别的访问。
  2. 方法调用级别:使用Spring AOP保护方法调用,确保具有适当权限的用户才能访问安全保护的方法。

基于Maven的Springboot项目中若要集成Spring Security,pom文件中要添加spring security的依赖。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

接下来最主要是配置Spring Security,可以通过XML文件或者配置类的方式来配置,当然推荐使用配置类的方式。

Spring Security的配置类需要实现 WebSecurityConfigurer 或者继承
WebSecurityConfigurerAdapter 类。继承
WebSecurityConfigurerAdapter 类的示例代码如下。

@Configuration
@EnableWebSecurity // 注解开启Spring Security的功能
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
        ... ...
  }
	@Override
	public void configure(WebSecurity web) throws Exception {
		   web.ignoring().antMatchers("/static/**");
	}
	@Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
            .withUser("user").password(new BCryptPasswordEncoder().encode("password")).roles("USER");
      }  
}

@EnableWebSecurity注解的作用就是启用Web安全功能,但并没有任何实际动作。具体的Web安全配置细节,都是通过重载
WebSecurityConfigurerAdapter
类的三个configure()方法来实现。

  • configure(WebSecurity):通过重载该方法,可配置Spring Security的Filter链。
  • configure(HttpSecurity):通过重载该方法,可配置如何通过拦截器保护请求。
  • configure(AuthenticationManagerBuilder):通过重载该方法,可配置基于用户详情(User Details)的权限。

这三个方法主要区别就是参数不同,下面分别举例说明这三种带有不同参数类型的方法。

WebSecurity类

WebSecurity类与HttpSecurity类、
AuthenticationManagerBuilder类都继承自
AbstractConfiguredSecurityBuilder抽象类,
AbstractConfiguredSecurityBuilder又继承自AbstractSecurityBuilder。SpringSecurity在AbstractSecurityBuilder类中实现了创建FilterChain的方法performbuild()。

configure(WebSecurity web) 方法用于配置影响全局的安全性设置,常用于配置静态资源的访问权限。以下设置说明在static目录下的静态资源,不需要权限认证即可访问。

public void configure(WebSecurity web) throws Exception {
		   web.ignoring().antMatchers("/static/**");
	}

HttpSecurity

configure(HttpSecurity)实现了在资源级(URL)来配置网络的安全性,也就是对角色的权限——所能访问的路径做出限制。以下代码展示了该方法定义的示例。

@Override
  protected void configure(HttpSecurity http) throws Exception {
      http
          .authorizeRequests()  //定义哪些url需要保护,哪些url不需要保护
              .antMatchers("/", "/home").permitAll()    //定义不需要认证就可以访问
              .anyRequest().authenticated()
              .and()
          .formLogin()
              .loginPage("/login")  //定义当需要用户登录时候,转到的登录页面
              .permitAll()
              .and()
          .logout()
              .permitAll();
      http.csrf().disable();
  }
  • 通过 authorizeRequests() 定义哪些URL需要被保护,哪些不需要被保护。以上代码指定了 / 和 /home 不需要任何认证就可以访问,其他的路径都必须通过身份验证。
  • 通过 formLogin() 定义当需要用户登录时候,转到的登录页面。

AuthenticationManagerBuilder


AuthenticationManagerBuilder是基于用户信息来配置权限。涉及到权限的用户信息存储方式共有三种:

1、使用基于内存的用户认证:通过 inMemoryAuthentication() 方法,可以启用和配置基于内存的用户权限。

2、基于数据库表的用户认证:用户数据通常会存储在关系型数据库中,并通过JDBC进行访问。使用jdbcAuthentication()方法可以让Spring Security使用以关系型数据库存储的用户权限认证。

3、基于LDAP的用户认证:使用ldapAuthentication()方法,可以让Spring Security使用基于LDAP的认证。

以下代码展示了基于内存的用户认证。

@Autowired
  public void configureGlobal(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
					authManagerBuilder
                .inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("user").password(new BCryptPasswordEncoder().encode("123")).roles("USER").and()
                .withUser("admin").password(new BCryptPasswordEncoder().encode("456")).roles("USER","ADMIN");
  }

调用 withUser() 方法可以在内存中添加新的用户。withUser() 方法返回的是
UserDetailsManagerConfigurer.UserDetailsBuilder
,这个对象提供了多个进一步配置用户权限信息的方法,包括设置用户密码的password()方法以及为给定用户授予一个或多个角色权限的roles()方法。

roles()方法会在给定的角色值上添加一个ROLE_前缀,并将其作为权限授予给用户。因此上述代码中用户user具有的权限为:ROLE_USER,用户admin具有的权限为ROLE_USERROLE_ADMIN

借助 passwordEncoder() 方法来指定一个密码转码器(encoder),可以对用户密码进行加密存储。

以上就是Spring Security的基本用法。

总结

Spring Security框架实际上非常复杂,这里只是就Spring Security的简单使用做一个分享,后续文章会进一步介绍Spring Security框架。

相关推荐

如何基于Spring Security框架实现权限管理

SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序。SpringSecurity主要是从两个方面解决安全性问题:web请求级别:使...

一个轻量级 Java 权限认证框架,Sa-Token 让鉴权变得简单、优雅!

一、框架介绍Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权等一系列权限相关问题。官网文档:...

16.3K Star!简洁高效的Java权限认证与会话管理框架——Sa-Token

简介今天给大家推荐一个轻量级的Java权限认证框架——Sa-Token。它可以为JavaWeb应用同完整的权限认证解决方案,它的目标是简化权限管理和登录认证的流程,具备高度灵活性和简单易用的特点。S...

从Shiro迁移到Sa-Token:老版JeecgBoot项目权限框架平滑升级方案

背景介绍对于许多维护老版JeecgBoot项目的开发者来说,权限框架的升级一直是个棘手问题。这篇文章分享一种实用的方案,用于将老版JeecgBoot中的ApacheShiro替换为更现代的Sa-To...

刑法框架体系,对照着框架体系学习可以事半功倍哦

有了它,妈妈再也不用担心我司考过不啦!有了它,妈妈再也不用担心我司考过不了啦!其他部门法正在陆续整理制作中哦看不清的话请戳http://mp.weixin.qq.com/s?__biz=MzA3NDE...

全新体验版Windows QQ上线,实现三端统一

7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。记者从腾讯获悉,继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构...

农村自建房造价多少?包工头教你怎么算

通常我们在找专业人士设计农村自建房设计图时,不管你是打算建独栋一层别墅还是独栋二层别墅或是独栋三层别墅,你是否也找他们打听过相应的房屋工程造价呢?下面简单介绍一下农村自建房的傻瓜式造价估算:1、砖混结...

QQ大会员品牌运营策划与设计(qq大会员有哪些个性装扮)

编辑导语:在互联网产品越来越同质化的今天,做出有差异性和符合品牌调性的设计是品牌运营过程中需要重视的问题。本文作者从QQ大会员品牌项目实践出发,分享了品牌运营设计过程中遇到的一些问题以及具体操作方案,...

支持鸿蒙平台,腾讯视频ovCompose跨平台框架发布

IT之家6月3日消息,腾讯开源今日官宣发布腾讯视频ovCompose跨平台框架,其是腾讯大前端领域Oteam中,腾讯视频团队基于ComposeMultiplatform生态推出的...

腾讯 QQ Mac 版推倒重做,全新 1.0 版本开启内测

IT之家9月1日消息,据多位IT之家小伙伴投稿,腾讯QQMac版近日迎来了全新通用版内测,版本号重新由1.0开始,目前放出的体验版为1.0.4-305。从下图可以看到,该版本在U...

全新体验版Windows QQ正式上线官网,实现三端统一

7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。记者从腾讯获悉,继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构...

QQ,到了不能不变的境地(怎么发qq邮件到别人邮箱)

相比微信一个小更新,乃至一个小动作,都能上热搜的顶级热度。隔壁的老大哥QQ,显得有些冷清。即使更新再快,功能再激情,都很难引起用户们的集体讨论。机友们细想一番,咱们的老朋友QQ,有多久没上过热搜啦?真...

基于Electron框架全面重做:全新Linux版QQ开启公测

来源:快科技不久前,腾讯QQ项目组曾发布预告,宣布QQforLinux新版本即将开启公测。现在,新的Linux版QQ已经开启公测,不过目前仅支持x86架构,arm64架构还仍在适配中。与此前极为简...

QQ全面升级?基于Electron技术的Windows内测版本预计将于明年推出

在2022年,作为经典的聊天软件的QQ在经历多次的功能调整后,正式选择基于新技术开发新版本的QQ。今日,据相关媒体报道,腾讯QQ项目组发布预告:QQforLinux将在本周迎来公测,全新的QQf...

跨平台三端重构正式统一,QQ Windows全新体验版上架官网

7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构,实现了桌面端Q...

取消回复欢迎 发表评论: