当前位置: 首页 > 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));}
}

相关文章:

  • 网络安全体系结构和安全防护
  • 用户名是中文,导致jupyter生成配置文件失败的解决方法。
  • navigation2学习笔记
  • 医疗标准集中标准化存储与人工智能智能更新协同路径研究(上)
  • Python基础(吃洋葱小游戏)
  • 卸载Modelsim/Qustasim方法
  • 布林带的使用
  • [rootme:ctf all the day]Ubuntu 8.04week wp
  • selenium元素定位
  • 【软考高项论文】论信息系统项目的整体管理
  • JVM 之双亲委派机制与打破双亲委派
  • C语言---常见的字符函数和字符串函数介绍
  • Spring Cloud 微服务架构模型
  • Linux内核网络协议栈深度解析:面向连接的INET套接字实现
  • AI 在金融领域的落地实践:从智能风控到量化交易的技术突破与案例解析
  • C++入门(笔记)
  • Everything
  • 笔记06:DXF导入后板框的定义
  • ASProxy64.dll导致jetbrains家的IDE都无法打开。
  • Re--攻防世界-基础android