【SpringSecurity】SpringSecurity安全框架授权

devtools/2025/1/16 22:04:32/

授权

权限系统要实现的效果:不同的用户可以使用不同的功能

在后台进行用户权限的判断,判断当前用户是否有相应的权限,必须具有所需权限才能进行相应的操作。

SpringSecurity 中,默认使用 FilterSecurityInterceptor 进行权限校验。在 FilterSecurityInterceptor 中会从SecurityContextHolder 获取其中的 Authentication,然后获取其中的权限信息。当前用户是否拥有访问当前资源所需的权限。所以我们在项目中只需要把当前登录用户的权限信息也存入 Authentication,然后设置我们的资源所需要的权限即可。

首先开启相关配置。

java">@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {// ......
}

使用对应的注解。@PreAuthorize

java">@RestController
@RequestMapping("/user")
public class SysUserController {@Resourceprivate SysUserService sysUserService;// 登录方法......// 退出登录......@GetMapping("/list")@PreAuthorize("hasAuthority('USER1')")public ResultJSON list() {return ResultJSON.success();}
}

封装权限信息

写 UserDetailsServiceImzho 中,在查询出用户后还要获取对应的权限信息,封装到 UserDetails 中返回。

把权限信息写死封装到 UserDetails 中进行测试。

修改 UserDetails 的实现类 LoginUser,让其能封装权限信息。

java">@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginUser implements UserDetails {private SysUser sysUser;private List<String> permissions;public LoginUser(SysUser sysUser, List<String> permissions) {this.sysUser = sysUser;this.permissions = permissions;}//存储SpringSecurity所需要的权限信息的集合@JSONField(serialize = false)private List<GrantedAuthority> authorities;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {if (authorities != null) {return authorities;}authorities = AuthorityUtils.commaSeparatedStringToAuthorityList(String.join(",",permissions));return authorities;}// 其他方法......
}
java">@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Resourceprivate SysUserDao sysUserDao;@Overridepublic UserDetails loadUserByUsername(String username)throws UsernameNotFoundException {// 根据用户名查询用户信息SysUser sysUser = sysUserDao.selectOne(new QueryWrapper<SysUser>().eq("user_name", username));if (Objects.isNull(sysUser)) {throw new RuntimeException("用户名或密码错误");}// 从数据库中获取权限列表List<String> list = new ArrayList<>;list.add("USER1");// list.add("USER2");// 返回用户信息 和 权限集合return new LoginUser(sysUser, list);}
}

在 JwtAuthenticationTokenFilter 中修改如下代码

UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser,null,loginUser.getAuthorities());

java">@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {@Resourceprivate RedisCache redisCache;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {//......//存入SecurityContextHolder//TODO 获取权限信息封装到Authentication中UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(loginUser,null,loginUser.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);//放行filterChain.doFilter(request, response);}
}

分别调用接口运行测试

java">@RestController
@RequestMapping("/user")
public class SysUserController {@Resourceprivate SysUserService sysUserService;// 登录方法......// 退出登录......@GetMapping("/list")@PreAuthorize("hasAuthority('USER1')")public ResultJSON list() {return ResultJSON.success();}
}
java">@RestController
@RequestMapping("/order")
public class SysOrderController {@GetMapping("/list")@PreAuthorize("hasAuthority('USER2')")public ResultJSON list() {return ResultJSON.success();}
}

从数据库查询权限信息

RBAC 权限模型(Role-Based Access Control)

基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。

在这里插入图片描述


http://www.ppmy.cn/devtools/151072.html

相关文章

什么是数据仓库?

什么是数据仓库&#xff1f; 数据仓库&#xff08;Data Warehouse&#xff0c;简称DW&#xff09;是一种面向分析和决策的数据存储系统&#xff0c;它将企业中分散的、异构的数据按照一定的主题和模型进行集成和存储&#xff0c;为数据分析、报表生成以及商业智能&#xff08;…

vue2 web 多标签输入框 elinput是否当前焦点

又来分享一点点工作积累及解决方案 产品中需要用户输入一些文字后按下回车键生成标签来显示在页面上&#xff0c;经过尝试与改造完成如下&#xff1a; <template><div class"tags-view" click"beginInput"><el-tag :key"index" …

js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值

问&#xff1a; 现在tabData.value 接收到了后端返回的数据&#xff0c; [{text:人力,percentage&#xff1a;‘90’}&#xff0c;{text:物品,percentage&#xff1a;‘20’}&#xff0c;{text:物理,percentage&#xff1a;‘50’}&#xff0c;{text:服务,percentage&#xff…

Cyberchef开发operation操作之-node开发环境搭建

本文介绍一下Cyberchef开发operation操作环境的搭建工作&#xff0c;为后续的Cyberchef开发operation操作提供开发环境基础&#xff0c;这里。该篇作为我的专栏《Cyberchef 从入门到精通教程》中的一篇&#xff0c;详见这里。 Linux环境 由于cyberchef只支持Linux和MAC的开发…

Linux下源码编译安装Nginx1.24及服务脚本实战

1、下载Nginx [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz2、解压 [rootlocalhost ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/3、安装依赖 [rootlocalhost ~]# yum install gcc gcc-c make pcre-devel openssl-devel -y4、 准备 N…

python学opencv|读取图像(三十二)使用cv2.getPerspectiveTransform()函数制作透视图-变形的喵喵

【1】引言 前序已经对图像展开了平移、旋转缩放和倾斜拉伸技巧探索&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十八&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十…

es,单个节点磁盘使用率高

背景&#xff1a; 磁盘使用率不均匀&#xff0c;一般是因为存在大分片&#xff0c;分片数和机器数不匹配引起的。 这次出现的问题排除了&#xff0c;分片问题。 一个节点使用到87%&#xff0c; 其它节点60% 左右&#xff0c; 原因&#xff1a; 是因为升级配置数据迁移的时候 迁…

android 主题都表示什么意思

Theme.AppCompat Theme.AppCompat 是一个兼容性主题&#xff0c;用于确保应用在不同版本的 Android 系统上都能保持一致的外观和行为。它提供了 Material Design 的样式&#xff0c;并且兼容 Android 2.1&#xff08;API 级别 7&#xff09;及以上版本。 Theme.AppCompat&#…