当前位置: 首页 > news >正文

【SpringSecurity鉴权】

SpringSecurity鉴权

  • 启用方法级安全控制​
  • 权限上下文传递工具​
  • 自定义权限服务 ss

启用方法级安全控制​

package com.chinabuilder.framework.config;/*** spring security配置*@EnableMethodSecurity 用于启用基于方法的权限控制。它的作用是通过 AOP(面向切面编程)在方法调用前后进行安全拦截。**/
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Configuration
public class SecurityConfig {
}

权限上下文传递工具​

// 在同一请求链路中 跨层级传递权限标识(如 "system:user:add")。
// 技术原理:
//        基于 RequestContextHolder + ThreadLocal 实现线程隔离的临时存储。
//        数据生命周期与 HTTP 请求绑定(SCOPE_REQUEST)。
//        典型场景:
//        拦截器中解析权限 → 存入上下文 → 业务层/日志中获取。
package com.chinabuilder.framework.security.context;public class PermissionContextHolder
{private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT";public static void setContext(String permission){RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission,RequestAttributes.SCOPE_REQUEST);}public static String getContext(){return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES,RequestAttributes.SCOPE_REQUEST));}
}

自定义权限服务 ss

package com.chinabuilder.framework.web.service;@Service("ss")
public class PermissionService
{/*** 验证用户是否具备某权限** @param permission 权限字符串* @return 用户是否具备某权限*/public boolean hasPermi(String permission){if (StringUtils.isEmpty(permission)){return false;}LoginUser loginUser = SecurityUtils.getLoginUser();if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())){return false;}PermissionContextHolder.setContext(permission);return hasPermissions(loginUser.getPermissions(), permission);}/*** 验证用户是否不具备某权限,与 hasPermi逻辑相反** @param permission 权限字符串* @return 用户是否不具备某权限*/public boolean lacksPermi(String permission){return hasPermi(permission) != true;}/*** 验证用户是否具有以下任意一个权限** @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表* @return 用户是否具有以下任意一个权限*/public boolean hasAnyPermi(String permissions){if (StringUtils.isEmpty(permissions)){return false;}LoginUser loginUser = SecurityUtils.getLoginUser();if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())){return false;}PermissionContextHolder.setContext(permissions);Set<String> authorities = loginUser.getPermissions();for (String permission : permissions.split(Constants.PERMISSION_DELIMETER)){if (permission != null && hasPermissions(authorities, permission)){return true;}}return false;}/*** 判断用户是否拥有某个角色** @param role 角色字符串* @return 用户是否具备某角色*/public boolean hasRole(String role){if (StringUtils.isEmpty(role)){return false;}LoginUser loginUser = SecurityUtils.getLoginUser();if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())){return false;}for (SysRole sysRole : loginUser.getUser().getRoles()){String roleKey = sysRole.getRoleKey();if (Constants.SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))){return true;}}return false;}/*** 验证用户是否不具备某角色,与 isRole逻辑相反。** @param role 角色名称* @return 用户是否不具备某角色*/public boolean lacksRole(String role){return hasRole(role) != true;}/*** 验证用户是否具有以下任意一个角色** @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表* @return 用户是否具有以下任意一个角色*/public boolean hasAnyRoles(String roles){if (StringUtils.isEmpty(roles)){return false;}LoginUser loginUser = SecurityUtils.getLoginUser();if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())){return false;}for (String role : roles.split(Constants.ROLE_DELIMETER)){if (hasRole(role)){return true;}}return false;}/*** 判断是否包含权限** @param permissions 权限列表* @param permission 权限字符串* @return 用户是否具备某权限*/private boolean hasPermissions(Set<String> permissions, String permission){return permissions.contains(Constants.ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));}
}
http://www.lqws.cn/news/555265.html

相关文章:

  • 深入剖析AI大模型:Dify的介绍
  • centos指令
  • 利用GPU加速TensorFlow
  • 一文读懂Kubernetes(K8s)
  • 设计模式 (四)
  • Gradio全解13——MCP详解(4)——TypeScript包命令:npm与npx
  • maven多模块、多层级项目 如何只构建指定的项目
  • TypeScript 中的 WebSocket 入门
  • stream使用案例
  • 【Docker基础】Docker容器管理:docker stats及其参数详解
  • JavaScript中Object()的解析与应用
  • 深入详解:决策树算法的概念、原理、实现与应用场景
  • 思维提升篇-数学抽象与计算机实现
  • ChatboxAI 搭载 GPT 与 DeepSeek,引领科研与知识库管理变革
  • 华为云Flexus+DeepSeek征文|利用华为云一键部署的Dify平台构建高效智能电商客服系统实战
  • 我的世界模组开发进阶教程——机械动力的数据生成(2)
  • 系统架构设计师论文分享-论ATAM的使用
  • nginx基本使用 linux(mac下的)
  • 计算机网络——概述
  • AI代码助手实践指南
  • Linux-读者写者问题
  • 【世纪龙科技】新能源汽车动力电池总成装调与检修教学软件
  • 如何在anaconda上创建虚拟环境--windows下
  • 大模型在急性冠脉综合征预测及诊疗方案制定中的应用研究
  • C++算法学习专题:双指针
  • (五)神经网络
  • 《Go语言高级编程》RPC 入门
  • 思科交换机接口显示inactive原因
  • c# 比较两个list 之间元素差异
  • 搭建Flink分布式集群