Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法

下面是Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法的完整攻略:

步骤一:初始化Spring Security

使用Spring Security提供的依赖,在pom.xml文件中配置以下依赖项:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

完成后,需要在Spring应用程序的配置文件中启用Spring Security:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests()
             .antMatchers("/admin/**").hasRole("ADMIN")
             .antMatchers("/user/**").hasRole("USER")
             .and()
             .formLogin();
     }

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

     @Override
     public void configure(AuthenticationManagerBuilder auth) throws Exception {
         auth.inMemoryAuthentication()
             .withUser("admin").password("{noop}admin").roles("ADMIN")
             .and()
             .withUser("user").password("{noop}user").roles("USER");
     }
}

步骤二:配置基于RBAC的权限表达式

在Spring Security中使基于RBAC的权限表达式成为真正动态的,可以使用Spring EL,这样就可以对当前用户的角色进行动态处理。

首先,需要定义一个角色和对应的权限,可以将这些数据存储到数据库中:

CREATE TABLE Role (
  id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name TEXT NOT NULL,
  description TEXT DEFAULT NULL
);

CREATE TABLE Permission (
  id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name TEXT NOT NULL,
  description TEXT DEFAULT NULL
);

CREATE TABLE Role_Permission (
  role_id INTEGER NOT NULL,
  permission_id INTEGER NOT NULL,
  PRIMARY KEY (role_id, permission_id),
  CONSTRAINT ROLE_PERM_ROLE_FK FOREIGN KEY (role_id)
    REFERENCES Role (id),
  CONSTRAINT ROLE_PERM_PERM_FK FOREIGN KEY (permission_id)
    REFERENCES Permission (id)
);

INSERT INTO Role (name, description) VALUES ('admin', '管理者');
INSERT INTO Role (name, description) VALUES ('user', '普通用户');

INSERT INTO Permission (name, description) VALUES ('create', '创建');
INSERT INTO Permission (name, description) VALUES ('read', '读取');
INSERT INTO Permission (name, description) VALUES ('update', '更新');
INSERT INTO Permission (name, description) VALUES ('delete', '删除');

INSERT INTO Role_Permission (role_id, permission_id) VALUES (1, 1);
INSERT INTO Role_Permission (role_id, permission_id) VALUES (1, 2);
INSERT INTO Role_Permission (role_id, permission_id) VALUES (1, 3);
INSERT INTO Role_Permission (role_id, permission_id) VALUES (1, 4);
INSERT INTO Role_Permission (role_id, permission_id) VALUES (2, 2);

接下来,需要在Spring Security的配置文件中添加以下代码来读取数据库中的角色和权限信息:

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AppConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private DataSource dataSource;

    @Bean
    public RoleHierarchyImpl roleHierarchy() {
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_admin > ROLE_user");
        return roleHierarchy;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/*").access("hasRole('admin') or hasRole('user')")
            .antMatchers("/admin/**").access("hasRole('admin')").and().formLogin();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        JdbcUserDetailsManager userDetailsService = new JdbcUserDetailsManager();
        userDetailsService.setDataSource(dataSource);
        userDetailsService.setSqlUsersByUsernameQuery(
                "select username,password,enabled from users where username=?");
        userDetailsService.setSqlRolesByUsernameQuery(
                "select u.username, r.name from users u, user_roles ur, role r where u.id = ur.user_id and ur.role_id = r.id and u.username=?");
        auth.userDetailsService(userDetailsService);
    }
}

步骤三:添加角色和权限

在定义了角色和权限之后,需要为用户分配角色和权限:

ALTER TABLE users
ADD COLUMN enabled BOOLEAN DEFAULT TRUE NOT NULL;

CREATE TABLE user_roles (
  user_id INTEGER NOT NULL,
  role_id INTEGER NOT NULL,
  PRIMARY KEY (user_id, role_id),
  CONSTRAINT users_roles_users_FK FOREIGN KEY (user_id)
    REFERENCES users (id),
  CONSTRAINT users_roles_roles_FK FOREIGN KEY (role_id)
    REFERENCES Role (id)
);

INSERT INTO users VALUES (DEFAULT, 'admin', 'admin@example.com', 'password', TRUE);
INSERT INTO users VALUES (DEFAULT, 'user', 'user@example.com', 'password', TRUE);

INSERT INTO user_roles VALUES (1, 1);
INSERT INTO user_roles VALUES (2, 2);

示例一:使用Spring EL动态控制页面访问权限

首先,创建一个基本的Spring MVC控制器:

@Controller
public class HomeController {

    @GetMapping("/")
    @PreAuthorize("hasRole('USER')")
    public String index(Model model) {
        return "index";
    }

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

在访问/index时,只有拥有USER角色的用户可以查看,而在访问/admin时,只有拥有ADMIN角色的用户才能查看。

示例二:使用代码动态控制页面访问权限

在使用代码动态控制页面访问权限时,可以在Spring Security的配置文件中添加以下代码:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/user/**").access("hasRole('USER') or hasRole('ADMIN')")
            .antMatchers("/admin/**").access("hasRole('ADMIN')")
        .and()
            .formLogin();
    }
}

在访问/user/时,只有拥有USER或者ADMIN角色的用户可以查看,而在访问/admin/时,只有拥有ADMIN角色的用户才能查看。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java object 之clone方法全面解析

    Java对象之clone方法全面解析 简介 在Java中,如果使用赋值号将一个对象赋值给另外一个对象,那么这两个对象会共用同一份数据。而通过clone()方法可以创建一个新的对象,并复制原始对象数据到新对象中。 在本篇文章中,我们将全面解析clone()方法,介绍如何使用clone()方法拷贝一个Java对象。 clone() 方法说明 clone()方法是…

    Java 2023年5月26日
    00
  • 一篇文章带你了解Java Spring基础与IOC

    一篇文章带你了解Java Spring基础与IOC 什么是Java Spring? Java Spring是一个轻量级的开源Java框架,它被广泛地应用于企业级Java应用开发中。它提供了一系列的工具和框架来帮助开发者构建易于维护和易于扩展的Web应用或企业应用。 Java Spring的核心特点包括: 依赖注入(DI)和控制反转(IoC)模式 面向切面编程…

    Java 2023年5月19日
    00
  • Java实现简单的银行管理系统的示例代码

    下面我将详细介绍如何实现一个简单的银行管理系统,包括设计思路、代码实现和示例演示。 设计思路 这个银行管理系统需要实现以下功能:1. 新增账户2. 存款3. 取款4. 查询账户信息 考虑到以上需要,我们可以设计出如下的类结构:- Account类,用于存储账户信息,包括账户号、姓名、余额等属性,以及存款和取款的方法。- Bank类,用于管理所有的账户,包括新…

    Java 2023年5月19日
    00
  • Java数组常见应用详解【创建、遍历、排序、查找】

    Java数组常见应用详解 数组是一种非常常见的数据结构,它可以用于存储一组数据,并且支持快速的遍历、排序和查找等操作。在Java中,数组是一个容器对象,可以存储相同类型的元素,并且在创建后其大小是不可改变的。本文将详细介绍Java数组的创建、遍历、排序和查找等常见应用,让大家对Java数组有更深入的了解。 创建数组 在Java中,可以通过以下方式来创建数组:…

    Java 2023年5月26日
    00
  • Java实现简易图书借阅系统

    Java实现简易图书借阅系统攻略 系统需求 实现图书借阅功能 管理图书信息 管理用户信息 支持多个用户同时借阅不同的图书,且不会冲突 有管理员功能,可以添加、删除、修改图书信息和用户信息,可以查询某个用户的借阅情况 系统设计 数据设计 图书信息 书名 作者 出版社 出版日期 ISBN号 数量 借出数量 用户信息 姓名 学号/工号 密码 借出图书 借阅信息 借…

    Java 2023年5月19日
    00
  • 基于jsp的井字游戏实例

    让我详细讲解一下“基于jsp的井字游戏实例”的完整攻略,具体如下: 1. 概述 本教程将介绍如何使用jsp开发一个简单的井字游戏,主要包括前端界面设计和涉及的后端交互,帮助读者理解jsp技术的应用和实现过程。 2. 前端界面设计 在本次实例中,我们将使用html和css设计前端界面,并使用javascript来完成井字游戏的交互逻辑。具体实现如下: 首先我们…

    Java 2023年6月15日
    00
  • MyBatis-Plus 通用IService使用详解

    以下是关于“MyBatis-Plus 通用IService使用详解”的详细攻略: 什么是MyBatis-Plus通用IService? 在使用MyBatis-Plus进行数据库操作时,通用IService提供了一套标准CURD方法,极大减轻我们手写CRUD的压力。通用IService是MyBatis-Plus提供的一个接口,包含一系列的基础CURD方法,可以…

    Java 2023年5月20日
    00
  • 微信小程序实现日期格式化

    下面我将详细讲解微信小程序实现日期格式化的完整攻略。 一、需求分析 在实际开发中,我们通常需要将日期格式化为特定的字符串格式,以便于展示给用户。比如,将 “2022/02/22 22:22:22” 格式化为 “2022年2月22日 22时22分22秒”。 微信小程序提供了 Date 对象来处理日期,但是该对象没有提供日期格式化的方法。因此,我们需要自己来实现…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部