首页 > 其他分享 >基于SpringSecurity的@PreAuthorize实现自定义权限校验方法

基于SpringSecurity的@PreAuthorize实现自定义权限校验方法

时间:2022-08-23 09:57:40浏览次数:110  
标签:return String 自定义 PreAuthorize 校验 SpringSecurity 权限 public

一、前言

在我们一般的web系统中必不可少的就是权限的配置,也有经典的RBAC权限模型,是基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。当然SpringSecurity已经实现了权限的校验,但是不够灵活,我们可以自己写一下校验条件,从而更加的灵活!

很多开源框架中也是用的比较多,小编看了一下若依是自己写了一个注解实现的,pig是使用@PreAuthorize来实现自己的校验方式,小编以pig框架的为例。

二、SpringSecurity的@PreAuthorize

@PreAuthorize("hasAuthority('system:dept:list')")
@GetMapping("/hello")
public String hello (){
    return "hello";
}

我们进去源码方法中看看具体实现,我们进行模仿!

// 调用的方法
@Override
public final boolean hasAuthority(String authority) {
	return hasAnyAuthority(authority);
}

@Override
public final boolean hasAnyAuthority(String... authorities) {
	return hasAnyAuthorityName(null, authorities);
}

private boolean hasAnyAuthorityName(String prefix, String... roles) {
	Set<String> roleSet = getAuthoritySet();
	// 便利规则,看看是否有权限
	for (String role : roles) {
		String defaultedRole = getRoleWithDefaultPrefix(prefix, role);
		if (roleSet.contains(defaultedRole)) {
			return true;
		}
	}
	return false;
}

三、权限校验判断工具

@Component("pms")
public class PermissionService {

	/**
	 * 判断接口是否有xxx:xxx权限
	 * @param permission 权限
	 * @return {boolean}
	 */
	public boolean hasPermission(String permission) {
		if (StrUtil.isBlank(permission)) {
			return false;
		}
		Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
		if (authentication == null) {
			return false;
		}
		Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
		return authorities.stream().map(GrantedAuthority::getAuthority).filter(StringUtils::hasText)
				.anyMatch(x -> PatternMatchUtils.simpleMatch(permission, x));
	}

}

四、controller使用

@GetMapping("/page" )
@PreAuthorize("@pms.hasPermission('order_get')" )
public R getOrderInPage(Page page, OrderInRequest request) {
    return R.ok(orderInService.queryPage(page, request));
}

参数说明:

主要是采用SpEL表达式语法,
@pms:是一个我们自己配置的spring容器起的别名,能够正确的找到这个容器类;
hasPermission('order_get'):容器内方法名称和参数

五、总结

这样就完成了自定义校验,具体的校验可以自己在配置里进行修改,当然也可以自己写一个注解来进行自定义校验,可以参考若依的注解!


有缘人才可以看得到的哦!!!

点击访问!小编自己的网站,里面也是有很多好的文章哦!

标签:return,String,自定义,PreAuthorize,校验,SpringSecurity,权限,public
From: https://www.cnblogs.com/wang1221/p/16615100.html

相关文章

  • 微信小程序 自定义时间组件
    效果图代码xml<viewclass="date_bg_view"></view><viewclass="date_content"><viewclass="date_title"><van-iconname="cross"class="close"size="20p......
  • 时间格式化之获取自定义前半个小时的时间
    前几天做项目发现一个很费事的事情,时间格式化问题,如果我要获取 2022-08-2211:42:32 半个小时的时间应该怎么写?发现了newData()的getTime()的方法,可以吧时间转化成m......
  • U8 V13.0小白入门开发记录四-------------------初识自定义按钮开发
    今天是第一次刚接触U8自定按钮开发,本人也是一名小白。网上的资料太少,就连一些开发文档都找不到。通过零零碎碎的测试和调研。发下一些基础并记录在此,如有补充请在下方评论,......
  • WPF实现一个简单自定义管道
    先看效果  xaml代码<UserControlx:Class="WPF控件测试.Control.Pipeline"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"......
  • 通过 css3 自定义、修改滚动条的样式
    ::-webkit-scrollbar{width:4px!important;background-color:#012d58!important;border-radius:4px!important;}::-web......
  • 博客自定义右键
    相信大家在访问我的网站就发现我的右键已经更换,那么今天就介绍一下我的方法!1.首先在head.ejs内添加:<!--自定义右键--></script><styletype="text/css">a{text-d......
  • 博客园主题推荐awescnb-自定义
    后台-设置博客皮肤:Custom页面定制CSS代码#loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:......
  • Java学习 (26) 异常篇 异常结构&异常处理&自定义异常
    目录异常结构异常的定义异常的分类ErrorExpectionError和Exception的区别具体讲解视频异常处理捕获异常语法实例抛出异常语法实例具体讲解视频自定义异常具体讲解视频异常......
  • FineReport 自定义工具栏样式
    虽然FR界面的工具栏已经很商业化,很好看了,但是总会有那么些需求希望你可以修改工具栏的样式。修改工具栏样式的主要思路是:通过JQ选择器选中需要调整的元素,然后修改他们的......
  • 向QtableWidget中添加自定义widget崩溃异常: 0xC0000005
    1.问题描述想给QTableWidget添加QCheckBox,代码如下,tableWidget->setCellWidget老是崩溃(0x0F954E63(qwindows.dll)处(位于QStockView.exe中)引发的异常:0xC0000005: ),......