spring boot 权限管理的几种方式

简介: Spring Boot 提供多种权限管理方式,包括基于角色的访问控制(RBAC)、基于属性的访问控制(ABAC)和基于访问控制列表(ACL)。RBAC 通过角色简化权限管理;ABAC 根据用户、资源和环境属性实现细粒度控制;ACL 则为每个资源定义访问控制列表。文中以 Spring Security 为例,详细展示了每种方法的配置与实现步骤,帮助开发者根据项目需求选择合适的权限管理方案。示例涵盖依赖添加、类配置及注解使用等关键环节。

Spring Boot 提供了多种权限管理方式,以下是几种常见的方法,以及相应的示例:

  1. 基于角色的访问控制(Role-Based Access Control,RBAC)

在基于角色的访问控制中,权限分配给角色,然后将角色分配给用户。这种方法简化了权限管理,因为您只需要管理角色和用户之间的关系。

示例:使用 Spring Security 实现 RBAC

1.1. 添加 Spring Security 依赖项到 pom.xml

xml

体验AI代码助手

代码解读

复制代码

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

1.2. 创建一个 SecurityConfig 类,继承 WebSecurityConfigurerAdapter,并配置角色和权限:

java

体验AI代码助手

代码解读

复制代码

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
            .antMatchers("/").permitAll()
            .and().formLogin();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN")
            .and()
            .withUser("user").password(passwordEncoder().encode("user123")).roles("USER");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  1. 基于属性的访问控制(Attribute-Based Access Control,ABAC)

在基于属性的访问控制中,权限是基于用户、资源和环境属性的。这种方法提供了更细粒度的权限控制,但可能更难管理。

示例:使用 Spring Security 的 @PreAuthorize 实现 ABAC

2.1. 在 SecurityConfig 类中启用方法安全性:

java

体验AI代码助手

代码解读

复制代码

@EnableGlobalMethodSecurity(prePostEnabled = true)

2.2. 在需要保护的方法上添加 @PreAuthorize 注解:

java

体验AI代码助手

代码解读

复制代码

@RestController
@RequestMapping("/api")
public class ApiController {

    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public String admin() {
        return "Admin area";
    }

    @PreAuthorize("hasRole('USER')")
    @GetMapping("/user")
    public String user() {
        return "User area";
    }
}
  1. 基于访问控制列表(Access Control List,ACL)

在基于访问控制列表的权限管理中,为每个资源定义一个访问控制列表,指定哪些用户或角色可以访问该资源。这种方法适用于需要对每个资源进行细粒度控制的场景。

示例:使用 Spring Security 的 ACL 模块实现 ACL

3.1. 添加 Spring Security ACL 依赖项到 pom.xml

xml

体验AI代码助手

代码解读

复制代码

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-acl</artifactId>
    <version>5.6.1</version>
</dependency>

3.2. 配置 ACL 数据源、服务和权限评估器:

java

体验AI代码助手

代码解读

复制代码

@Configuration
public class AclConfig {

    @Autowired
    private DataSource dataSource;

    @Bean
    public JdbcMutableAclService aclService() {
        return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());
    }

    @Bean
    public AclAuthorizationStrategy aclAuthorizationStrategy() {
        return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN"));
    }

    @Bean
    public PermissionGrantingStrategy permissionGrantingStrategy() {
        return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger());
    }

    @Bean
    public EhCacheBasedAclCache aclCache() {
        return new EhCacheBasedAclCache(ehCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy());
    }

    @Bean
    public EhCacheFactoryBean ehCacheFactoryBean() {
        EhCacheFactoryBean factoryBean = new EhCacheFactoryBean();
        factoryBean.setCacheManager(cacheManager().getObject());
        factoryBean.setCacheName("aclCache");
        return factoryBean;
    }

    @Bean
    public EhCacheManagerFactoryBean cacheManager() {
        return new EhCacheManagerFactoryBean();
    }

    @Bean
    public LookupStrategy lookupStrategy() {
        return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), new ConsoleAuditLogger());
    }

    @Bean
    public AclPermissionEvaluator permissionEvaluator() {
        return new AclPermissionEvaluator(aclService());
    }
}

3.3. 在需要保护的方法上添加 @PreAuthorize 注解,使用 hasPermission 表达式:

java

体验AI代码助手

代码解读

复制代码

@PreAuthorize("hasPermission(#resourceId, 'com.example.Resource', 'read')")
@GetMapping("/resource/{resourceId}")
public String getResource(@PathVariable Long resourceId) {
    return "Resource " + resourceId;
}

这些示例仅用于演示 Spring Boot 中权限管理的几种方式。实际应用中,您可能需要根据项目需求进行更详细的配置和实现。


转载来源:https://juejin.cn/post/7238423148555272253

相关文章
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
缓存 安全 Java
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
【权限管理系统】Spring security(三)---认证过程(原理解析,demo)
|
前端开发 Java 关系型数据库
使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC
使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC
|
安全 Java 数据库
Spring Security 权限管理详解与案例
Spring Security 是 Spring 框架中用于提供认证和访问控制的模块。它保护了成千上万的应用程序,使其免受未经授权的访问。本文将详细介绍 Spring Security 的权限管理功能,并通过一个实际案例来展示其用法。
1190 1
|
安全 前端开发 Java
Spring Boot实践:Web、数据访问与权限管理的深度整合
1. 整合Web开发:让Spring Boot驰骋在Web领域 Spring Boot对Web开发提供了极大的便利。默认集成的Tomcat使得Spring Boot能够轻松地开箱即用,而强大的Spring MVC框架更为我们处理HTTP请求提供了简洁而完备的工具。
211 0
|
SQL 监控 前端开发
毕业设计So Easy:基于Spring Boot+Spring Cloud+Alibaba企业员工职能权限管理平台
很多计算机专业大学生经常和我交流:毕业设计没思路、不会做、论文不会写、太难了...... 针对这些问题,决定分享一些软、硬件项目的设计思路和实施方法,希望可以帮助大家,也祝愿各位学子,顺利毕业!
|
存储 安全 前端开发
谷粒学院——Day18【权限管理Spring Security、配置中心Nacos、代码托管git】
谷粒学院——Day18【权限管理Spring Security、配置中心Nacos、代码托管git】
480 0
谷粒学院——Day18【权限管理Spring Security、配置中心Nacos、代码托管git】
|
数据库 数据安全/隐私保护
8、SpringBoot2.0整合Shiro实现登录认证和权限管理(八)
添加相关的依赖,spring-boot-starter-data-jpa在 IEDA中创建SpringBoot2.0项目-超详细(一)博客中已经添加
198 0
8、SpringBoot2.0整合Shiro实现登录认证和权限管理(八)
|
缓存 安全 Java
springboot简单集成shiro权限管理
springboot简单集成shiro权限管理
256 0
springboot简单集成shiro权限管理
|
SQL 供应链 前端开发
基于Springboot+MybatisPlus+Layui的商品库存权限管理系统
基于Springboot+MybatisPlus+Layui的商品库存权限管理系统
386 0
基于Springboot+MybatisPlus+Layui的商品库存权限管理系统