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 数据库连接
Security自定义全局AuthenticationManager
Security自定义全局AuthenticationManager
923 1
|
5月前
|
安全 JavaScript Java
若依后台权限核心:Spring Security 认证授权详解
若依(RuoYi)框架整合 Spring Security 的具体实现方式,我会从核心原理、整合步骤、关键配置、实战示例四个维度,结合若依前后端分离版(Spring Boot + Vue)的特点,给出可直接落地的整合方案,帮你理解若依是如何基于 Spring Security 实现权限管控
486 4
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
812 1
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
1280 8
|
安全 搜索推荐 Java
SpringSecurity扩展用户身份信息(UserDetails)的方式
通过上述步骤,你就能在Spring Security中扩展 `UserDetails`,进而实现更加个性化和复杂的用户认证和授权机制。记住,在添加更多字段时,保持系统安全性的同时,也需要考虑到用户隐私的保护。
1700 1
|
监控 Java Maven
微服务技术系列教程(10) - SpringBoot - 监控管理 - Admin-UI
微服务技术系列教程(10) - SpringBoot - 监控管理 - Admin-UI
338 0
|
安全 Java 开发者
Spring Security自定义认证异常和授权异常
Spring Security自定义认证异常和授权异常
2022 4
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
1323 4
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
432 3
|
安全 JavaScript 前端开发
若依实现单点登录(解析请求链接中的参数做鉴权认证)
若依实现单点登录(解析请求链接中的参数做鉴权认证)