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



目录
相关文章
|
安全 搜索推荐 Java
SpringSecurity扩展用户身份信息(UserDetails)的方式
通过上述步骤,你就能在Spring Security中扩展 `UserDetails`,进而实现更加个性化和复杂的用户认证和授权机制。记住,在添加更多字段时,保持系统安全性的同时,也需要考虑到用户隐私的保护。
1726 1
|
安全 Java 开发者
Spring Security自定义认证异常和授权异常
Spring Security自定义认证异常和授权异常
2048 4
|
安全 Java 数据库连接
Security自定义全局AuthenticationManager
Security自定义全局AuthenticationManager
948 1
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
1300 8
|
Kubernetes Shell Linux
将项目发布到 Homebrew 官方仓库
最近将 kubecm 推到了官方 homebrew-core 仓库,分享一下经验。
3035 0
|
Java 数据库 Spring
|
XML 安全 Java
【Spring专题】「实战系列」Spring Security技术实战之通过注解表达式控制方法权限
【Spring专题】「实战系列」Spring Security技术实战之通过注解表达式控制方法权限
660 0
【Spring专题】「实战系列」Spring Security技术实战之通过注解表达式控制方法权限
Springboot 使用Filter, 拦截器 执行了两次 问题剖析
Springboot 使用Filter, 拦截器 执行了两次 问题剖析
1198 1
Springboot 使用Filter, 拦截器 执行了两次 问题剖析
|
监控 Java Maven
微服务技术系列教程(10) - SpringBoot - 监控管理 - Admin-UI
微服务技术系列教程(10) - SpringBoot - 监控管理 - Admin-UI
346 0
|
存储 Java 数据库
三.SpringSecurity基础-认证原理
SpringSecurity基础-认证原理