diff --git a/docker/postgres/docker-entrypoint-initdb/init.sql b/docker/postgres/docker-entrypoint-initdb/init.sql index b26520e29c..0251504e27 100755 --- a/docker/postgres/docker-entrypoint-initdb/init.sql +++ b/docker/postgres/docker-entrypoint-initdb/init.sql @@ -623,6 +623,7 @@ CREATE TABLE t_ds_user ( create_time timestamp DEFAULT NULL , update_time timestamp DEFAULT NULL , queue varchar(64) DEFAULT NULL , + state int DEFAULT 1 , PRIMARY KEY (id) ); @@ -749,7 +750,7 @@ ALTER TABLE t_ds_worker_server ALTER COLUMN id SET DEFAULT NEXTVAL('t_ds_worker_ -- Records of t_ds_user?user : admin , password : dolphinscheduler123 -INSERT INTO t_ds_user(user_name,user_password,user_type,email,phone,tenant_id,create_time,update_time) VALUES ('admin', '7ad2410b2f4c074479a8937a28a22b8f', '0', 'xxx@qq.com', 'xx', '0', '2018-03-27 15:48:50', '2018-10-24 17:40:22'); +INSERT INTO t_ds_user(user_name,user_password,user_type,email,phone,state,tenant_id,create_time,update_time) VALUES ('admin', '7ad2410b2f4c074479a8937a28a22b8f', '0', 'xxx@qq.com', 'xx', 1, '0', '2018-03-27 15:48:50', '2018-10-24 17:40:22'); -- Records of t_ds_alertgroup,dolphinscheduler warning group INSERT INTO t_ds_alertgroup(group_name,group_type,description,create_time,update_time) VALUES ('dolphinscheduler warning group', '0', 'dolphinscheduler warning group','2018-11-29 10:20:39', '2018-11-29 10:20:39'); diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java index 08d862e032..456d8c29c7 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java @@ -72,7 +72,8 @@ public class UsersController extends BaseController { @ApiImplicitParam(name = "tenantId", value = "TENANT_ID", dataType = "Int", example = "100"), @ApiImplicitParam(name = "queue", value = "QUEUE", dataType = "Int", example = "100"), @ApiImplicitParam(name = "email", value = "EMAIL", dataType = "Int", example = "100"), - @ApiImplicitParam(name = "phone", value = "PHONE", dataType = "Int", example = "100") + @ApiImplicitParam(name = "phone", value = "PHONE", dataType = "Int", example = "100"), + @ApiImplicitParam(name = "state", value = "STATE", dataType = "Int", example = "1") }) @PostMapping(value = "/create") @ResponseStatus(HttpStatus.CREATED) @@ -83,11 +84,11 @@ public class UsersController extends BaseController { @RequestParam(value = "tenantId") int tenantId, @RequestParam(value = "queue", required = false, defaultValue = "") String queue, @RequestParam(value = "email") String email, - @RequestParam(value = "phone", required = false) String phone) throws Exception { - logger.info("login user {}, create user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}", - loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone, queue); - - Map result = usersService.createUser(loginUser, userName, userPassword, email, tenantId, phone, queue); + @RequestParam(value = "phone", required = false) String phone, + @RequestParam(value = "state", required = false) int state) throws Exception { + logger.info("login user {}, create user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}, state: {}", + loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone, queue, state); + Map result = usersService.createUser(loginUser, userName, userPassword, email, tenantId, phone, queue, state); return returnDataList(result); } @@ -146,7 +147,8 @@ public class UsersController extends BaseController { @ApiImplicitParam(name = "tenantId", value = "TENANT_ID", dataType = "Int", example = "100"), @ApiImplicitParam(name = "queue", value = "QUEUE", dataType = "Int", example = "100"), @ApiImplicitParam(name = "email", value = "EMAIL", dataType = "Int", example = "100"), - @ApiImplicitParam(name = "phone", value = "PHONE", dataType = "Int", example = "100") + @ApiImplicitParam(name = "phone", value = "PHONE", dataType = "Int", example = "100"), + @ApiImplicitParam(name = "state", value = "STATE", dataType = "Int", example = "1") }) @PostMapping(value = "/update") @ResponseStatus(HttpStatus.OK) @@ -158,10 +160,11 @@ public class UsersController extends BaseController { @RequestParam(value = "queue", required = false, defaultValue = "") String queue, @RequestParam(value = "email") String email, @RequestParam(value = "tenantId") int tenantId, - @RequestParam(value = "phone", required = false) String phone) throws Exception { - logger.info("login user {}, updateProcessInstance user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}", - loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone, queue); - Map result = usersService.updateUser(id, userName, userPassword, email, tenantId, phone, queue); + @RequestParam(value = "phone", required = false) String phone, + @RequestParam(value = "state", required = false) int state) throws Exception { + logger.info("login user {}, updateProcessInstance user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}, state: {}", + loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone, queue, state); + Map result = usersService.updateUser(id, userName, userPassword, email, tenantId, phone, queue, state); return returnDataList(result); } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java index b3d10da288..ae7300f54d 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java @@ -175,6 +175,7 @@ public enum Status { QUERY_WORKER_GROUP_FAIL(10146,"query worker group fail ", "查询worker分组失败"), DELETE_WORKER_GROUP_FAIL(10147,"delete worker group fail ", "删除worker分组失败"), COPY_PROCESS_DEFINITION_ERROR(10148,"copy process definition error", "复制工作流错误"), + USER_DISABLED(10149,"The current user is disabled", "当前用户已停用"), UDF_FUNCTION_NOT_EXIST(20001, "UDF function not found", "UDF函数不存在"), UDF_FUNCTION_EXISTS(20002, "UDF function already exists", "UDF函数已存在"), diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptor.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptor.java index 98bac42f72..af29cb67fb 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptor.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptor.java @@ -16,9 +16,11 @@ */ package org.apache.dolphinscheduler.api.interceptor; +import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.security.Authenticator; import org.apache.dolphinscheduler.api.service.SessionService; import org.apache.dolphinscheduler.common.Constants; +import org.apache.dolphinscheduler.common.enums.Flag; import org.apache.dolphinscheduler.dao.entity.User; import org.apache.dolphinscheduler.dao.mapper.UserMapper; import org.apache.commons.httpclient.HttpStatus; @@ -85,6 +87,14 @@ public class LoginHandlerInterceptor implements HandlerInterceptor { return false; } } + + // check user state + if (user.getState() == Flag.NO.ordinal()) { + response.setStatus(HttpStatus.SC_UNAUTHORIZED); + logger.info(Status.USER_DISABLED.getMsg()); + return false; + } + request.setAttribute(Constants.SESSION_USER, user); return true; } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticator.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticator.java index a9e287b8e2..69930fc9d7 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticator.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticator.java @@ -21,6 +21,7 @@ import org.apache.dolphinscheduler.api.service.SessionService; import org.apache.dolphinscheduler.api.service.UsersService; import org.apache.dolphinscheduler.api.utils.Result; import org.apache.dolphinscheduler.common.Constants; +import org.apache.dolphinscheduler.common.enums.Flag; import org.apache.dolphinscheduler.dao.entity.Session; import org.apache.dolphinscheduler.dao.entity.User; import org.slf4j.Logger; @@ -49,6 +50,13 @@ public class PasswordAuthenticator implements Authenticator { return result; } + // check user state + if (user.getState() == Flag.NO.ordinal()) { + result.setCode(Status.USER_DISABLED.getCode()); + result.setMsg(Status.USER_DISABLED.getMsg()); + return result; + } + // create session String sessionId = sessionService.createSession(user, extra); if (sessionId == null) { diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java index 220b4fc4d0..bb31733dc7 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java @@ -94,7 +94,8 @@ public class UsersService extends BaseService { String email, int tenantId, String phone, - String queue) throws Exception { + String queue, + int state) throws Exception { Map result = new HashMap<>(5); @@ -115,7 +116,7 @@ public class UsersService extends BaseService { return result; } - User user = createUser(userName, userPassword, email, tenantId, phone, queue); + User user = createUser(userName, userPassword, email, tenantId, phone, queue, state); Tenant tenant = tenantMapper.queryById(tenantId); // resource upload startup @@ -139,7 +140,8 @@ public class UsersService extends BaseService { String email, int tenantId, String phone, - String queue) throws Exception { + String queue, + int state) throws Exception { User user = new User(); Date now = new Date(); @@ -148,6 +150,7 @@ public class UsersService extends BaseService { user.setEmail(email); user.setTenantId(tenantId); user.setPhone(phone); + user.setState(state); // create general users, administrator users are currently built-in user.setUserType(UserType.GENERAL_USER); user.setCreateTime(now); @@ -260,7 +263,8 @@ public class UsersService extends BaseService { String email, int tenantId, String phone, - String queue) throws Exception { + String queue, + int state) throws Exception { Map result = new HashMap<>(5); result.put(Constants.STATUS, false); @@ -309,7 +313,9 @@ public class UsersService extends BaseService { } user.setPhone(phone); } + user.setQueue(queue); + user.setState(state); Date now = new Date(); user.setUpdateTime(now); diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/LoginControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/LoginControllerTest.java index 5be7b0711c..a4ecd291f9 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/LoginControllerTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/LoginControllerTest.java @@ -56,7 +56,6 @@ public class LoginControllerTest extends AbstractControllerTest{ logger.info(mvcResult.getResponse().getContentAsString()); } - @Test public void testSignOut() throws Exception { MultiValueMap paramsMap = new LinkedMultiValueMap<>(); diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptorTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptorTest.java index b8a002ad16..d25a3efa01 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptorTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/interceptor/LoginHandlerInterceptorTest.java @@ -57,6 +57,7 @@ public class LoginHandlerInterceptorTest { User mockUser = new User(); mockUser.setId(1); mockUser.setUserType(UserType.GENERAL_USER); + mockUser.setState(1); // test no token when(authenticator.getAuthUser(request)).thenReturn(mockUser); @@ -67,5 +68,10 @@ public class LoginHandlerInterceptorTest { when(request.getHeader("token")).thenReturn(token); when(userMapper.queryUserByToken(token)).thenReturn(mockUser); Assert.assertTrue(interceptor.preHandle(request, response, null)); + + // test disable user + mockUser.setState(0); + when(authenticator.getAuthUser(request)).thenReturn(mockUser); + Assert.assertFalse(interceptor.preHandle(request, response, null)); } } diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticatorTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticatorTest.java index cccc3079e6..dca70f8ed3 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticatorTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/security/PasswordAuthenticatorTest.java @@ -67,6 +67,7 @@ public class PasswordAuthenticatorTest { mockUser.setEmail("test@test.com"); mockUser.setUserPassword("test"); mockUser.setId(1); + mockUser.setState(1); mockSession = new Session(); mockSession.setId(UUID.randomUUID().toString()); @@ -82,6 +83,13 @@ public class PasswordAuthenticatorTest { Result result = authenticator.authenticate("test", "test", "127.0.0.1"); Assert.assertEquals(Status.SUCCESS.getCode(), (int) result.getCode()); logger.info(result.toString()); + + mockUser.setState(0); + when(usersService.queryUser("test", "test")).thenReturn(mockUser); + when(sessionService.createSession(mockUser, "127.0.0.1")).thenReturn(mockSession.getId()); + Result result1 = authenticator.authenticate("test", "test", "127.0.0.1"); + Assert.assertEquals(Status.USER_DISABLED.getCode(), (int) result1.getCode()); + logger.info(result1.toString()); } @Test diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java index 58ee6fdf6c..4c857cbcb1 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java @@ -98,41 +98,42 @@ public class UsersServiceTest { String email = "123@qq.com"; int tenantId = Integer.MAX_VALUE; String phone= "13456432345"; + int state = 1; try { //userName error - Map result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName); + Map result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName, state); logger.info(result.toString()); Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS)); userName = "userTest0001"; userPassword = "userTest000111111111111111"; //password error - result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName); + result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName, state); logger.info(result.toString()); Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS)); userPassword = "userTest0001"; email = "1q.com"; //email error - result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName); + result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName, state); logger.info(result.toString()); Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS)); email = "122222@qq.com"; phone ="2233"; //phone error - result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName); + result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName, state); logger.info(result.toString()); Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS)); phone = "13456432345"; //tenantId not exists - result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName); + result = usersService.createUser(user, userName, userPassword, email, tenantId, phone, queueName, state); logger.info(result.toString()); Assert.assertEquals(Status.TENANT_NOT_EXIST, result.get(Constants.STATUS)); //success Mockito.when(tenantMapper.queryById(1)).thenReturn(getTenant()); - result = usersService.createUser(user, userName, userPassword, email, 1, phone, queueName); + result = usersService.createUser(user, userName, userPassword, email, 1, phone, queueName, state); logger.info(result.toString()); Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); @@ -225,13 +226,13 @@ public class UsersServiceTest { String userPassword = "userTest0001"; try { //user not exist - Map result = usersService.updateUser(0,userName,userPassword,"3443@qq.com",1,"13457864543","queue"); + Map result = usersService.updateUser(0,userName,userPassword,"3443@qq.com",1,"13457864543","queue", 1); Assert.assertEquals(Status.USER_NOT_EXIST, result.get(Constants.STATUS)); logger.info(result.toString()); //success when(userMapper.selectById(1)).thenReturn(getUser()); - result = usersService.updateUser(1,userName,userPassword,"32222s@qq.com",1,"13457864543","queue"); + result = usersService.updateUser(1,userName,userPassword,"32222s@qq.com",1,"13457864543","queue", 1); logger.info(result.toString()); Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); } catch (Exception e) { @@ -482,6 +483,7 @@ public class UsersServiceTest { user.setUserType(UserType.ADMIN_USER); user.setUserName("userTest0001"); user.setUserPassword("userTest0001"); + user.setState(1); return user; } diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java index 8849be0b83..b4f2f93dcc 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/User.java @@ -67,6 +67,11 @@ public class User { */ private int tenantId; + /** + * user state + */ + private int state; + /** * tenant code */ @@ -219,6 +224,14 @@ public class User { this.queue = queue; } + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -254,6 +267,7 @@ public class User { ", phone='" + phone + '\'' + ", userType=" + userType + ", tenantId=" + tenantId + + ", state=" + state + ", tenantCode='" + tenantCode + '\'' + ", tenantName='" + tenantName + '\'' + ", queueName='" + queueName + '\'' + diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml index fcf8a137e6..9ad2567237 100644 --- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml +++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/UserMapper.xml @@ -32,7 +32,7 @@