江景:SpringBoot OAuth2.0 使用短信验证码登录授权zhuanlan.zhihu.com
SpringBoot OAuth2.0 封装登录、刷新令牌接口
江景:SpringBoot OAuth2.0 封装登录、刷新令牌接口zhuanlan.zhihu.com
保证校验接口传的参数是合法的,可以使用 JSR-303 、 AOP 的方式对接受的参数进行校验处理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
@Data
public class SmsCodeVO {
@NotBlank(message = "手机号码不能为空")
private String phone;
@NotBlank(message = "短信类型不能为空")
private String type;
}
@RestController
@RequestMapping(value = "/api/v1/sms")
@Slf4j
public class SmsCodeController {
@Resource
private SmsCodeSenderService smsCodeSenderService;
@PostMapping("/send")
public R<?> sendSmsCode(@Valid SmsCodeVO smsCodeVO, BindingResult result) {
return R.ok(smsCodeSenderService.sendSmsCode(smsCodeVO));
}
}
@Aspect
@Component
@Order(2)
public class BindingResultAspect {
// 切入点
// 切入点表达式 对 com.moose.operator.web.controller 包名下的任意类任意方法都处理
@Pointcut("execution(public * com.moose.operator.web.controller.*.*(..))")
public void validateAnnotation() {
}
// 环绕通知处理切面结果 ProceedingJoinPoint
@Around("validateAnnotation()")
public Object doAround(ProceedingJoinPoint point) throws Throwable {
Object[] args = point.getArgs();
for (Object arg : args) {
if (arg instanceof BindingResult) {
// 可以拿到 接口定义 BindingResult,对 BindingResult 进行细粒度处理
BindingResult result = (BindingResult) arg;
if (result.hasErrors()) {
FieldError fieldError = result.getFieldError();
String message = ResultCode.PARAMS_VALIDATE_FAIL.getMessage();
Integer code = ResultCode.PARAMS_VALIDATE_FAIL.getCode();
if (ObjectUtils.isNotEmpty(fieldError)) {
message = fieldError.getDefaultMessage();
}
// 抛给全局异常捕获处理
throw new BusinessException(message, code);
}
}
}
return point.proceed();
}
}
localhost:7000/api/v1/sms/send?phone=&type=sms_login
/**
* @author taohua
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Constraint(validatedBy = {ValueInValidator.class})
public @interface ValueIn {
Class<?> value();
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
/**
* @author taohua
*/
@Slf4j
public class ValueInValidator implements ConstraintValidator<ValueIn, Object>, Annotation {
private final List<Object> values = new ArrayList<>();
@Override
public void initialize(ValueIn valueIn) {
Class<?> clz = valueIn.value();
Object[] objectArr = clz.getEnumConstants();
try {
Method method = clz.getMethod("getValue");
Object value = null;
for (Object obj : objectArr) {
value = method.invoke(obj);
values.add(value);
}
} catch (Exception e) {
log.error("[处理枚举校验异常]", e);
}
}
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
if (value instanceof String) {
return values.contains(value);
}
return Boolean.FALSE;
}
}
@NotBlank(message = "短信类型不能为空")
@ValueIn(value = SmsCodeEnum.class, message = "短信类型不正确")
private String type;
/**
* @author taohua
*/
public enum SmsCodeEnum {
/**
* 注册
*/
REGISTER(SmsTypeConstant.REGISTER),
/**
* sms login
*/
SMS_LOGIN(SmsTypeConstant.SMS_LOGIN),
/**
* reset phone number
*/
RESET_PHONE(SmsTypeConstant.RESET_PHONE),
/**
* 重置密码
*/
RESET_PASSWORD(SmsTypeConstant.RESET_PASSWORD);
private final String value;
SmsCodeEnum(String value) {
this.value = value;
}
public static boolean isExist(String value) {
if (StringUtils.isEmpty(value)) {
return Boolean.FALSE;
}
for (SmsCodeEnum smsCodeEnum : SmsCodeEnum.values()) {
if (StringUtils.equals(smsCodeEnum.value, value)) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
public String getValue() {
return value;
}
}
public interface SmsTypeConstant {
String REGISTER = "register";
String SMS_LOGIN = "sms_login";
String RESET_PHONE = "reset_phone";
String RESET_PASSWORD = "reset_password";
}
源码地址:江景/moose
原网址: 访问
创建于: 2021-07-12 14:10:35
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论