基于角色的访问控制(RBAC)实现资源权限管理

第六章 电子政务系统的用户权限管理 -- RBAC(一) 政府部门的审批业务有着严格的权限控制,不同级别不同身份的人员在审批流程中充当着不同的角色,超越权限的审批行为被严格禁止。因此,要在政府审批中引入工作流技术,首先要解决好工作流的访问控制问题,这既是审批流程控制的需要,也是审批系统安全的需要。结合政府部门的组织特点,本文重点研究和实现基于角色的审批工作流的访问控制模型。     6.1 基于角色的访问控制模型RBAC     工作 阅读详情

基于RBAC模型的后台权限管理系统

在这里插入图片描述

项目概述

这是一个基于 Spring Boot + Spring Security + MyBatis-Plus 的企业级后台权限管理系统,实现了完整的用户认证、授权、会话管理和动态权限控制功能。

技术架构

核心技术栈
  • 后端框架: Spring Boot 2.7.6
  • 安全框架: Spring Security 5.7.5
  • 持久层: MyBatis-Plus 3.5.3.1
  • 数据库: MySQL 8.0
  • 缓存/会话: Redis
  • 模板引擎: Thymeleaf 3.0.15
  • 开发语言: Java 17
主要功能模块
1. 身份认证模块
  • ✅ 表单登录认证
  • ✅ 验证码校验(图片验证码)
  • ✅ Remember-Me 记住我功能(Token 持久化到数据库)
  • ✅ 自定义登录成功/失败处理器
2. 权限管理模块
  • ✅ 动态权限控制: 基于 FilterInvocationSecurityMetadataSource 和 AccessDecisionManager 实现运行时权限加载
  • ✅ RBAC 模型: 用户-角色-权限三层权限体系
  • ✅ URL 级别权限控制
  • ✅ 自定义权限不足处理 handler
3. 会话管理
  • ✅ Session 存储到 Redis(支持分布式部署)
  • ✅ Session 超时时间: 600 秒(10 分钟)
  • ✅ 退出登录自动清理 Token
4. 业务管理模块
  • 👤 用户管理: 用户增删改查、角色分配
  • 🎭 角色管理: 角色增删改查、权限关联
  • 🔐 权限管理: 权限增删改查、动态刷新
  • 📦 商品管理: 商品 CRUD、显示/隐藏控制
5. 跨域支持
  • ✅ 完整的 CORS 配置
  • ✅ 支持携带凭证(Cookie、Authorization)
  • ✅ 预检请求缓存 1 小时

系统配置

服务配置
  • 端口: 8080
  • Session 超时: 600 秒
数据库配置
  • 类型: MySQL 8.0
  • 地址: 127.0.0.1:3306
  • 数据库名: security_db
Redis 配置
  • 地址: 127.0.0.1:6379
  • 数据库: DB 1
  • 用途: Session 共享、权限缓存
模板引擎
  • 引擎: Thymeleaf
  • 模式: LEGACYHTML5
  • 缓存: 关闭(开发环境)
  • 编码: UTF-8

核心特性

🔒 安全性
  1. 密码加密: BCrypt 强哈希算法
  2. CSRF 防护: 已禁用(根据业务需求)
  3. XSS 防护: Thymeleaf 自动转义
  4. 点击劫持防护: 同源 iframe 限制
⚡ 性能优化
  1. 静态资源忽略: CSS/JS/Images 不经过 Security 过滤器
  2. Redis 会话: 减轻服务器内存压力
  3. 动态权限缓存: 减少数据库查询次数
🎯 可扩展性
  1. 动态权限: 新增权限无需重启应用
  2. 模块化设计: Handler、Filter、Service 分层清晰
  3. RESTful API: 支持前后端分离扩展

适用场景

  • 🏢 企业内部管理系统
  • 🎓 学习 Spring Security 完整实践
  • 🔧 RBAC 权限模型参考实现
  • 🌐 分布式会话管理示例

项目结构

security-management/
├── config/              # 安全配置类
├── controller/          # 控制器层
├── pojo/              # 实体类
├── handler/             # 认证/授权处理器
├── filter/              # 自定义过滤器
├── service/             # 业务逻辑层
├── mapper/              # 数据访问层
└── resources/
    └── templates/       # Thymeleaf 模板

核心实现方案

RBAC模型数据库设计

  • 用户表sys_user包含username、password(BCrypt加密)、status等字段
  • 角色表sys_role定义角色编码和名称
  • 权限表sys_permission存储权限标识和描述
  • 关联表sys_user_role和sys_role_permission建立多对多关系
#数据库设计实现
#用户表(sys_user)
CREATE TABLE sys_user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL COMMENT 'BCrypt加密存储',
    status TINYINT DEFAULT 1 COMMENT '0-禁用 1-启用',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

#角色表(sys_role)
CREATE TABLE sys_role (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色编码',
    role_name VARCHAR(50) NOT NULL COMMENT '角色名称',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

#权限表(sys_permission)
CREATE TABLE sys_permission (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    perm_code VARCHAR(100) NOT NULL UNIQUE COMMENT '权限标识',
    perm_desc VARCHAR(200) COMMENT '权限描述',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

#关联关系实现
#用户-角色关联表(sys_user_role)
CREATE TABLE sys_user_role (
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES sys_user(id),
    FOREIGN KEY (role_id) REFERENCES sys_role(id)
);

#角色-权限关联表(sys_role_permission)
CREATE TABLE sys_role_permission (
    role_id BIGINT NOT NULL,
    perm_id BIGINT NOT NULL,
    PRIMARY KEY (role_id, perm_id),
    FOREIGN KEY (role_id) REFERENCES sys_role(id),
    FOREIGN KEY (perm_id) REFERENCES sys_permission(id)
);

典型查询示例
查询用户权限列表

SELECT DISTINCT p.perm_code 
FROM sys_user u
JOIN sys_user_role ur ON u.id = ur.user_id
JOIN sys_role_permission rp ON ur.role_id = rp.role_id
JOIN sys_permission p ON rp.perm_id = p.id
WHERE u.username = ? AND u.status = 1;

索引优化
在username、role_code和perm_code字段上建立唯一索引
在关联表的外键字段上建立普通索引以提高连接查询性能

CREATE INDEX idx_user_role ON sys_user_role(user_id, role_id);
CREATE INDEX idx_role_perm ON sys_role_permission(role_id, perm_id);

BCrypt密码加密示例

String encodedPassword = BCrypt.hashpw(rawPassword, BCrypt.gensalt());
// 验证密码
boolean matches = BCrypt.checkpw(rawPassword, encodedPassword);

动态权限控制实现

自定义元数据源

/**
 * @author weh
 * @version 1.0
 * @description: 自定义元数据源
 * @date 2026/5/11 22:35
 */
@Component
public class DynamicSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
    
    @Autowired
    private PermissionService permissionService;

    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) {
        String requestUrl = ((FilterInvocation) object).getRequestUrl();
        List<Permission> permissionList = permissionService.listAll();
        for (Permission permission : permissionList) {
            if (new AntPathRequestMatcher(permission.getUrl()).matches(
                ((FilterInvocation) object).getRequest())) {
                return SecurityConfig.createList(permission.getPermissionCode());
            }
        }
        return null;
    }
}

安全配置关键代码

自定义的UserDetailsService接口实现类
用于获取用户信息

package com.weh.service.impl;

import com.weh.pojo.Permission;
import com.weh.pojo.User;
import com.weh.service.PermissionService;
import com.weh.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;

/**
 * @author weh
 * @version 1.0
 * @description: 这里是自定义的MyUserDetailsService,用于获取用户信息
 * 通过RBAC模型进行权限控制
 * @date 2026/5/7 22:49
 */
@Service
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private PermissionService permissionService;
    @Autowired
    private UserService userService;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        System.out.println("====="+username);
        User user = userService.findByUsername(username);
        if (Objects.isNull( user)){
            throw new UsernameNotFoundException("用户不存在");
        }
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        List<Permission> permissionList = permissionService.findByUserId(user.getId());
        // 通过用户id查询权限列表,然后添加权限标签
        for (Permission permission : permissionList){
            authorities.add(new SimpleGrantedAuthority(permission.getPermissionTag()));
        }
        // 创建UserDetails对象,这里只是作为实例演示,可自行重写
        UserDetails userDetails = new org.springframework.security.core.userdetails.User
                (username,user.getPassword(),//noop不使用密码加密 , bcrypt使用加密算法
                        true,// 用户是否启用
                        true,// 用户是否过期
                        true,// 用户凭证是否过期
                        true,// 用户是否锁定
                        authorities);
        return userDetails;
    }
}

Spring Security配置类

package com.weh.config;

import com.weh.filter.ValidateFilter;
import com.weh.handler.*;
import com.weh.service.impl.MyUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.ObjectPostProcessor;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import javax.sql.DataSource;

/**
 * Spring Security 安全配置类
 * <p>
 * 负责配置应用的身份认证、授权、跨域、会话管理等安全策略。
 * 采用动态权限管理,支持运行时从数据库加载权限配置。
 * </p>
 *
 * @author weh
 * @version 1.0
 * @date 2026/5/7 21:37
 */
@Configuration
//@EnableGlobalMethodSecurity(prePostEnabled = true) // 启用方法权限控制,比如@PreAuthorize , @PostAuthorize ,@PreFilter , @PostFilter
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private MyUserDetailsService myUserDetailsService;


    @Autowired
    private MyAuthenticationFailureHandler  myAuthenticationFailureHandler;
    @Autowired
    private MyAuthenticationSuccessHandler  myAuthenticationSuccessHandler;
    @Autowired
    private MyLogoutSuccessHandler myLogoutSuccessHandler;

    @Autowired
    private ValidateFilter validateFilter;

    @Autowired
    private MyAccessDeniedHandler myAccessDeniedHandler;
    @Autowired
    private MyAccessDecisionManager myAccessDecisionManager;
    @Autowired
    private MyFilterInvocationSecurityMetadataSource myFilterInvocationSecurityMetadataSource;


    /**
     * 配置密码编码器 Bean
     * <p>
     * 使用 BCrypt 强哈希算法对密码进行加密存储和验证。
     * </p>
     *
     * @return PasswordEncoder 实例
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    /**
     * 配置身份认证管理器
     * <p>
     * 指定自定义的用户详情服务(MyUserDetailsService)和密码编码器,
     * 用于在登录时从数据库加载用户信息并验证密码。
     * </p>
     *
     * @param auth AuthenticationManagerBuilder 构建器
     * @throws Exception 配置异常
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailsService)// 使用自定义用户认证
                .passwordEncoder(passwordEncoder()); // 密码编码器
    }


    /**
     * 配置忽略静态资源的安全过滤
     * <p>
     * 将 CSS、图片、JS、验证码等静态资源路径排除在 Security 过滤器链之外,
     * 提高性能并避免不必要的认证检查。
     * </p>
     *
     * @param web WebSecurity 构建器
     */
    @Override
    public void configure(WebSecurity web) {
        //解决静态资源被拦截的问题
        web.ignoring().antMatchers("/css/**", "/images/**", "/js/**","/code/**");
    }


    /**
     * 配置 HTTP 安全策略
     * <p>
     * 包括验证码过滤器、动态权限管理、表单登录、登出、记住我、跨域等功能。
     * </p>
     *
     * @param http HttpSecurity 构建器
     * @throws Exception 配置异常
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

    //===================================================================================
    // 在用户名密码认证过滤器之前添加验证码校验过滤器
    http.addFilterBefore(validateFilter, UsernamePasswordAuthenticationFilter.class);


    // ==================================================================================================
    // 权限控制(必须要放到anyRequest().authenticated()之前的位置,不然报错)
    //    http.authorizeRequests().antMatchers("/user/**").hasRole("ADMIN"); // /user/** 路径下的所有请求,需要ADMIN角色才能访问
    //    // url权限控制, 设置多个角色用, 多个ip用and连接; 这里配置了ADMIN / PRODUCT角色并且IP为127.0.0.1的ip才能访问
    //    http.authorizeRequests().antMatchers("/product/**").access("hasAnyRole('ADMIN','PRODUCT')and hasIpAddress('127.0.0.1')");
    //    http.authorizeRequests().antMatchers("/user/**").access("@myAuthorizationConfig.check(authentication,request)");

    //hasRole和hasAuthority的区别就是权限标签,
    // hasRole是角色权限,hasAuthority是权限标签
    //hasRole("ADMIN")  --用户授予 new SimpleGrantedAuthority("ROLE_ADMIN")
    //hasAuthority("user:getAll")  --用户授予 new SimpleGrantedAuthority("user:getAll")

    // 查询所有权限列表
    //    List<Permission> permissions = permissionService.list();
    //    // 设置每个接口url进行权限控制,通过权限标签permissionTag进行权限控制
    //    for (Permission permission : permissions){
    //        http.authorizeRequests().antMatchers(permission.getPermissionUrl())
    //                .hasAuthority(permission.getPermissionTag());
    //    }


   // 配置动态权限管理:通过自定义的元数据源和决策管理器实现运行时权限控制
        http.authorizeRequests()
                .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                    @Override
                    public <O extends FilterSecurityInterceptor> O postProcess(O fsi) {
                        fsi.setSecurityMetadataSource(myFilterInvocationSecurityMetadataSource);
                        fsi.setAccessDecisionManager(myAccessDecisionManager);
                        return fsi;
                    }
                })
                .and().exceptionHandling().accessDeniedHandler(myAccessDeniedHandler); // 添加权限访问处理类






    // ===================================================================================

        //用HttpBasic认证(不安全)
        //        http.httpBasic()
        //                .and().authorizeRequests() // 配置权限,默认所有请求都需要认证
        //                .anyRequest()               // 所有请求
        //                .authenticated();        // 需要认证


        // 用配置表单认证(较为安全)
        http.formLogin()
                // 自定义登录页面(用static文件作为静态资源是可以直接写login.html),但是项目中用的是templates模板,路径需改为映射的路径
                .loginPage("/toLoginPage")
                .loginProcessingUrl("/login")   // 登录处理接口url
                .usernameParameter("username") // 用户名参数名
                .passwordParameter("password") // 密码参数名
                .defaultSuccessUrl("/")         // 登录成功后默认跳转的页面 / 自动登录后跳转到主页
                .successHandler(myAuthenticationSuccessHandler) // 引入自定义登录成功处理器
                .failureHandler(myAuthenticationFailureHandler) // 引入自定义登录失败处理器
                .and()
                .logout().logoutUrl("/logout")// 登出接口url,如果有remember-me功能,系统会自动将token进行删除
                .logoutSuccessHandler(myLogoutSuccessHandler) // 引入自定义登出成功处理器
                .and()
                .rememberMe()// 开启记住我功能
                .rememberMeParameter("remember-me")// 记住我参数名
                .tokenValiditySeconds(60 * 60 * 24 * 7)// token有效时间,默认14天
                .tokenRepository(getPersistentTokenRepository()) // 持久化token,将token保存到数据库中persistent_logins表
                .and()
                .authorizeRequests().antMatchers("/toLoginPage").permitAll()//放行登录页面和验证码接口
                .anyRequest()
                .authenticated();


        //加载同源域名下iframe页面
        http.headers().frameOptions().sameOrigin();

        // ==================================================================================================
        // session会话设置
//        http.sessionManagement()
//                .invalidSessionUrl("/toLoginPage") // session失效后跳转的页面
//                .maximumSessions(1)// 设置session最大会话数量,1同一时间只能有一个用户登录,互踢
//                .maxSessionsPreventsLogin(true) //当达到最大数量后,不允许再登录
//                .expiredUrl("/toLoginPage"); // session过期后跳转的页面


        // 禁用csrf,若开启csrf,则需要配置csrfTokenRepository, 否则会报403错误
         http.csrf().disable();
        // 开启跨域支持,允许跨域
        http.cors().configurationSource(corsConfigurationSource());
    }



    /**
     * 配置持久化 Token 仓库(记住我功能)
     * <p>
     * 将 Remember-Me 的 Token 存储到数据库中,支持跨会话保持登录状态。
     * 首次启动时可设置 setCreateTableOnStartup(true) 自动创建 persistent_logins 表。
     * </p>
     *
     * @return PersistentTokenRepository 实例
     */
    @Bean
    public PersistentTokenRepository getPersistentTokenRepository(){
        JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
        jdbcTokenRepository.setDataSource(dataSource);// 设置数据源
        //启动时帮助我们自动创建一张表persistent_logins, 第一次启动设置true 第二次启动设置false或者注释
//        jdbcTokenRepository.setCreateTableOnStartup(true);
        return jdbcTokenRepository;
    }


    @Autowired
    private CorsConfiguration corsConfiguration;

    /**
     * 配置跨域资源共享(CORS)信息源
     * <p>
     * 允许所有来源、方法、请求头的跨域请求,并支持携带凭证(Cookie、Authorization 等)。
     * 预检请求缓存时间为 1 小时,减少浏览器 OPTIONS 请求次数。
     * </p>
     *
     * @return CorsConfigurationSource 跨域配置源
     */
    private CorsConfigurationSource corsConfigurationSource() {
        // 允许跨域的站点(使用 allowedOriginPattern 支持通配符,兼容 allowCredentials)
        corsConfiguration.addAllowedOriginPattern("*");
       //用spring boot 2.4.0以上版本不支持
        //  corsConfiguration.addAllowedOrigin("*");
        // 允许跨域的 HTTP 方法(GET, POST, PUT, DELETE, OPTIONS 等)
        corsConfiguration.addAllowedMethod("*");
        // 允许跨域的请求头(Content-Type, Authorization 等)
        corsConfiguration.addAllowedHeader("*");
        // 允许携带凭证(cookie、session、Authorization 头等)
        corsConfiguration.setAllowCredentials(true);
        // 预检请求(OPTIONS)的缓存时间(秒),减少预检请求次数
        corsConfiguration.setMaxAge(3600L);
        // 创建基于 URL 的跨域配置源
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        // 对所有 URL 路径应用此跨域配置
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return urlBasedCorsConfigurationSource;
    }
}

会话管理配置

RedisSession配置

spring:
  session:
    store-type: redis
    timeout: 600s
    redis:
      namespace: spring:session
  redis:
    host: 127.0.0.1
    port: 6379
    database: 1

前端权限控制方案

Thymeleaf安全表达式

<div sec:authorize="hasAuthority('user:add')">
    <button class="btn-add">新增用户</button>
</div>

性能优化措施

权限缓存实现

@Cacheable(value = "permissionCache", key = "'all_permissions'")
public List<Permission> listAll() {
    return baseMapper.selectList(null);
}

@CacheEvict(value = "permissionCache", key = "'all_permissions'")
public void clearPermissionCache() {
    // 清空缓存
}

异常处理机制

自定义AccessDeniedHandler

@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, 
                      HttpServletResponse response,
                      AccessDeniedException e) {
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(JSON.toJSONString(
            Result.error(403, "权限不足")));
    }
}

后台管理系统登录
在这里插入图片描述

Java Web RBAC权限管理 前言 权限管理是在项目中经常要使用到的模块,有着极其重要的功能。比较出名的权限框架,分别为 Shiro 和 Spring Security,两者各有优缺,这次我们不用任何权限框架来实现 RBAC 权限管理。 RBAC 简介 RBAC (Role-Based Access Control) 基于角色的权限访问控制。 即用户拥有角色,角色拥有权限。具体关于 RBAC 的好处我就不再多说,如感兴... 阅读详情

相关推荐

权限控制:访问控制列表(ACL)还是基于角色的访问控制(RBAC)?

在PHP中,我们可以使用访问控制列表(ACL)或基于角色的访问控制(RBAC)来实现权限控制。另一方面,基于角色的访问控制(RBAC)是一种将权限授予角色,然后将角色授予用户的权限模型。另一方面,RBAC(基于角色的访问控制)是一种将权限授予角色,然后将角色授予用户的权限模型。ACL适用于对每个资源的权限进行细粒度的控制,而RBAC适用于基于角色的权限控制:ACL 还是 RBAC?ACL 适用于对每个资源的权限进行细粒度控制,而 RBAC 更适合基于角色的权限管理。资源的多个权限,并检查了用户角色为。

ZoExamples的博客 216

扩展RBAC用户角色权限设计方案

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”...

心梦帆影Java技术博客 8243

SAP期初库存导入 (1)

LSMW

IT养家 7191

基于角色的权限控制 (RBAC)

前些天做课设了解到了一些关于权限控制的知识,开始想着看看若依框架是怎么实现的,奈何级别不够看完还是不很了解,于是上网搜搜相关文章,然后通过借助AI理解了其前后端的大致流程,最后还是基于自己的理解实现了一个差不多RBAC框架,在以后的项目中可以引用一下...用户(User): 系统的使用者角色(Role): 权限的集合,如"管理员"、"编辑"、"访客"等权限(Permission): 对特定资源的具体操作权限,如"创建文章"、"删除用户"会话(Session): 用户激活角色的过程 基于角色的权

m0_74808313的博客 1434

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 383

红外协议 IR NEC 协议深度解析-简单易懂协议详解

1. 协议特征 使用双向编码(又称曼彻斯特编码); 使用38K载波对编码后的波形进行调制; 位时间 1.12ms 或 2.25ms 2. 调制 定义脉冲560µS为脉冲基本宽度T; 根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4: (1) Logic “1” 位宽为2.25ms,脉冲时间560us(T + 3T); (2) Logic “0” 位宽为1.12ms,脉冲时间560us(T + T)。 (3 ) 重复码: 位宽为11.25ms,脉冲时间9ms(16T + 4T)。 3. 协议

代码打工人的博客 1万+

IdentityServer4实战 - 基于角色的权限控制及Claim详解

一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家。在QQ群里有许多人都问过IdentityServer4怎么用Role(角色)来控制权限呢?还有关于Claim这个是什么呢?下面我带大家一起来揭开它的神秘面纱! 二.Claim详解 我们用过IdentityServer4或者熟悉ASP.NET Cor...

weixin_34104341的博客 1247

信号完整性分析学习--16--传输线效应

传输线效应 说到传输线效应,大多数人都会想到一个经验法则,那就是: “当互连线的长度大于1/6倍的信号上升时间的空间延伸时,互连线就体现出传输线效应。” 上升时间越小越容易体现传输线效应。 由此可见,同一根互连线,它是否体现传输线效应,要看它要传输什么样的信号。下图所示,一根延时为15ps的互连线,当它传输上升时间为60ps的信号时就会体现传输线效应;当它传输上升时间为180ps的信号时就不体现传输线效应。

qq_29476769的博客 7274

后台RBAC权限系统:角色、菜单、管理员权限管控

文章摘要:RBAC后台权限系统设计与实现 本文介绍了基于RBAC模型的权限管理系统设计,适用于多角色协作的后台场景。系统通过五张核心表(管理员、角色、菜单及关联表)实现"用户-角色-权限"三级控制,采用JWT认证和Redis缓存优化权限校验。预置四种典型角色(超级管理员、运营、财务、运维),通过角色编码和权限标识(如"device:add")精确控制按钮级操作权限。系统支持数据范围控制(全部/本部门/本人数据)和动态菜单加载,有效解决多角色协作中的权限管理问题。

爱片闲串,爱钓鱼,爱中医,爱分享 98

FPGA实战:从零构建eMMC控制器(Verilog篇)

本文详细介绍了如何使用Verilog从零构建FPGA上的eMMC控制器,涵盖eMMC接口基础、命令系统解析、关键模块设计及性能优化技巧。通过实战案例,帮助开发者掌握高速数据存储解决方案,提升嵌入式系统开发能力。

weixin_26802933的博客 297

BetaFlight开源飞控源码分析

BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码

weixin_43811044的博客 1万+

基于角色的权限控制 数据库设计

共5张表: 1)用户 2)角色 3)权限    4)用户 -&gt; 角色 映射 (多对多) 5)角色 -&gt; 权限 映射 (多对多) 简化版可以省略步骤4, 即一个用户只能属于一个角色 用户每次登陆时, 查询用户所属角色是否有某路径的权限, 通过拦截器拦截  ...

AlwenZwei的博客 720

innovus:如何在init design之后新增参考库(lib/lef)

如题,在PR过程中经常会遇到这种问题,时序无法收敛,需要新增一套lvt或者hpc的库,怎么办?

m0_61544122的博客 5008

RBAC(基于角色的访问控制)简介

RBAC简介 1.RBAC中文名称:基于角色的访问控制 1.1作用:实现访问控制 1.2核心:角色 2.英文名称:Role-Based Access Control 3.解释: 是一种数据库设计思想,根据RBAC思想进行数据库设计,根据数据库设计更好的完成权限控制。 4.权限控制常用分类: 4.1菜单功能 4.2url控制(控制访问不同的控制器) 4.3资源可见性控制(页面某些元素对不...

weixin_42879144的博客 1126

游戏“中台”的故事——架构演进、团队协同与产品创新的深度剖析

什么是中台?在游戏行业里,中台并不是把所有技术都归口管理、统一“圈养”。更不是简单的工具集合。它代表的,是一种“模块化底座”——把业务的通用能力、基础支撑和数据结合,变成可复用、可扩展、可创新的技术体系。让“前台”专注于创新玩法、极致体验;让“后台”稳健保障数据、安全、性能;让“中台”统合各种资源、流程、工具,形成平台型生产力。游戏中台是团队协同、技术创新、业务增长并行的产物。它让开发从重复劳动解脱,带着创新冲锋;让运营靠数据说话,精准制胜;让产品实现高效迭代,生态爆发。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1949

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

基于角色的访问控制(RBAC)

基于角色的访问控制(RBAC) 注:该博客参考 尚硅谷老师,仅供个人学习使用,转载请标明作者和此段文字

吃糖不加牛奶的博客 2585

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RBAC:基于角色的访问控制

基于角色的访问控制(RBAC)是实施面向企业安全策略的一种有效的访问控制方式。一种数据库的设计思想,其核心是角色。其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。用户访问项目应当根据其权限的不同,可以操作的项目资源是不同的。项目的资源可以分为两大部分:前端页面资源和后台功能资源。

weixin_64022848的博客 1129

RBAC角色与权限管理

RBAC 就是用户通过角色与权限进行关联。在网站中,用户通过URL地址,进入网站的后端逻辑,从而对网站的数据库进行操作管理。可以让拥有权限的用户来完成操作,而没有权限的用户无法操作。

hhh的博客 994

【Azure】Azure 中的基于角色的访问控制 (RBAC) 与基于属性的访问控制 (ABAC)

在任何公司中,网络用户必须先经过身份验证和授权,然后才能访问可能导致安全漏洞的系统部分。获得授权的过程称为访问控制。在本文中,我将讨论管理系统访问控制的两种主要方法——基于角色的访问控制 (RBAC)和基于属性的访问控制 (ABAC) ,它们的区别,以及使用访问权限管理工具的重要性。以便其帮助团队更轻松地监控整个组织的访问控制。

我在山城重庆,我希望能为这片软件沙漠地带贡献自己的一滴水,Stay tuned! 9303

权限管理之位运算以及RBAC俩种实现方法

后台系统设计——角色权限 一、前言 不论是哪种后台管理系统,“人员权限”始终是绕不开的话题。无论是移动端,PC端产品,登陆都需要一个账号。只是对于C端的产品,大多都是用户自己注册即可。 而对于后台产品而言,是需要公司内部人员去创建账号的。每个使用系统的用户都有一个独一无二的账号,每个账号都有自己对应的权限。 多数情况下,除了超级管理员外,我们会对大多数的账号的权限做一些限制,以此来管理不同用户的使用权限问题。 譬如,做企业使用类软件,不同部门、不同职位的人的权限是不同的;再例如一款收费产品的收费用户和免费用

weixin_45954124的博客 1636

你知道权限管理的RBAC模型吗?

你知道权限管理的RBAC模型吗? 权限在日常办公系统中算是一个比较常见的基本功能,对于存在有权限模块的系统中规定了登录用户能够操作哪些资源,不能够操作哪些资源。借助权限模块可以有效的控制参与到系统不同身份人员要具体做的操作,可以说一个成熟的后端系统离不开一个比较完善的权限管理系统。 权限管理的方式 RBAC模型 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George Mason大学信息

weixin_52397329的博客 250

新的RBAC:基于资源的权限管理(Resource-Based Access Control)

新的RBAC:基于资源的权限管理(Resource-Based Access Control) 本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的。同时将讨论一种更好的权限管理方式。 What is a Role? 什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列行为或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能“做”什么取决于与之关联的各个角色。 例如,一个用户以关联了”项目管.

vagerdwely的博客 1216

RBAC权限管理设置

RBAC(Role-Based Access Control,基于角色的访问控制)是一种常用的访问控制机制,用于管理系统中的用户权限。RBAC通过将用户分配给角色,并将权限授予角色,从而控制用户对资源的访问。

zhzjn的博客 556

RBAC权限模型设计

基于角色的访问控制(RBAC)是实施面向企业安全策略的一种有效的访问控制方式。 其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。 基本概念 RBAC认为权限授权实际上是Who、What

m566666的博客 1506

推荐项目:mongoose-rbac —— 强大的Mongoose角色基础访问控制库

推荐项目:mongoose-rbac —— 强大的Mongoose角色基础访问控制库 在构建任何Web应用时,安全性始终是首要考虑的问题之一。尤其是当涉及到权限管理时,一个灵活且强大的访问控制系统能够显著提升应用的安全性和用户体验。今天,我们将深入探索一款专为基于Mongoose的Node.js应用设计的角色基础访问控制(RBAC)解决方案——mongoose-rbac。 项目介绍 mongoos...

gitblog_00027的博客 918
上一篇: Spring Boot Actuator与Admin监控实战
下一篇: 基于Streamlit框架快速创建和分享自定义的交互式Web应用
IT_WEH_coder
博客等级 码龄5年 2万+粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_WEH_coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值