Spring的@PreAuthorize注解自定義權(quán)限校驗(yàn)詳解
利用@PreAuthorize注解自定義權(quán)限校驗(yàn)
使用場(chǎng)景:
由于項(xiàng)目中,需要對(duì)外開(kāi)放接口,要求做請(qǐng)求頭校驗(yàn),不做其他權(quán)限控制.所以準(zhǔn)備對(duì)開(kāi)放的接口全部放行,不做登錄校驗(yàn).想到之前用這個(gè)注解來(lái)實(shí)現(xiàn)管理后臺(tái)的權(quán)限校驗(yàn),所以為了方便在需要對(duì)外開(kāi)放的接口貼上注解即可.記錄一下實(shí)現(xiàn)過(guò)程.
- 開(kāi)啟@EnableGlobalMethodSecurity(prePostEnabled = true)注解, 在繼承 WebSecurityConfigurerAdapter 這個(gè)類(lèi)的類(lèi)上面貼上這個(gè)注解.并且prePostEnabled設(shè)置為true,@PreAuthorize這個(gè)注解才能生效,SpringSecurity默認(rèn)是關(guān)閉注解功能的.
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {....}
- 編寫(xiě)自定義的鑒權(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;
}
}
- 創(chuàng)建自定義異常類(lèi)
public class SginCheckException extends BaseException {
public SginCheckException() {
super();
}
public SginCheckException(String message) {
super(SystemErrorType.SIGNATURE_ERROR,message);
}
}
- 在統(tǒng)一異常處理類(lèi)里面捕獲異常類(lèi)并做對(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);
}
}
- 最后就是在需要鑒權(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é)束語(yǔ):
當(dāng)然這個(gè)注解還有很多用法.我只是記錄一下我的使用方法.不喜勿噴.
到此這篇關(guān)于Spring的@PreAuthorize注解自定義權(quán)限校驗(yàn)詳解的文章就介紹到這了,更多相關(guān)@PreAuthorize注解自定義權(quán)限校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的Semaphore計(jì)數(shù)信號(hào)量詳細(xì)解析
這篇文章主要介紹了Java中的Semaphore計(jì)數(shù)信號(hào)量詳細(xì)解析,Semaphore?是一個(gè)計(jì)數(shù)信號(hào)量,必須由獲取它的線程釋放,常用于限制可以訪問(wèn)某些資源的線程數(shù)量,例如通過(guò)?Semaphore?限流,需要的朋友可以參考下2023-11-11
使用SSM+Layui+Bootstrap實(shí)現(xiàn)汽車(chē)維保系統(tǒng)的示例代碼
本文主要實(shí)現(xiàn)對(duì)汽車(chē)維修廠的信息化管理功能,。實(shí)現(xiàn)的主要功能包含用戶(hù)管理、配置管理、汽車(chē)管理、故障管理、供應(yīng)商管理、配件管理、維修訂單管理、統(tǒng)計(jì)信息、公告管理、個(gè)人信息管理,感興趣的可以了解一下2021-12-12
關(guān)于Java實(shí)現(xiàn)HttpServer模擬前端接口調(diào)用
這篇文章主要介紹了關(guān)于Java實(shí)現(xiàn)Http?Server模擬前端接口調(diào)用,Http?協(xié)議是建立在?TCP?協(xié)議之上的協(xié)議,所以能用?TCP?來(lái)自己模擬一個(gè)簡(jiǎn)單的?Http?Server?當(dāng)然是可以的,需要的朋友可以參考下2023-04-04
解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法
這篇文章主要為大家詳細(xì)介紹了解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06

