You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by he...@apache.org on 2022/06/24 07:26:55 UTC

[inlong] branch master updated: [INLONG-4684][Manager] Add enums validation for controller (#4744)

This is an automated email from the ASF dual-hosted git repository.

healchow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 7370a65fc [INLONG-4684][Manager] Add enums validation for controller (#4744)
7370a65fc is described below

commit 7370a65fca2d725701e484127a269a0323063cb4
Author: leosanqing <st...@qq.com>
AuthorDate: Fri Jun 24 15:26:48 2022 +0800

    [INLONG-4684][Manager] Add enums validation for controller (#4744)
---
 .../IntListValuable.java}                          | 18 +++++--
 .../StringListValuable.java}                       | 18 +++++--
 .../inlong/manager/common/enums/UserTypeEnum.java  | 23 ++++++--
 .../inlong/manager/common/pojo/user/LoginUser.java |  8 ++-
 .../inlong/manager/common/pojo/user/UserInfo.java  | 27 +++++-----
 .../manager/common/pojo/user/UserRoleCode.java     |  4 +-
 .../manager/common/validation/InEnumInt.java       | 51 ++++++++++++++++++
 .../common/validation/InEnumIntValidator.java      | 63 ++++++++++++++++++++++
 .../manager/common/validation/InEnumString.java    | 51 ++++++++++++++++++
 .../common/validation/InEnumStringValidator.java   | 62 +++++++++++++++++++++
 .../manager/service/core/impl/UserServiceImpl.java |  4 +-
 .../manager/web/auth/WebAuthorizingRealm.java      |  2 +-
 .../web/config/ControllerExceptionHandler.java     |  4 +-
 .../manager/web/controller/AnnoController.java     |  6 +--
 .../web/controller/InlongGroupController.java      |  2 +-
 .../manager/web/controller/UserController.java     |  7 +--
 .../manager/web/controller/AnnoControllerTest.java | 58 ++++++++++++++++++--
 17 files changed, 363 insertions(+), 45 deletions(-)

diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/IntListValuable.java
similarity index 72%
copy from inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
copy to inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/IntListValuable.java
index c9a5b0b15..dbdaf7a09 100644
--- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/IntListValuable.java
@@ -15,13 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.common.pojo.user;
+package org.apache.inlong.manager.common.enums;
+
+import java.util.List;
 
 /**
- * User role code.
+ * An interface that generates a list of Int
+ * e.g. for generating enum values
  */
-public class UserRoleCode {
+public interface IntListValuable {
+
+    /**
+     * generates a list of Int
+     *
+     * @return list of Integer values
+     */
+    List<Integer> valueList();
 
-    public static final String ADMIN = "Admin";
-    public static final String OPERATOR = "Operator";
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/StringListValuable.java
similarity index 71%
copy from inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
copy to inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/StringListValuable.java
index c9a5b0b15..edfb8c85d 100644
--- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/StringListValuable.java
@@ -15,13 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.common.pojo.user;
+package org.apache.inlong.manager.common.enums;
+
+import java.util.List;
 
 /**
- * User role code.
+ * An interface that generates a list of String
+ * e.g. for generating enum values
  */
-public class UserRoleCode {
+public interface StringListValuable {
+
+    /**
+     * generates a list of String
+     *
+     * @return list of String values
+     */
+    List<String> valueList();
 
-    public static final String ADMIN = "Admin";
-    public static final String OPERATOR = "Operator";
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java
index 25d2e2f6c..d89af2581 100644
--- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/UserTypeEnum.java
@@ -21,14 +21,22 @@ import com.fasterxml.jackson.annotation.JsonValue;
 import lombok.Getter;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * User type enum
  */
-public enum UserTypeEnum {
+public enum UserTypeEnum implements IntListValuable {
 
-    Admin(0), // has all privilege
-    Operator(1), // No privilege to manage the system
+    /**
+     * Has all privilege
+     */
+    ADMIN(0),
+    /**
+     * No privilege to manage the system
+     */
+    OPERATOR(1),
     ;
 
     @Getter
@@ -39,6 +47,10 @@ public enum UserTypeEnum {
         this.code = code;
     }
 
+    private static final List<Integer> ARRAYS = Arrays.stream(values())
+            .map(UserTypeEnum::getCode)
+            .collect(Collectors.toList());
+
     public static UserTypeEnum parse(Integer value) {
         return Arrays.stream(UserTypeEnum.class.getEnumConstants())
                 .filter(x -> x.getCode().equals(value))
@@ -46,4 +58,9 @@ public enum UserTypeEnum {
                 .orElse(null);
     }
 
+    @Override
+    public List<Integer> valueList() {
+        return ARRAYS;
+    }
+
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/LoginUser.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/LoginUser.java
index 23c0ee09f..4583dfe55 100644
--- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/LoginUser.java
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/LoginUser.java
@@ -21,6 +21,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
+
 /**
  * Login user and password
  */
@@ -28,9 +30,11 @@ import lombok.Data;
 @ApiModel("Login user and password")
 public class LoginUser {
 
-    @ApiModelProperty("username")
+    @NotBlank
+    @ApiModelProperty(value = "username", required = true)
     private String username;
 
-    @ApiModelProperty("password")
+    @NotBlank
+    @ApiModelProperty(value = "password", required = true)
     private String password;
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserInfo.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserInfo.java
index 10b6eacbb..cc6f9dadc 100644
--- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserInfo.java
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserInfo.java
@@ -24,7 +24,11 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.inlong.manager.common.enums.UserTypeEnum;
-import org.apache.inlong.manager.common.util.Preconditions;
+import org.apache.inlong.manager.common.validation.InEnumInt;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 
 /**
  * User info, including username, password, etc.
@@ -42,23 +46,22 @@ public class UserInfo {
      * user type
      * {@link UserTypeEnum}
      */
-    @ApiModelProperty("type: 0 - manager, 1 - operator")
+    @NotNull
+    @InEnumInt(UserTypeEnum.class)
+    @ApiModelProperty(value = "type: 0 - manager, 1 - operator", required = true)
     private Integer type;
 
-    @ApiModelProperty("username")
+    @NotBlank
+    @ApiModelProperty(value = "username", required = true)
     private String username;
 
-    @ApiModelProperty("password")
+    @NotBlank
+    @ApiModelProperty(value = "password", required = true)
     private String password;
 
-    @ApiModelProperty("valid days")
+    @NotNull
+    @Min(1)
+    @ApiModelProperty(value = "valid days", required = true)
     private Integer validDays;
 
-    public void checkValid() {
-        Preconditions.checkNotEmpty(username, "username should not be empty");
-        Preconditions.checkNotEmpty(password, "password should not be empty");
-        Preconditions.checkNotNull(validDays, "valid days should not be empty");
-        UserTypeEnum userType = UserTypeEnum.parse(type);
-        Preconditions.checkNotNull(userType, "user type incorrect");
-    }
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
index c9a5b0b15..aea10be85 100644
--- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/pojo/user/UserRoleCode.java
@@ -22,6 +22,6 @@ package org.apache.inlong.manager.common.pojo.user;
  */
 public class UserRoleCode {
 
-    public static final String ADMIN = "Admin";
-    public static final String OPERATOR = "Operator";
+    public static final String ADMIN = "ADMIN";
+    public static final String OPERATOR = "OPERATE";
 }
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumInt.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumInt.java
new file mode 100644
index 000000000..46dd490c7
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumInt.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.validation;
+
+import org.apache.inlong.manager.common.enums.IntListValuable;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({
+        ElementType.METHOD,
+        ElementType.FIELD,
+        ElementType.ANNOTATION_TYPE,
+        ElementType.CONSTRUCTOR,
+        ElementType.PARAMETER,
+        ElementType.TYPE_USE
+})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Constraint(validatedBy = InEnumIntValidator.class)
+public @interface InEnumInt {
+
+    Class<? extends IntListValuable> value();
+
+    String message() default "must in {value}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumIntValidator.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumIntValidator.java
new file mode 100644
index 000000000..0f5b61646
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumIntValidator.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.validation;
+
+import com.google.common.base.Joiner;
+import org.apache.inlong.manager.common.enums.IntListValuable;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Check whether the incoming Integer type parameter is in the corresponding enum value
+ */
+public class InEnumIntValidator implements ConstraintValidator<InEnumInt, Integer> {
+
+    private List<Integer> values;
+
+    @Override
+    public void initialize(InEnumInt annotation) {
+        IntListValuable[] values = annotation.value().getEnumConstants();
+        if (values.length == 0) {
+            this.values = Collections.emptyList();
+        } else {
+            this.values = values[0].valueList();
+        }
+    }
+
+    @Override
+    public boolean isValid(Integer value, ConstraintValidatorContext context) {
+        if (value == null || values.contains(value)) {
+            return true;
+        }
+
+        // disable default msg
+        context.disableDefaultConstraintViolation();
+        // Add the error message again
+        context.buildConstraintViolationWithTemplate(
+                        context.getDefaultConstraintMessageTemplate()
+                                .replace("{value}", Joiner.on(",").join(values))
+                )
+                .addConstraintViolation();
+        return false;
+    }
+
+}
+
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumString.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumString.java
new file mode 100644
index 000000000..643e23c52
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumString.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.validation;
+
+import org.apache.inlong.manager.common.enums.StringListValuable;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({
+        ElementType.METHOD,
+        ElementType.FIELD,
+        ElementType.ANNOTATION_TYPE,
+        ElementType.CONSTRUCTOR,
+        ElementType.PARAMETER,
+        ElementType.TYPE_USE
+})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Constraint(validatedBy = InEnumIntValidator.class)
+public @interface InEnumString {
+
+    Class<? extends StringListValuable> value();
+
+    String message() default "must in {value}";
+
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumStringValidator.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumStringValidator.java
new file mode 100644
index 000000000..d238ca29c
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/validation/InEnumStringValidator.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.validation;
+
+import com.google.common.base.Joiner;
+import org.apache.inlong.manager.common.enums.StringListValuable;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Check whether the incoming String type parameter is in the corresponding enum value
+ */
+public class InEnumStringValidator implements ConstraintValidator<InEnumString, String> {
+
+    private List<String> values;
+
+    @Override
+    public void initialize(InEnumString annotation) {
+        StringListValuable[] values = annotation.value().getEnumConstants();
+        if (values.length == 0) {
+            this.values = Collections.emptyList();
+        } else {
+            this.values = values[0].valueList();
+        }
+    }
+
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        if (value == null || values.contains(value)) {
+            return true;
+        }
+
+        // disable default msg
+        context.disableDefaultConstraintViolation();
+        context.buildConstraintViolationWithTemplate(
+                context.getDefaultConstraintMessageTemplate()
+                        .replace("{value}", Joiner.on(",").join(values))
+                )
+                .addConstraintViolation();
+        return false;
+    }
+
+}
+
diff --git a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
index 7f003f9c4..e1e6c2e1b 100644
--- a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
+++ b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/core/impl/UserServiceImpl.java
@@ -104,7 +104,7 @@ public class UserServiceImpl implements UserService {
 
         // Whether the current user is an administrator
         UserEntity currentUserEntity = getByName(currentUser);
-        Preconditions.checkTrue(currentUserEntity.getAccountType().equals(UserTypeEnum.Admin.getCode()),
+        Preconditions.checkTrue(currentUserEntity.getAccountType().equals(UserTypeEnum.ADMIN.getCode()),
                 "The current user is not a manager and does not have permission to update users");
 
         UserEntity entity = userMapper.selectByPrimaryKey(userInfo.getId());
@@ -142,7 +142,7 @@ public class UserServiceImpl implements UserService {
 
         // Whether the current user is an administrator
         UserEntity entity = getByName(currentUser);
-        Preconditions.checkTrue(entity.getAccountType().equals(UserTypeEnum.Admin.getCode()),
+        Preconditions.checkTrue(entity.getAccountType().equals(UserTypeEnum.ADMIN.getCode()),
                 "The current user is not a manager and does not have permission to delete users");
 
         userMapper.deleteByPrimaryKey(userId);
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
index 174ad36c1..37f09b480 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/auth/WebAuthorizingRealm.java
@@ -60,7 +60,7 @@ public class WebAuthorizingRealm extends AuthorizingRealm {
         UserDetail userDetail = new UserDetail();
         userDetail.setUserName(username);
         userDetail.setRoles(Sets.newHashSet(userEntity.getAccountType() == 0
-                ? UserTypeEnum.Admin.name() : UserTypeEnum.Operator.name()));
+                ? UserTypeEnum.ADMIN.name() : UserTypeEnum.OPERATOR.name()));
         return new SimpleAuthenticationInfo(userDetail, userEntity.getPassword(), getName());
     }
 
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/config/ControllerExceptionHandler.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/config/ControllerExceptionHandler.java
index dfe7623ea..c79659457 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/config/ControllerExceptionHandler.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/config/ControllerExceptionHandler.java
@@ -73,7 +73,7 @@ public class ControllerExceptionHandler {
         StringBuilder builder = new StringBuilder();
         BindingResult result = e.getBindingResult();
         result.getFieldErrors().forEach(
-                error -> builder.append(error.getField()).append(":")
+                error -> builder.append(error.getField()).append(": ")
                         .append(error.getDefaultMessage()).append(System.lineSeparator())
         );
 
@@ -100,7 +100,7 @@ public class ControllerExceptionHandler {
 
         StringBuilder builder = new StringBuilder();
         e.getBindingResult().getFieldErrors().forEach(
-                error -> builder.append(error.getField()).append(":")
+                error -> builder.append(error.getField()).append(": ")
                         .append(error.getDefaultMessage()).append(System.lineSeparator())
         );
         return Response.fail(builder.toString());
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
index b3b7480b6..6840f118e 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/AnnoController.java
@@ -29,6 +29,7 @@ import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.subject.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -48,7 +49,7 @@ public class AnnoController {
     UserService userService;
 
     @PostMapping("/login")
-    public Response<String> login(@RequestBody LoginUser loginUser) {
+    public Response<String> login(@Validated @RequestBody LoginUser loginUser) {
 
         Subject subject = SecurityUtils.getSubject();
         UsernamePasswordToken token = new UsernamePasswordToken(loginUser.getUsername(), loginUser.getPassword());
@@ -59,8 +60,7 @@ public class AnnoController {
     }
 
     @PostMapping("/doRegister")
-    public Response<Boolean> doRegister(@RequestBody UserInfo userInfo) {
-        userInfo.checkValid();
+    public Response<Boolean> doRegister(@Validated @RequestBody UserInfo userInfo) {
         return Response.success(userService.create(userInfo));
     }
 
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
index 8310aaa51..918917f13 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongGroupController.java
@@ -78,7 +78,7 @@ public class InlongGroupController {
     @ApiOperation(value = "Get inlong group list by paginating")
     public Response<PageInfo<InlongGroupListResponse>> listByCondition(@RequestBody InlongGroupPageRequest request) {
         request.setCurrentUser(LoginUserUtils.getLoginUserDetail().getUserName());
-        request.setIsAdminRole(LoginUserUtils.getLoginUserDetail().getRoles().contains(UserTypeEnum.Admin.name()));
+        request.setIsAdminRole(LoginUserUtils.getLoginUserDetail().getRoles().contains(UserTypeEnum.ADMIN.name()));
         return Response.success(groupService.listByPage(request));
     }
 
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
index 748cb1bd5..27e8bec93 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/UserController.java
@@ -31,6 +31,7 @@ import org.apache.inlong.manager.common.util.LoginUserUtils;
 import org.apache.inlong.manager.service.core.UserService;
 import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -43,6 +44,7 @@ import org.springframework.web.bind.annotation.RestController;
 /**
  * User related interface
  */
+@Validated
 @RestController
 @RequestMapping("/user")
 @Api(tags = "User - Auth")
@@ -60,8 +62,7 @@ public class UserController {
     @PostMapping("/register")
     @ApiOperation(value = "Register user")
     @RequiresRoles(value = UserRoleCode.ADMIN)
-    public Response<Boolean> register(@RequestBody UserInfo userInfo) {
-        userInfo.checkValid();
+    public Response<Boolean> register(@Validated @RequestBody UserInfo userInfo) {
         return Response.success(userService.create(userInfo));
     }
 
@@ -73,7 +74,7 @@ public class UserController {
 
     @PostMapping("/update")
     @ApiOperation(value = "Update user info")
-    public Response<Integer> update(@RequestBody UserInfo userInfo) {
+    public Response<Integer> update(@Validated @RequestBody UserInfo userInfo) {
         String currentUser = LoginUserUtils.getLoginUserDetail().getUserName();
         return Response.success(userService.update(userInfo, currentUser));
     }
diff --git a/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java b/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
index 32b996033..fd91352ea 100644
--- a/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
+++ b/inlong-manager/manager-web/src/test/java/org/apache/inlong/manager/web/controller/AnnoControllerTest.java
@@ -35,6 +35,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 
 class AnnoControllerTest extends WebBaseTest {
 
+    // Password contains uppercase and lowercase numeric special characters
+    private static final String TEST_PWD = "test_#$%%Y@UI$123";
+
     @Test
     void testLogin() throws Exception {
         LoginUser loginUser = new LoginUser();
@@ -56,12 +59,34 @@ class AnnoControllerTest extends WebBaseTest {
         Assertions.assertTrue(SecurityUtils.getSubject().isAuthenticated());
     }
 
+    @Test
+    void testLoginFailByWrongPwd() throws Exception {
+        LoginUser loginUser = new LoginUser();
+        loginUser.setUsername("admin");
+        // Wrong pwd
+        loginUser.setPassword("test_wrong_pwd");
+
+        MvcResult mvcResult = mockMvc.perform(
+                        post("/anno/login")
+                                .content(JsonUtils.toJsonString(loginUser))
+                                .contentType(MediaType.APPLICATION_JSON_UTF8)
+                                .accept(MediaType.APPLICATION_JSON)
+                )
+                .andExpect(status().isOk())
+                .andReturn();
+
+        Response<String> response = getResBody(mvcResult, String.class);
+        Assertions.assertFalse(response.isSuccess());
+        Assertions.assertEquals("Username or password was incorrect, or the account has expired",
+                response.getErrMsg());
+    }
+
     @Test
     void testRegister() throws Exception {
         UserInfo userInfo = UserInfo.builder()
                 .username("test_name")
-                .password("test!!!!2343434")
-                .type(UserTypeEnum.Admin.getCode())
+                .password(TEST_PWD)
+                .type(UserTypeEnum.ADMIN.getCode())
                 .validDays(88888)
                 .build();
 
@@ -81,9 +106,10 @@ class AnnoControllerTest extends WebBaseTest {
     @Test
     void testRegisterFailByExistName() throws Exception {
         UserInfo userInfo = UserInfo.builder()
+                // Username already exists in the init sql
                 .username("admin")
-                .password("test!!!!2343434")
-                .type(UserTypeEnum.Admin.getCode())
+                .password(TEST_PWD)
+                .type(UserTypeEnum.ADMIN.getCode())
                 .validDays(88888)
                 .build();
 
@@ -118,4 +144,28 @@ class AnnoControllerTest extends WebBaseTest {
         Assertions.assertFalse(SecurityUtils.getSubject().isAuthenticated());
     }
 
+    @Test
+    void testRegisterFailByInvalidType() throws Exception {
+        UserInfo userInfo = UserInfo.builder()
+                .username("admin11")
+                .password(TEST_PWD)
+                // invalidType
+                .type(3)
+                .validDays(88888)
+                .build();
+
+        MvcResult mvcResult = mockMvc.perform(
+                        post("/anno/doRegister")
+                                .content(JsonUtils.toJsonString(userInfo))
+                                .contentType(MediaType.APPLICATION_JSON_UTF8)
+                                .accept(MediaType.APPLICATION_JSON)
+                )
+                .andExpect(status().isOk())
+                .andReturn();
+
+        Response<Boolean> resBody = getResBody(mvcResult, Boolean.class);
+        Assertions.assertFalse(resBody.isSuccess());
+        Assertions.assertEquals("type: must in 0,1\n", resBody.getErrMsg());
+    }
+
 }