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

简介: 利用@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);
   }
}
复制代码


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



目录
相关文章
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
606 0
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
501 1
|
安全 前端开发 Java
Spring Security 自定义异常失效?从源码分析到解决方案
Spring Security 自定义异常失效?从源码分析到解决方案
|
安全 Java 开发者
Spring Security自定义认证异常和授权异常
Spring Security自定义认证异常和授权异常
1419 4
|
安全 搜索推荐 Java
SpringSecurity扩展用户身份信息(UserDetails)的方式
通过上述步骤,你就能在Spring Security中扩展 `UserDetails`,进而实现更加个性化和复杂的用户认证和授权机制。记住,在添加更多字段时,保持系统安全性的同时,也需要考虑到用户隐私的保护。
1371 1
|
NoSQL Java Redis
Spring Boot集成Redisson详细介绍
Redisson是一个用于Java的分布式和高可用的Java对象的框架,它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson,并展示一些基本用法。
1976 2
Spring Boot集成Redisson详细介绍
|
存储 安全 Java
深入理解Spring Security授权机制原理
在Spring Security权限框架里,若要对后端http接口实现权限授权控制,有两种实现方式。一种是基于注解方法级的鉴权,其中,注解方式又有@Secured和@PreAuthorize两种。
311 0
|
前端开发 Java 数据安全/隐私保护
Spring Boot3自定义异常及全局异常捕获
Spring Boot3自定义异常及全局异常捕获
1697 1
|
Java Nacos 网络架构
SpringCloud Gateway的使用 + Nacos动态路由
SpringCloud Gateway的使用 + Nacos动态路由