Spring的@PreAuthorize注解自定义权限校验详解

 更新时间:2023年11月06日 08:32:49   作者:Slavic_  
这篇文章主要介绍了Spring的@PreAuthorize注解自定义权限校验详解,由于项目中,需要对外开放接口,要求做请求头校验,不做其他权限控制,所以准备对开放的接口全部放行,不做登录校验,需要的朋友可以参考下

利用@PreAuthorize注解自定义权限校验

使用场景:

由于项目中,需要对外开放接口,要求做请求头校验,不做其他权限控制.所以准备对开放的接口全部放行,不做登录校验.想到之前用这个注解来实现管理后台的权限校验,所以为了方便在需要对外开放的接口贴上注解即可.记录一下实现过程.

  • 开启@EnableGlobalMethodSecurity(prePostEnabled = true)注解, 在继承 WebSecurityConfigurerAdapter 这个类的类上面贴上这个注解.并且prePostEnabled设置为true,@PreAuthorize这个注解才能生效,SpringSecurity默认是关闭注解功能的.
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {....}
  • 编写自定义的鉴权方法
// service取名sc是方便注解调用
@Service("sc")
@Slf4j
public class SginCheckService {

    @Autowired
    private PlatformManageService platformManageService;

    public boolean checkSgin(){
        HttpServletRequest request = UserContextHolder.getHttpServletRequest();
        String appid = request.getHeader("appid");
        String signature = request.getHeader("signature");
        String timestamp = request.getHeader("timestamp");
        //非crm管理平台
        PlatformManage platformManage = platformManageService.getOne(Wrappers.<PlatformManage>lambdaQuery().eq(PlatformManage::getSourcetype, appid));
        if (platformManage == null) {
            log.error("平台不存在:" + appid);
             //鉴权失败抛出自定义异常
            throw new SginCheckException();
        }
        //校验签名
        String secretKey = platformManage.getPrivateKey();
        MD5 md5 = new MD5();
        String lowerCase = md5.getMD5ofStr(appid + secretKey + timestamp).toLowerCase();
        if (!lowerCase.equals(signature)) {
            log.error("签名校验失败:" + "crm:" + lowerCase + ",接口:" + signature);
            //鉴权失败抛出自定义异常
            throw new SginCheckException();
        }
        //如果鉴权成功不return true 会报错.
        return true;
    }
}
  • 创建自定义异常类
public class SginCheckException extends BaseException {
    public SginCheckException() {
        super();
    }
    public SginCheckException(String message) {
        super(SystemErrorType.SIGNATURE_ERROR,message);
    }
}

  • 在统一异常处理类里面捕获异常类并做对应处理
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
	/**
     * 签名失败抛出异常处理
     *
     * @param e
     * @return
     */
    @ResponseBody
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ExceptionHandler(value = {SginCheckException.class})
    public Result sginCheckException(SginCheckException e) {
        return Result.fail(SystemErrorType.SIGNATURE_ERROR);
    }
}
  • 最后就是在需要鉴权的接口上贴上注解
	// 调用方法语法  @beanname.methodname() 
 	@ApiOperation(value = "会员注册", notes = "会员注册", httpMethod = "POST")
    @PostMapping("/register")
    @PreAuthorize("@sc.checkSgin()")
    public Result register(@RequestBody @Valid MemberRegisterParam memberRegisterParam, HttpServletRequest request) {
        log.error("会员注册:" + memberRegisterParam);
        return memberService.register(memberRegisterParam, request);
    }

结束语:

当然这个注解还有很多用法.我只是记录一下我的使用方法.不喜勿喷.

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

相关文章

  • Java中的Semaphore计数信号量详细解析

    Java中的Semaphore计数信号量详细解析

    这篇文章主要介绍了Java中的Semaphore计数信号量详细解析,Semaphore 是一个计数信号量,必须由获取它的线程释放,常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流,需要的朋友可以参考下
    2023-11-11
  • Java异常处理机制try catch流程详解

    Java异常处理机制try catch流程详解

    这篇文章主要介绍了Java异常处理机制try catch流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 使用SSM+Layui+Bootstrap实现汽车维保系统的示例代码

    使用SSM+Layui+Bootstrap实现汽车维保系统的示例代码

    本文主要实现对汽车维修厂的信息化管理功能,。实现的主要功能包含用户管理、配置管理、汽车管理、故障管理、供应商管理、配件管理、维修订单管理、统计信息、公告管理、个人信息管理,感兴趣的可以了解一下
    2021-12-12
  • 解读Spring框架中常用的设计模式

    解读Spring框架中常用的设计模式

    这篇文章主要介绍了解读Spring框架中常用的设计模式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java lock同步锁使用实例解析

    Java lock同步锁使用实例解析

    这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 关于Java实现HttpServer模拟前端接口调用

    关于Java实现HttpServer模拟前端接口调用

    这篇文章主要介绍了关于Java实现Http Server模拟前端接口调用,Http 协议是建立在 TCP 协议之上的协议,所以能用 TCP 来自己模拟一个简单的 Http Server 当然是可以的,需要的朋友可以参考下
    2023-04-04
  • 解决Hibernate4执行save()或update()无效问题的方法

    解决Hibernate4执行save()或update()无效问题的方法

    这篇文章主要为大家详细介绍了解决Hibernate4执行save()或update()无效问题的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java实现窗口刷新的示例代码

    java实现窗口刷新的示例代码

    本文主要介绍了java实现窗口刷新的示例代码,通过重写paintComponent()方法和调用repaint()方法,可以实现窗口的即时刷新,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • IDEA缓存配置等位置更改过程

    IDEA缓存配置等位置更改过程

    本文介绍了将IDEA移动到D盘的具体步骤,包括找到原存储目录、创建目标存储目录、关闭IDEA和JetBrainsToolbox、移动文件、删除原目录以及创建符号链接等步骤
    2026-04-04
  • 一篇文章带你入门java面向对象

    一篇文章带你入门java面向对象

    这篇文章主要介绍了Java语言面向对象编程思想之类与对象实例详解,还是十分不错的,这里给大家分享下,需要的朋友可以参考,希望能帮到你
    2021-08-08

最新评论