如何利用@PreAuthorize注解自定義權(quán)限校驗(yàn)
利用@PreAuthorize注解自定義權(quán)限校驗(yàn)
使用場(chǎng)景
由于項(xiàng)目中,需要對(duì)外開放接口,要求做請(qǐng)求頭校驗(yàn),不做其他權(quán)限控制.所以準(zhǔn)備對(duì)開放的接口全部放行,不做登錄校驗(yàn).想到之前用這個(gè)注解來(lái)實(shí)現(xiàn)管理后臺(tái)的權(quán)限校驗(yàn),所以為了方便在需要對(duì)外開放的接口貼上注解即可.記錄一下實(shí)現(xiàn)過(guò)程.
1.開啟@EnableGlobalMethodSecurity(prePostEnabled = true)注解
在繼承 WebSecurityConfigurerAdapter 這個(gè)類的類上面貼上這個(gè)注解.并且prePostEnabled設(shè)置為true,@PreAuthorize這個(gè)注解才能生效,SpringSecurity默認(rèn)是關(guān)閉注解功能的。
@Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {....}
2.編寫自定義的鑒權(quán)方法
// service取名sc是方便注解調(diào)用 @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管理平臺(tái) PlatformManage platformManage = platformManageService.getOne(Wrappers.<PlatformManage>lambdaQuery().eq(PlatformManage::getSourcetype, appid)); if (platformManage == null) { log.error("平臺(tái)不存在:" + appid); //鑒權(quán)失敗拋出自定義異常 throw new SginCheckException(); } //校驗(yàn)簽名 String secretKey = platformManage.getPrivateKey(); MD5 md5 = new MD5(); String lowerCase = md5.getMD5ofStr(appid + secretKey + timestamp).toLowerCase(); if (!lowerCase.equals(signature)) { log.error("簽名校驗(yàn)失敗:" + "crm:" + lowerCase + ",接口:" + signature); //鑒權(quán)失敗拋出自定義異常 throw new SginCheckException(); } //如果鑒權(quán)成功不return true 會(huì)報(bào)錯(cuò). return true; } }
3.創(chuàng)建自定義異常類
public class SginCheckException extends BaseException { public SginCheckException() { super(); } public SginCheckException(String message) { super(SystemErrorType.SIGNATURE_ERROR,message); } }
4.在統(tǒng)一異常處理類里面捕獲異常類并做對(duì)應(yīng)處理
@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.最后就是在需要鑒權(quán)的接口上貼上注解
// 調(diào)用方法語(yǔ)法 @beanname.methodname() @ApiOperation(value = "會(huì)員注冊(cè)", notes = "會(huì)員注冊(cè)", httpMethod = "POST") @PostMapping("/register") @PreAuthorize("@sc.checkSgin()") public Result register(@RequestBody @Valid MemberRegisterParam memberRegisterParam, HttpServletRequest request) { log.error("會(huì)員注冊(cè):" + memberRegisterParam); return memberService.register(memberRegisterParam, request); }
總結(jié)
當(dāng)然這個(gè)注解還有很多用法,我只是記錄一下我的使用方法。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA實(shí)現(xiàn)往字符串中某位置加入一個(gè)字符串
這篇文章主要介紹了JAVA實(shí)現(xiàn)往字符串中某位置加入一個(gè)字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置
這篇文章主要為大家介紹了Java開啟JMX遠(yuǎn)程監(jiān)控的服務(wù)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05