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



目录
相关文章
|
11月前
|
安全 NoSQL Java
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤(二)
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
727 0
|
10月前
|
缓存 Java
Jwt使用Aop方式自定义权限注解认证
使用Aop前置通知方式, 在控制层上使用指定切面注解, 并赋予注解参数为访问接口所需角色权限代码, 进行身份认证和权限校验
71 0
|
1月前
|
数据库 数据安全/隐私保护
SpringSecurity请求授权规则配置与注解使用说明
SpringSecurity请求授权规则配置与注解使用说明
46 0
|
8月前
|
存储 NoSQL Java
SpringBoot自定义实现类似jwt权限验证效果
SpringBoot自定义实现类似jwt权限验证效果
60 0
|
11月前
|
存储 缓存 安全
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤(一)
SpringBoot3整合SpringSecurity,实现自定义接口权限过滤
719 0
|
前端开发 Java 数据库
SpringBoot分组校验及自定义校验注解
在日常的开发中,参数校验是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。在此之前写过一篇SpringBoot统一参数校验主要介绍了一些简单的校验方法。而这篇则是介绍一些进阶的校验方式。比如说:在某个接口编写的过程中肯定会遇到,当xxType值为A,paramA值必传。xxType值为B,paramB值必须传。对于这样的,通常的做法就是在controller加上各种if判断。显然这样的代码是不够优雅的,而分组校验及自定义参数校验,就是来解决这个问题的。
SpringMVC自定义注解验证登陆拦截
这里业务场景需要,所有的请求都需要登录验证。个别通用业务不需要登录拦截。注解方式替代原有的if判断。
SpringMVC自定义注解验证登陆拦截
|
SQL 安全 Java
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目的需求来决定使用哪一种.
SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
|
前端开发 安全 Java
SpringSecurity权限控制和注销
SpringSecurity权限控制和注销
|
前端开发 Java 数据库
SpringSecurity非注解方式进行权限控制
写在前面 本文是使用SpringSecurity进行权限控制,此次项目没有采用SpringSecurity的注解形式,因为当你使用SpringSecurity注解形式进行权限控制的时候,当你给一个接口定义了注解过后,那么这个接口所对应的角色也就固定了,如果要修改启动的项目,只有重新修改代码,然后进行部署,本次演示是通过查询数据权限来获取对应的角色来进行匹配是否放行
212 2
SpringSecurity非注解方式进行权限控制

热门文章

最新文章