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

 更新时间:2024年12月27日 09:36:09   作者:Slavic_  
通过使用@PreAuthorize注解实现开放接口的权限校验,具体步骤包括开启全局方法安全、编写自定义鉴权方法、创建自定义异常类、在统一异常处理类中捕获异常并处理,最后在需要鉴权的接口上贴上注解

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

使用场景

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

1.开启@EnableGlobalMethodSecurity(prePostEnabled = true)注解

在继承 WebSecurityConfigurerAdapter 这个类的类上面贴上这个注解.并且prePostEnabled设置为true,@PreAuthorize这个注解才能生效,SpringSecurity默认是关闭注解功能的。

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {....}

2.编写自定义的鉴权方法

// 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;
    }
}

3.创建自定义异常类

public class SginCheckException extends BaseException {
    public SginCheckException() {
        super();
    }
    public SginCheckException(String message) {
        super(SystemErrorType.SIGNATURE_ERROR,message);
    }
}

4.在统一异常处理类里面捕获异常类并做对应处理

@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);
    }
}

5.最后就是在需要鉴权的接口上贴上注解

	// 调用方法语法  @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);
    }

总结

当然这个注解还有很多用法,我只是记录一下我的使用方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 实现浏览器下载文件及文件预览

    Java 实现浏览器下载文件及文件预览

    这篇文章主要介绍了Java 实现浏览器下载文件及文件预览,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java并发编程this逃逸问题总结

    Java并发编程this逃逸问题总结

    本篇文章给大家详细分析了Java并发编程this逃逸的问题分享,对此有需要的朋友参考下。
    2018-02-02
  • Python自定义计算时间过滤器实现过程解析

    Python自定义计算时间过滤器实现过程解析

    这篇文章主要介绍了Python自定义计算时间过滤器实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java 动态代理的多种实现方式

    Java 动态代理的多种实现方式

    动态代理实际上是JVM在运行期动态创建class字节码并加载的过程。本文讲述了Java 动态代理的多种实现方式,感兴趣的朋友可以选择适合自己的方式
    2021-06-06
  • SpringCloud之Feign远程接口映射的实现

    SpringCloud之Feign远程接口映射的实现

    这篇文章主要介绍了SpringCloud之Feign远程接口映射的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java线程创建的四种方式总结

    Java线程创建的四种方式总结

    这篇文章主要介绍了Java线程创建的四种方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 使用Spring注入Hibernate验证框架

    使用Spring注入Hibernate验证框架

    这篇文章主要介绍了使用Spring注入Hibernate验证框架方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java设计模式之模板方法详解

    Java设计模式之模板方法详解

    模板方法的概念:定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
    2022-07-07
  • Spring Cloud下基于OAUTH2认证授权的实现示例

    Spring Cloud下基于OAUTH2认证授权的实现示例

    这篇文章主要介绍了Spring Cloud下基于OAUTH2认证授权的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • SpringBoot+Redis布隆过滤器防恶意流量击穿缓存

    SpringBoot+Redis布隆过滤器防恶意流量击穿缓存

    本文主要介绍了SpringBoot+Redis布隆过滤器防恶意流量击穿缓存,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论