前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot权限管理实战:从入门到精通

SpringBoot权限管理实战:从入门到精通

作者头像
编程小白狼
发布于 2025-04-20 12:00:40
发布于 2025-04-20 12:00:40
22600
代码可运行
举报
文章被收录于专栏:编程小白狼编程小白狼
运行总次数:0
代码可运行

引言

在现代Web应用开发中,权限管理是不可或缺的核心功能。SpringBoot作为Java领域最流行的框架之一,提供了强大的安全支持。本文将带你全面了解如何在SpringBoot应用中实现完善的权限管理系统。

一、权限管理基础概念

1.1 认证(Authentication) vs 授权(Authorization)

  • 认证:验证用户身份(如用户名密码登录)
  • 授权:验证用户是否有权限访问特定资源

1.2 常见的权限控制模型

  1. RBAC (基于角色的访问控制)
  • 用户 -> 角色 -> 权限
  1. ABAC (基于属性的访问控制)
  • 更细粒度的控制,基于用户/资源属性
  1. ACL (访问控制列表)
  • 直接定义用户对资源的操作权限

二、Spring Security 核心组件

2.1 主要组件

  • SecurityContextHolder:存储安全上下文
  • Authentication:包含用户凭证和权限信息
  • UserDetails:用户核心信息接口
  • UserDetailsService:加载用户特定数据
  • PasswordEncoder:密码加密接口

2.2 过滤器链 Spring Security基于过滤器链实现安全控制,主要过滤器包括:

  • UsernamePasswordAuthenticationFilter:处理表单登录
  • BasicAuthenticationFilter:处理HTTP Basic认证
  • FilterSecurityInterceptor:进行权限验证

三、实战:基于RBAC的权限系统实现

3.1 项目初始化

java @SpringBootApplication public class AuthApplication { public static void main(String args) { SpringApplication.run(AuthApplication.class, args); } }

3.2 数据库设计

sql CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, enabled BOOLEAN DEFAULT TRUE );

CREATE TABLE sys_role ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) UNIQUE NOT NULL );

CREATE TABLE sys_user_role ( user_id BIGINT NOT NULL, role_id BIGINT NOT NULL, PRIMARY KEY (user_id, role_id) );

CREATE TABLE sys_permission ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, url VARCHAR(255) NOT NULL, method VARCHAR(10) NOT NULL );

CREATE TABLE sys_role_permission ( role_id BIGINT NOT NULL, permission_id BIGINT NOT NULL, PRIMARY KEY (role_id, permission_id) );

3.3 核心代码实现

自定义UserDetailsService

java @Service public class CustomUserDetailsService implements UserDetailsService {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    SysUser user = userRepository.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("用户不存在"));
    
    return new org.springframework.security.core.userdetails.User(
            user.getUsername(),
            user.getPassword(),
            getAuthorities(user.getId())
    );
}

private Collection<? extends GrantedAuthority> getAuthorities(Long userId) {
    // 查询用户角色和权限
    List<SysRole> roles = roleRepository.findByUserId(userId);
    List<SysPermission> permissions = permissionRepository.findByUserId(userId);
    
    Set<GrantedAuthority> authorities = new HashSet<>();
    
    // 添加角色
    roles.forEach(role -> 
        authorities.add(new SimpleGrantedAuthority("ROLE_" + role.getName())));
    
    // 添加权限
    permissions.forEach(permission -> 
        authorities.add(new SimpleGrantedAuthority(permission.getName())));
    
    return authorities;
}

}

安全配置类

java @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private CustomUserDetailsService userDetailsService;

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
        .passwordEncoder(passwordEncoder());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/api/public/").permitAll()
            .antMatchers("/api/admin/").hasRole("ADMIN")
            .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
        .and()
        .logout()
            .permitAll()
        .and()
        .csrf().disable();
}

}

权限注解使用

java @RestController @RequestMapping("/api/users") public class UserController {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PreAuthorize("hasRole('ADMIN') or hasAuthority('USER_MANAGE')")
@GetMapping
public List<User> getAllUsers() {
    // 获取所有用户
}

@PreAuthorize("id == authentication.principal.id or hasRole('ADMIN')")
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
    // 获取特定用户
}

}

四、进阶功能实现

4.1 动态权限控制

java @Service public class DynamicPermissionService implements FilterInvocationSecurityMetadataSource {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private PermissionRepository permissionRepository;

@Override
public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
    String url = ((FilterInvocation) object).getRequestUrl();
    String method = ((FilterInvocation) object).getHttpRequest().getMethod();
    
    // 查询数据库获取该URL+Method需要的权限
    List<SysPermission> permissions = permissionRepository.findByUrlAndMethod(url, method);
    
    if (permissions.isEmpty()) {
        return SecurityConfig.createList("permitAll");
    }
    
    String attributes = permissions.stream()
            .map(SysPermission::getName)
            .toArray(String::new);
    
    return SecurityConfig.createList(attributes);
}

// 其他必要方法实现...

}

4.2 JWT集成

java @Component public class JwtTokenFilter extends OncePerRequestFilter {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private JwtTokenUtil jwtTokenUtil;

@Autowired
private CustomUserDetailsService userDetailsService;

@Override
protected void doFilterInternal(HttpServletRequest request, 
                                HttpServletResponse response, 
                                FilterChain chain) throws ServletException, IOException {
    
    String token = jwtTokenUtil.getTokenFromRequest(request);
    
    if (token != null && jwtTokenUtil.validateToken(token)) {
        String username = jwtTokenUtil.getUsernameFromToken(token);
        
        UserDetails userDetails = userDetailsService.loadUserByUsername(username);
        UsernamePasswordAuthenticationToken authentication = 
            new UsernamePasswordAuthenticationToken(
                userDetails, null, userDetails.getAuthorities());
        
        authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }
    
    chain.doFilter(request, response);
}

}

4.3 权限缓存优化

java @Configuration @EnableCaching public class CacheConfig {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public CacheManager cacheManager() {
    return new ConcurrentMapCacheManager("userDetails", "permissions");
}

}

@Service public class CachedUserDetailsService implements UserDetailsService {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
private CustomUserDetailsService delegate;

@Cacheable(value = "userDetails", key = "username")
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    return delegate.loadUserByUsername(username);
}

}

五、最佳实践与常见问题

5.1 最佳实践

  1. 最小权限原则:只授予必要的权限
  2. 前后端分离:使用JWT等无状态认证
  3. 日志审计:记录关键权限操作
  4. 定期审查:定期检查权限分配合理性

5.2 常见问题解决方案

  1. CSRF防护:前后端分离项目可禁用,传统项目需启用
  2. 权限缓存:用户权限变更后及时清除缓存
  3. 性能优化:使用缓存减少数据库查询
  4. 细粒度控制:结合方法注解和URL权限

六、总结

本文详细介绍了SpringBoot中实现权限管理的完整方案,从基础的RBAC模型到动态权限控制,再到JWT集成等高级功能。Spring Security提供了强大而灵活的权限管理能力,合理运用可以构建出既安全又高效的权限系统。

在实际项目中,应根据业务需求选择合适的权限模型,并注意性能优化和安全防护

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot集成SpringSecurity - 权限控制(五)
源码地址:https://github.com/springsecuritydemo/microservice-auth-center05
用户1212940
2022/04/13
3830
SpringBoot集成SpringSecurity - 权限控制(五)
Spring Boot Security 整合 JWT 实现 无状态的分布式API接口
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。JSON Web Token 入门教程 - 阮一峰,这篇文章可以帮你了解JWT的概念。本文重点讲解Spring Boot 结合 jwt ,来实现前后端分离中,接口的安全调用。
程序员果果
2019/05/16
9410
SpringBoot Security 详解
Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。
jwangkun
2021/12/23
5360
SpringBoot Security 详解
SpringBoot集成Spring Security(1)——入门程序
因为项目需要,第一次接触 Spring Security,早就听闻 Spring Security 功能强大但上手困难,学习了几天出入门道,特整理这篇文章希望能让后来者少踩一点坑(本文附带实例程序,请放心食用)
全栈程序员站长
2022/09/09
8500
SpringBoot集成Spring Security(1)——入门程序
SpringBoot集成SpringSecurity - 入门(一)
源码地址:https://github.com/springsecuritydemo/microservice-auth-center01
用户1212940
2022/04/13
1.1K0
SpringBoot集成SpringSecurity - 入门(一)
SpringSecurity + JWT,从入门到精通!
RBAC 全称为基于角色的权限控制,本段将会从什么是 RBAC,模型分类,什么是权限,用户组的使用,实例分析等几个方面阐述 RBAC,绘制思维导图如下:
后端码匠
2020/07/14
5.6K3
Java实现角色及菜单权限管理的全面解析与实战
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/09/18
4110
Java实现角色及菜单权限管理的全面解析与实战
Spring Boot Security 详解
Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。
程序员果果
2019/05/16
6810
SpringSecurity 授权
例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。但是如果是一个图书馆管理员的账号登录了,应该就能看到并使用添加书籍信息,删除书籍信息等功能。
用户9615083
2022/12/30
1.5K0
SpringSecurity 授权
Spring Security的认证和授权
Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架。Spring Security提供了完整的安全性解决方案,它能够在Web请求级别和方法调用级别处理身份认证和授权。因为基于Spring框架,所以Spring Security充分利用了依赖注入(dependency injection,DI)和面向切面(AOP)的技术。
兜兜转转
2023/03/29
2.4K0
Spring Security的认证和授权
SpringBoot-Security 具体案例、 实现安全框架、权限控制、aop切入
​ 安全是一个不断变化的目标,追求一个全面的、系统范围的方法很重要。在安全领域,我们鼓励您采用“安全层”,这样每个层都可以尽可能地保证自身的安全性,并且连续的层提供额外的安全性。每一层的安全性越“严格”,您的应用程序就越健壮和安全。在底层,为了减少中间人攻击,你需要处理诸如传输安全和系统辨识等问题。接下来,您将通常使用防火墙,也许是通过 vpn 或 IP 安全性来确保只有经过授权的系统才能尝试连接。在公司环境中,您可以部署 DMZ 来将面向公共的服务器与后端数据库和应用程序服务器分开。您的操作系统也将发挥关键作用,解决诸如作为非特权用户运行进程和最大化文件系统安全性等问题。操作系统通常也会配置自己的防火墙。希望在某个地方,你可以尝试阻止针对系统的分布式拒绝服务攻击攻击和暴力破解。入侵预防系统安全协议对于监控和响应攻击也特别有用,这样的系统能够采取保护措施,比如实时阻止违规的 TCP/IP 地址。转移到较高的层,您的 Java 虚拟机有望被配置为最小化授予不同 Java 类型的权限,然后您的应用程序将添加自己的问题域特定的安全配置。Spring Security 使后一个领域——应用程序安全性——更加容易。
宁在春
2022/10/31
1.1K0
SpringBoot-Security 具体案例、 实现安全框架、权限控制、aop切入
SpringSecurity-从入门到精通
​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
鱼找水需要时间
2023/02/16
1.1K0
SpringSecurity-从入门到精通
4万字!Spring Security 从入门到精通!
Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
一行Java
2023/02/23
6930
4万字!Spring Security 从入门到精通!
SpringBoot+SpringSecurity+JWT实RESTfulAPI权限控制
根据文章内容总结的摘要
林老师带你学编程
2018/01/04
4.2K0
SpringBoot+SpringSecurity+JWT实RESTfulAPI权限控制
【Spring Security】003-Spring Security web权限方案(1):用户认证
在resources目录下创建static目录,并创建login.html,name必须是username和password;
訾博ZiBo
2025/01/06
1210
【Spring Security】003-Spring Security web权限方案(1):用户认证
springboot整合安全框架综合案例
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。
张哥编程
2024/12/13
1240
springboot整合安全框架综合案例
springboot第22集:security,Lombok,token,redis
Spring Security是一个基于Spring框架的权限管理框架,用于帮助应用程序实现身份验证和授权功能。它可以为Web应用程序、REST API和方法级安全性提供支持,并支持各种认证方式。
达达前端
2023/10/08
5530
springboot第22集:security,Lombok,token,redis
springboot综合案例第三课
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。
张哥编程
2024/12/13
880
公司新来了一个同事,把权限系统设计的炉火纯青!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
2680
公司新来了一个同事,把权限系统设计的炉火纯青!
SpringSecurity入门
Spring Security是一套权限框架,此框架可以帮助我们为项目建立丰富的角色与权限管理。
半月无霜
2023/03/25
1.5K0
SpringSecurity入门
相关推荐
SpringBoot集成SpringSecurity - 权限控制(五)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验