如何利用@PreAuthorize注解自定義權(quán)限校驗
利用@PreAuthorize注解自定義權(quán)限校驗
使用場景
由于項目中,需要對外開放接口,要求做請求頭校驗,不做其他權(quán)限控制.所以準備對開放的接口全部放行,不做登錄校驗.想到之前用這個注解來實現(xiàn)管理后臺的權(quán)限校驗,所以為了方便在需要對外開放的接口貼上注解即可.記錄一下實現(xiàn)過程.
1.開啟@EnableGlobalMethodSecurity(prePostEnabled = true)注解
在繼承 WebSecurityConfigurerAdapter 這個類的類上面貼上這個注解.并且prePostEnabled設(shè)置為true,@PreAuthorize這個注解才能生效,SpringSecurity默認是關(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管理平臺
PlatformManage platformManage = platformManageService.getOne(Wrappers.<PlatformManage>lambdaQuery().eq(PlatformManage::getSourcetype, appid));
if (platformManage == null) {
log.error("平臺不存在:" + appid);
//鑒權(quán)失敗拋出自定義異常
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);
//鑒權(quán)失敗拋出自定義異常
throw new SginCheckException();
}
//如果鑒權(quán)成功不return true 會報錯.
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)一異常處理類里面捕獲異常類并做對應(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)用方法語法 @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);
}總結(jié)
當然這個注解還有很多用法,我只是記錄一下我的使用方法。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 1.8使用數(shù)組實現(xiàn)循環(huán)隊列
這篇文章主要為大家詳細介紹了Java 1.8使用數(shù)組實現(xiàn)循環(huán)隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-10-10

