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注解自定义权限校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring如何解决单例bean线程不安全的问题

    Spring如何解决单例bean线程不安全的问题

    这篇文章主要介绍了Spring如何解决单例bean线程不安全的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java图文分析之继承内存布局

    Java图文分析之继承内存布局

    这篇文章主要介绍了Java图文分析之继承内存布局,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的朋友可以参考一下
    2022-09-09
  • Java死锁代码实例及产生死锁必备的四个条件

    Java死锁代码实例及产生死锁必备的四个条件

    这篇文章主要介绍了Java死锁代码实例及产生死锁必备的四个条件,Java 发生死锁的根本原因是,在申请锁时发生了交叉闭环申请,synchronized在开发中最好不要嵌套使用,容易导致死锁,需要的朋友可以参考下
    2024-01-01
  • 详解利用SpringCloud搭建一个最简单的微服务框架

    详解利用SpringCloud搭建一个最简单的微服务框架

    这篇文章主要介绍了详解利用SpringCloud搭建一个最简单的微服务框架,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Spring依赖注入的三种方式详解

    Spring依赖注入的三种方式详解

    这篇文章主要给大家介绍了三种Spring依赖注入的方式, settter方法注入,构造器注入以及变量(filed) 注入这三种方式,文章通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法

    SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法

    本文主要介绍了SpringBoot项目改为SpringCloud项目使用nacos作为注册中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • springboot Mongodb的集成与使用实例详解

    springboot Mongodb的集成与使用实例详解

    这篇文章主要介绍了springboot Mongodb的集成与使用实例详解,需要的朋友可以参考下
    2018-04-04
  • Java时间轮算法的实现代码示例

    Java时间轮算法的实现代码示例

    本篇文章主要介绍了Java时间轮算法的实现代码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 基于JPA的Repository使用详解

    基于JPA的Repository使用详解

    这篇文章主要介绍了JPA的Repository使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 聊一聊Java反射

    聊一聊Java反射

    工作中哪些地方比较容易用到反射,这篇文章就为大家介绍了工作中常用到的Java反射,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论