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

 更新时间:2023年03月31日 11:02:36   作者:掉发的小王  
spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性,下面这篇文章主要给大家介绍了关于如何基于SpringSecurity的@PreAuthorize实现自定义权限校验方法的相关资料,需要的朋友可以参考下

一、前言

在我们一般的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'):容器内方法名称和参数

五、总结

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

到此这篇关于如何基于SpringSecurity的@PreAuthorize实现自定义权限校验方法的文章就介绍到这了,更多相关SpringSecurity自定义权限校验方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot全局异常处理解析

    Spring Boot全局异常处理解析

    这篇文章主要为大家详细介绍了Spring Boot全局异常处理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java结合uniapp实现验证码功能的示例详解

    Java结合uniapp实现验证码功能的示例详解

    UniApp 是一个基于 Vue.js 的跨平台应用开发框架,允许开发者使用统一的代码库来构建多平台应用,这篇文章将给大家介绍Java结合uniapp实现验证码功能,文中通过详细的代码示例讲解的非常详细,需要的朋友可以参考下
    2024-07-07
  • Java基于TCP协议的Socket通信

    Java基于TCP协议的Socket通信

    本文详细讲解了Java基于TCP协议的Socket通信,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Spring Boot与Docker部署实践

    Spring Boot与Docker部署实践

    这篇文章主要介绍了Spring Boot与Docker部署实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java漏桶算法的简单代码实例

    Java漏桶算法的简单代码实例

    这篇文章主要介绍了Java漏桶算法的简单代码实例,漏桶算法的意义在于能够平滑请求,不给下游服务造成过大压力,特别适用于突发流量或者定时任务拉取大量数据时,需要处理大量数据或者请求的场景,需要的朋友可以参考下
    2024-01-01
  • 详解springboot设置默认参数Springboot.setDefaultProperties(map)不生效解决

    详解springboot设置默认参数Springboot.setDefaultProperties(map)不生效解决

    这篇文章主要介绍了详解springboot设置默认参数Springboot.setDefaultProperties(map)不生效解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java Long类型对比分析

    Java Long类型对比分析

    这篇文章主要介绍了Java Long类型对比分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java反射如何有效的修改final属性值详解

    Java反射如何有效的修改final属性值详解

    最近在工作中遇到一个需求,要利用反射对修饰符为final的成员变量进行修改,所以这篇文章主要给大家介绍了关于Java反射如何有效的修改final属性值的相关资料,文中通过示例代码介绍的非常详细,对需要的朋友可以参考下。
    2017-08-08
  • java 通过cmd 调用命令启动tomcat的操作

    java 通过cmd 调用命令启动tomcat的操作

    这篇文章主要介绍了java 通过cmd 调用命令启动tomcat的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • IOC 容器启动和Bean实例化两个阶段详解

    IOC 容器启动和Bean实例化两个阶段详解

    这篇文章主要为大家介绍了IOC 容器启动和Bean实例化两个阶段详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论