Browse Source

Merge remote-tracking branch 'origin/master'

zhou-hao 7 năm trước cách đây
mục cha
commit
451426311e
16 tập tin đã thay đổi với 259 bổ sung152 xóa
  1. 9 0
      hsweb-authorization/hsweb-authorization-api/pom.xml
  2. 4 1
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationFailedEvent.java
  3. 1 2
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java
  4. 6 2
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilder.java
  5. 6 1
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/DefaultUserTokenManager.java
  6. 2 2
      hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/AuthenticationTests.java
  7. 11 0
      hsweb-authorization/hsweb-authorization-cloud/pom.xml
  8. 0 6
      hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/AuthorizationServerAutoConfiguration.java
  9. 0 103
      hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/server/UserTokenController.java
  10. 24 12
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-controller/src/main/java/org/hswebframework/web/controller/authorization/AuthorizationController.java
  11. 166 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-controller/src/main/java/org/hswebframework/web/controller/authorization/UserTokenController.java
  12. 13 11
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-controller/src/main/java/org/hswebframework/web/controller/authorization/UserTokenInfoController.java
  13. 10 5
      hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/meta/table/parser/AbstractSqlTableMetaDataParser.java
  14. 3 3
      hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/meta/table/parser/support/OralceTableMetaDataParser.java
  15. 1 1
      hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java
  16. 3 3
      hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/manager/TableMetaDataParserAutoConfiguration.java

+ 9 - 0
hsweb-authorization/hsweb-authorization-api/pom.xml

@@ -30,6 +30,15 @@
             <artifactId>spring-boot-starter</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>

+ 4 - 1
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationFailedEvent.java

@@ -59,6 +59,9 @@ public class AuthorizationFailedEvent extends AbstractAuthorizationEvent {
     }
 
     public enum Reason {
-        PASSWORD_ERROR, USER_DISABLED, USER_NOT_EXISTS, OTHER
+        PASSWORD_ERROR,
+        USER_DISABLED,
+        USER_NOT_EXISTS,
+        OTHER
     }
 }

+ 1 - 2
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java

@@ -3,7 +3,6 @@ package org.hswebframework.web.authorization.simple;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.AuthenticationHolder;
 import org.hswebframework.web.authorization.AuthenticationManager;
-import org.hswebframework.web.authorization.AuthenticationSupplier;
 import org.hswebframework.web.authorization.builder.AuthenticationBuilderFactory;
 import org.hswebframework.web.authorization.builder.DataAccessConfigBuilderFactory;
 import org.hswebframework.web.authorization.simple.builder.DataAccessConfigConvert;
@@ -41,7 +40,7 @@ public class DefaultAuthorizationAutoConfiguration {
     @Bean
     @ConditionalOnBean(AuthenticationManager.class)
     public UserTokenAuthenticationSupplier userTokenAuthenticationSupplier(AuthenticationManager authenticationManager) {
-        UserTokenAuthenticationSupplier supplier= new UserTokenAuthenticationSupplier(authenticationManager);
+        UserTokenAuthenticationSupplier supplier = new UserTokenAuthenticationSupplier(authenticationManager);
         AuthenticationHolder.addSupplier(supplier);
         return supplier;
     }

+ 6 - 2
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilder.java

@@ -39,10 +39,14 @@ public class SimpleDataAccessConfigBuilder implements DataAccessConfigBuilder {
         Objects.requireNonNull(type);
         Objects.requireNonNull(action);
 
+        if (config == null) {
+            config = json;
+        }
+        String finalConfig = config;
 
         return converts.stream()
-                .filter(convert -> convert.isSupport(type, action, config))
-                .map(convert -> convert.convert(type, action, config))
+                .filter(convert -> convert.isSupport(type, action, finalConfig))
+                .map(convert -> convert.convert(type, action, finalConfig))
                 .findFirst()
                 .orElse(null);
     }

+ 6 - 1
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/DefaultUserTokenManager.java

@@ -108,7 +108,12 @@ public class DefaultUserTokenManager implements UserTokenManager {
         if (userId == null) {
             return Collections.emptyList();
         }
-        return getUserToken(userId)
+        Set<String> tokens = getUserToken(userId);
+        if (tokens.isEmpty()) {
+            userStorage.remove(userId);
+            return Collections.emptyList();
+        }
+        return tokens
                 .stream()
                 .map(tokenStorage::get)
                 .filter(Objects::nonNull)

+ 2 - 2
hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/AuthenticationTests.java

@@ -43,7 +43,7 @@ public class AuthenticationTests {
         Authentication authentication = builder.user("{\"id\":\"admin\",\"username\":\"admin\",\"name\":\"Administrator\",\"type\":\"default\"}")
                 .role("[{\"id\":\"admin-role\",\"name\":\"admin\"}]")
                 .permission("[{\"id\":\"user-manager\",\"actions\":[\"query\",\"get\",\"update\"]" +
-                        ",\"dataAccesses\":[{\"action\":\"query\",\"field\":\"test\",\"config\":{\"fields\":[\"1\",\"2\",\"3\"]},\"scopeType\":\"CUSTOM_SCOPE\",\"type\":\"DENY_FIELDS\"}]}]")
+                        ",\"dataAccesses\":[{\"action\":\"query\",\"field\":\"test\",\"fields\":[\"1\",\"2\",\"3\"],\"scopeType\":\"CUSTOM_SCOPE\",\"type\":\"DENY_FIELDS\"}]}]")
                 .build();
 
         //test user
@@ -54,7 +54,7 @@ public class AuthenticationTests {
 
         //test role
         assertNotNull(authentication.getRole("admin-role").orElse(null));
-        assertEquals(authentication.getRole("admin-role").orElse(null).getName(), "admin");
+        assertEquals(authentication.getRole("admin-role").get().getName(), "admin");
         assertTrue(authentication.hasRole("admin-role"));
 
 

+ 11 - 0
hsweb-authorization/hsweb-authorization-cloud/pom.xml

@@ -23,6 +23,17 @@
             <version>1.3.1.RELEASE</version>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-feign</artifactId>
+            <version>1.3.1.RELEASE</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-authorization-oauth2-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-web</artifactId>

+ 0 - 6
hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/AuthorizationServerAutoConfiguration.java

@@ -1,7 +1,5 @@
 package org.hswebframework.web.authorization.cloud;
 
-import org.hswebframework.web.authorization.cloud.server.UserTokenController;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
@@ -11,8 +9,4 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class AuthorizationServerAutoConfiguration {
 
-    @Bean
-    public UserTokenController userTokenController() {
-        return new UserTokenController();
-    }
 }

+ 0 - 103
hsweb-authorization/hsweb-authorization-cloud/src/main/java/org/hswebframework/web/authorization/cloud/server/UserTokenController.java

@@ -1,103 +0,0 @@
-package org.hswebframework.web.authorization.cloud.server;
-
-import org.hswebframework.web.authorization.Authentication;
-import org.hswebframework.web.authorization.AuthenticationManager;
-import org.hswebframework.web.authorization.token.TokenState;
-import org.hswebframework.web.authorization.token.UserToken;
-import org.hswebframework.web.authorization.token.UserTokenManager;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RestController
-@RequestMapping
-public class UserTokenController {
-    private UserTokenManager userTokenManager;
-
-    private AuthenticationManager authenticationManager;
-
-    @Autowired
-    @Lazy
-    public void setUserTokenManager(UserTokenManager userTokenManager) {
-        this.userTokenManager = userTokenManager;
-    }
-
-    @Autowired
-    @Lazy
-    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
-        this.authenticationManager = authenticationManager;
-    }
-
-    @GetMapping("/user-token/token/{token}")
-    public UserToken getByToken(@PathVariable String token) {
-        return userTokenManager.getByToken(token);
-    }
-
-    @GetMapping("/user-token/user/{userId}")
-    public List<UserToken> getByUserId(@PathVariable String userId) {
-        return userTokenManager.getByUserId(userId);
-    }
-
-    @GetMapping("/user-token/user/{userId}/logged")
-    public boolean userIsLoggedIn(@PathVariable String userId) {
-        return userTokenManager.userIsLoggedIn(userId);
-    }
-
-    @GetMapping("/user-token/token/{token}/logged")
-    public boolean tokenIsLoggedIn(@PathVariable String token) {
-        return userTokenManager.tokenIsLoggedIn(token);
-    }
-
-    @GetMapping("/user-token/user/total")
-    public long totalUser() {
-        return userTokenManager.totalUser();
-    }
-
-    @GetMapping("/user-token/token/total")
-    public long totalToken() {
-        return userTokenManager.totalToken();
-    }
-
-    @GetMapping("/user-token}")
-    public List<UserToken> allLoggedUser() {
-        return userTokenManager.allLoggedUser();
-    }
-
-    @DeleteMapping("/user-token/user/{userId}")
-    public void signOutByUserId(@PathVariable String userId) {
-        userTokenManager.signOutByUserId(userId);
-    }
-
-    @DeleteMapping("/user-token/token/{token}")
-    public void signOutByToken(@PathVariable String token) {
-        userTokenManager.signOutByToken(token);
-    }
-
-    @PutMapping("/user-token/user/{userId}/{state}")
-    public void changeUserState(@PathVariable String userId, @PathVariable TokenState state) {
-        userTokenManager.changeUserState(userId, state);
-    }
-
-    @PutMapping("/user-token/token/{token}/{state}")
-    public void changeTokenState(String token, TokenState state) {
-        userTokenManager.changeTokenState(token, state);
-    }
-
-    @PostMapping("/user-token/{token}/{type}/{userId}/{maxInactiveInterval}")
-    public UserToken signIn(@PathVariable String token, @PathVariable String type, @PathVariable String userId, @PathVariable long maxInactiveInterval) {
-        return userTokenManager.signIn(token, type, userId, maxInactiveInterval);
-    }
-
-    @GetMapping("/user-token/{token}/touch")
-    public void touch(@PathVariable String token) {
-        userTokenManager.touch(token);
-    }
-
-    @GetMapping("/user-auth/{userId}")
-    public Authentication userAuthInfo(@PathVariable String userId) {
-        return authenticationManager.getByUserId(userId);
-    }
-
-}

+ 24 - 12
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-controller/src/main/java/org/hswebframework/web/controller/authorization/AuthorizationController.java

@@ -22,6 +22,7 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.hswebframework.web.BusinessException;
 import org.hswebframework.web.NotFoundException;
+import org.hswebframework.web.WebUtil;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.AuthenticationManager;
 import org.hswebframework.web.authorization.annotation.Authorize;
@@ -35,10 +36,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 
 import static org.hswebframework.web.controller.message.ResponseMessage.ok;
@@ -76,36 +79,45 @@ public class AuthorizationController {
         return ok(authentication);
     }
 
-    @PostMapping(value = "/login")
-    @ApiOperation("用户名密码登录")
+
+    @PostMapping(value = "/login", consumes = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation("用户名密码登录,json方式")
+    public ResponseMessage<Map<String, Object>> authorize(@ApiParam(example = "{\"username\":\"admin\",\"password\":\"admin\"}")
+                                                          @RequestBody Map<String, String> parameter) {
+
+        return doLogin(Objects.requireNonNull(parameter.get("username"), "用户名不能为空")
+                , Objects.requireNonNull(parameter.get("password"), "密码不能为空")
+                , parameter);
+    }
+
+    @PostMapping(value = "/login",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    @ApiOperation("用户名密码登录,参数方式")
     public ResponseMessage<Map<String, Object>> authorize(@RequestParam @ApiParam("用户名") String username,
                                                           @RequestParam @ApiParam("密码") String password,
                                                           @ApiParam(hidden = true) HttpServletRequest request) {
 
+        return doLogin(username, password, WebUtil.getParameters(request));
+    }
+
+    protected ResponseMessage<Map<String, Object>> doLogin(String username, String password, Map<String, ?> parameter) {
         AuthorizationFailedEvent.Reason reason = AuthorizationFailedEvent.Reason.OTHER;
-        Function<String, Object> parameterGetter = request::getParameter;
+        Function<String, Object> parameterGetter = parameter::get;
         try {
             AuthorizationDecodeEvent decodeEvent = new AuthorizationDecodeEvent(username, password, parameterGetter);
             eventPublisher.publishEvent(decodeEvent);
             username = decodeEvent.getUsername();
             password = decodeEvent.getPassword();
-
             AuthorizationBeforeEvent beforeEvent = new AuthorizationBeforeEvent(username, password, parameterGetter);
             eventPublisher.publishEvent(beforeEvent);
-            UserEntity entity = userService.selectByUsername(username);
+            UserEntity entity = userService.selectByUserNameAndPassword(username, password);
             if (entity == null) {
-                reason = AuthorizationFailedEvent.Reason.USER_NOT_EXISTS;
-                throw new NotFoundException("{user_not_exists}");
+                reason = AuthorizationFailedEvent.Reason.PASSWORD_ERROR;
+                throw new NotFoundException("密码错误");
             }
             if (!DataStatus.STATUS_ENABLED.equals(entity.getStatus())) {
                 reason = AuthorizationFailedEvent.Reason.USER_DISABLED;
                 throw new BusinessException("{user_is_disabled}", 400);
             }
-            password = userService.encodePassword(password, entity.getSalt());
-            if (!entity.getPassword().equals(password)) {
-                reason = AuthorizationFailedEvent.Reason.PASSWORD_ERROR;
-                throw new BusinessException("{password_error}", 400);
-            }
             // 验证通过
             Authentication authentication = authenticationManager.getByUserId(entity.getId());
             //触发授权成功事件

+ 166 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-controller/src/main/java/org/hswebframework/web/controller/authorization/UserTokenController.java

@@ -0,0 +1,166 @@
+package org.hswebframework.web.controller.authorization;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.hswebframework.web.authorization.Authentication;
+import org.hswebframework.web.authorization.AuthenticationManager;
+import org.hswebframework.web.authorization.Permission;
+import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.authorization.token.TokenState;
+import org.hswebframework.web.authorization.token.UserToken;
+import org.hswebframework.web.authorization.token.UserTokenHolder;
+import org.hswebframework.web.authorization.token.UserTokenManager;
+import org.hswebframework.web.controller.message.ResponseMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static org.hswebframework.web.controller.message.ResponseMessage.ok;
+
+@RestController
+@RequestMapping
+@Authorize(permission = "user-token", description = "用户令牌信息管理")
+@Api(tags = "权限-用户令牌管理", value = "权限-用户令牌管理")
+public class UserTokenController {
+    private UserTokenManager userTokenManager;
+
+    private AuthenticationManager authenticationManager;
+
+    @Autowired
+    @Lazy
+    public void setUserTokenManager(UserTokenManager userTokenManager) {
+        this.userTokenManager = userTokenManager;
+    }
+
+    @Autowired
+    @Lazy
+    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
+        this.authenticationManager = authenticationManager;
+    }
+
+    @GetMapping("/user-token/reset")
+    @Authorize(merge = false)
+    @ApiOperation("重置当前用户的令牌")
+    public ResponseMessage<Boolean> resetToken() {
+        UserToken token = UserTokenHolder.currentToken();
+        if (token != null) {
+            userTokenManager.signOutByToken(token.getToken());
+        }
+        return ok(true);
+    }
+
+    @PutMapping("/user-token/check")
+    @ApiOperation("检查所有已过期的token并移除")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Boolean> checkExpiredToken() {
+        userTokenManager.checkExpiredToken();
+        return ok(true);
+    }
+
+    @GetMapping("/user-token/token/{token}")
+    @ApiOperation("根据token获取令牌信息")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<UserToken> getByToken(@PathVariable String token) {
+        return ok(userTokenManager.getByToken(token));
+    }
+
+    @GetMapping("/user-token/user/{userId}")
+    @ApiOperation("根据用户ID获取全部令牌信息")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<List<UserToken>> getByUserId(@PathVariable String userId) {
+        return ok(userTokenManager.getByUserId(userId));
+    }
+
+    @GetMapping("/user-token/user/{userId}/logged")
+    @ApiOperation("根据用户ID判断用户是否已经登录")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<Boolean> userIsLoggedIn(@PathVariable String userId) {
+        return ok(userTokenManager.userIsLoggedIn(userId));
+    }
+
+    @GetMapping("/user-token/token/{token}/logged")
+    @ApiOperation("根据令牌判断用户是否已经登录")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<Boolean> tokenIsLoggedIn(@PathVariable String token) {
+        return ok(userTokenManager.tokenIsLoggedIn(token));
+    }
+
+    @GetMapping("/user-token/user/total")
+    @ApiOperation("获取当前已经登录的用户数量")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<Long> totalUser() {
+        return ok(userTokenManager.totalUser());
+    }
+
+    @GetMapping("/user-token/token/total")
+    @ApiOperation("获取当前已经登录的令牌数量")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<Long> totalToken() {
+        return ok(userTokenManager.totalToken());
+    }
+
+    @GetMapping("/user-token")
+    @ApiOperation("获取全部用户令牌信息")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<List<UserToken>> allLoggedUser() {
+        return ok(userTokenManager.allLoggedUser());
+    }
+
+    @DeleteMapping("/user-token/user/{userId}")
+    @ApiOperation("根据用户id将用户踢下线")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Void> signOutByUserId(@PathVariable String userId) {
+        userTokenManager.signOutByUserId(userId);
+        return ok();
+    }
+
+    @DeleteMapping("/user-token/token/{token}")
+    @ApiOperation("根据令牌将用户踢下线")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Void> signOutByToken(@PathVariable String token) {
+        userTokenManager.signOutByToken(token);
+        return ok();
+    }
+
+    @PutMapping("/user-token/user/{userId}/{state}")
+    @ApiOperation("根据用户id更新用户令牌状态")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Void> changeUserState(@PathVariable String userId, @PathVariable TokenState state) {
+
+        userTokenManager.changeUserState(userId, state);
+        return ok();
+    }
+
+    @PutMapping("/user-token/token/{token}/{state}")
+    @ApiOperation("根据令牌更新用户令牌状态")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Void> changeTokenState(@PathVariable String token, @PathVariable TokenState state) {
+        userTokenManager.changeTokenState(token, state);
+        return ok();
+    }
+
+    @PostMapping("/user-token/{token}/{type}/{userId}/{maxInactiveInterval}")
+    @ApiOperation("将用户设置为登录")
+    @Authorize(action = Permission.ACTION_ADD)
+    public ResponseMessage<UserToken> signIn(@PathVariable String token, @PathVariable String type, @PathVariable String userId, @PathVariable long maxInactiveInterval) {
+        return ok(userTokenManager.signIn(token, type, userId, maxInactiveInterval));
+    }
+
+    @GetMapping("/user-token/{token}/touch")
+    @ApiOperation("更新token有效期")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Void> touch(@PathVariable String token) {
+        userTokenManager.touch(token);
+        return ok();
+    }
+
+    @GetMapping("/user-auth/{userId}")
+    @ApiOperation("根据用户id获取用户的权限信息")
+    @Authorize(action = Permission.ACTION_GET)
+    public ResponseMessage<Authentication> userAuthInfo(@PathVariable String userId) {
+        return ok(authenticationManager.getByUserId(userId));
+    }
+
+}

+ 13 - 11
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-controller/src/main/java/org/hswebframework/web/controller/authorization/UserTokenInfoController.java

@@ -15,10 +15,11 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-@RestController
-@RequestMapping("${hsweb.web.mappings.user-token:user-token}")
-@Api(value = "用户令牌", tags = "权限-用户令牌管理")
-@Authorize(permission = "user-token", description = "用户令牌管理")
+//@RestController
+//@RequestMapping("${hsweb.web.mappings.user-token:user-token}")
+//@Api(value = "用户令牌", tags = "权限-用户令牌管理")
+//@Authorize(permission = "user-token", description = "用户令牌管理")
+@Deprecated
 public class UserTokenInfoController {
 
     @Autowired
@@ -49,6 +50,14 @@ public class UserTokenInfoController {
         return ResponseMessage.ok(true);
     }
 
+    @PutMapping("/check")
+    @ApiOperation("检查所有已过期的token并移除")
+    @Authorize(action = Permission.ACTION_UPDATE)
+    public ResponseMessage<Void> checkExpiredToken() {
+        userTokenManager.checkExpiredToken();
+        return ResponseMessage.ok();
+    }
+
     @GetMapping("/token/all")
     @ApiOperation("获取所有令牌")
     @Authorize(action = Permission.ACTION_GET)
@@ -73,12 +82,5 @@ public class UserTokenInfoController {
         return ResponseMessage.ok();
     }
 
-    @PutMapping("/check")
-    @ApiOperation("检查所有已过期的token并移除")
-    @Authorize(action = Permission.ACTION_UPDATE)
-    public ResponseMessage<Void> checkExpiredToken() {
-        userTokenManager.checkExpiredToken();
-        return ResponseMessage.ok();
-    }
 
 }

+ 10 - 5
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/meta/table/parser/AbstractSqlTableMetaDataParser.java

@@ -1,10 +1,12 @@
 package org.hswebframework.web.database.manager.meta.table.parser;
 
+import lombok.SneakyThrows;
 import org.apache.commons.beanutils.BeanUtilsBean;
 import org.hswebframework.ezorm.core.ObjectWrapper;
 import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
 import org.hswebframework.web.database.manager.meta.table.ColumnMetadata;
 import org.hswebframework.web.database.manager.meta.table.TableMetadata;
+import org.hswebframework.web.datasource.DataSourceHolder;
 import org.hswebframework.web.datasource.DatabaseType;
 
 import java.sql.SQLException;
@@ -24,12 +26,12 @@ public abstract class AbstractSqlTableMetaDataParser implements TableMetaDataPar
 
     public abstract String getSelectAllTableSql();
 
-    public AbstractSqlTableMetaDataParser(SqlExecutor sqlExecutor,DatabaseType... databaseTypes) {
+    public AbstractSqlTableMetaDataParser(SqlExecutor sqlExecutor, DatabaseType... databaseTypes) {
         this.sqlExecutor = sqlExecutor;
         supportDataBases.addAll(Arrays.asList(databaseTypes));
     }
 
-    private Set<DatabaseType> supportDataBases =new HashSet<>();
+    private Set<DatabaseType> supportDataBases = new HashSet<>();
 
     @Override
     public boolean isSupport(DatabaseType type) {
@@ -43,15 +45,17 @@ public abstract class AbstractSqlTableMetaDataParser implements TableMetaDataPar
 
     @Override
     public List<TableMetadata> parseAll() throws SQLException {
+        String dsId = DataSourceHolder.switcher().currentDataSourceId();
         return sqlExecutor.list(getSelectAllTableSql())
                 .parallelStream()
                 .map(map -> map.get("name"))
                 .map(String::valueOf)
                 .map(tableName -> {
                     try {
+                        DataSourceHolder.switcher().use(dsId);
                         return this.parse(tableName);
-                    } catch (SQLException e) {
-                        throw new RuntimeException(e);
+                    } finally {
+                        DataSourceHolder.switcher().reset();
                     }
                 })
                 .filter(Objects::nonNull)
@@ -59,7 +63,8 @@ public abstract class AbstractSqlTableMetaDataParser implements TableMetaDataPar
     }
 
     @Override
-    public TableMetadata parse(String objectName) throws SQLException {
+    @SneakyThrows
+    public TableMetadata parse(String objectName) {
 
         Map<String, Object> param = new HashMap<>();
         param.put("table", objectName);

+ 3 - 3
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-api/src/main/java/org/hswebframework/web/database/manager/meta/table/parser/support/OralceTableMetaDataParser.java

@@ -4,10 +4,10 @@ import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
 import org.hswebframework.web.database.manager.meta.table.parser.AbstractSqlTableMetaDataParser;
 import org.hswebframework.web.datasource.DatabaseType;
 
-public class OralceTableMetaDataParser extends AbstractSqlTableMetaDataParser {
+public class OracleTableMetaDataParser extends AbstractSqlTableMetaDataParser {
 
     private final static String TABLE_META_SQL = "select distinct(cols.column_name) as \"name\"" +
-            ",cols.table_name as \"name\"" +
+            ",cols.table_name as \"tableName\"" +
             ",cols.data_type as \"dataType\"" +
             ",cols.data_length as \"dataLength\"" +
             ",cols.data_precision as \"precision\"" +
@@ -23,7 +23,7 @@ public class OralceTableMetaDataParser extends AbstractSqlTableMetaDataParser {
 
     private final static String ALL_TABLE_SQL = "select table_name as \"name\" from user_tab_comments where table_type='TABLE'";
 
-    public OralceTableMetaDataParser(SqlExecutor sqlExecutor) {
+    public OracleTableMetaDataParser(SqlExecutor sqlExecutor) {
         super(sqlExecutor, DatabaseType.oracle);
     }
 

+ 1 - 1
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-simple/src/main/java/org/hswebframework/web/datasource/manager/simple/SimpleDatabaseManagerService.java

@@ -136,7 +136,7 @@ public class SimpleDatabaseManagerService implements DatabaseManagerService, Met
         return parserRepo
                 .computeIfAbsent(DataSourceHolder.currentDatabaseType(), t -> new HashMap<>())
                 .entrySet()
-                .parallelStream()
+                .stream()
                 .collect(Collectors.toMap(Map.Entry::getKey, entry -> {
                     try {
                         return entry.getValue().parseAll();

+ 3 - 3
hsweb-system/hsweb-system-database-manager/hsweb-system-database-manager-starter/src/main/java/org/hswebframework/web/database/manager/TableMetaDataParserAutoConfiguration.java

@@ -1,13 +1,13 @@
 package org.hswebframework.web.database.manager;
 
 import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
-import org.hswebframework.ezorm.rdb.meta.parser.OracleTableMetaParser;
 import org.hswebframework.web.database.manager.meta.ObjectMetadata;
 import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserRegister;
 import org.hswebframework.web.database.manager.meta.table.parser.MetaDataParserSupplier;
 import org.hswebframework.web.database.manager.meta.table.parser.TableMetaDataParser;
 import org.hswebframework.web.database.manager.meta.table.parser.support.H2TableMetaDataParser;
 import org.hswebframework.web.database.manager.meta.table.parser.support.MysqlTableMetaDataParser;
+import org.hswebframework.web.database.manager.meta.table.parser.support.OracleTableMetaDataParser;
 import org.hswebframework.web.database.manager.meta.table.parser.support.SqlServerTableMetaDataParser;
 import org.hswebframework.web.datasource.DatabaseType;
 import org.springframework.beans.BeansException;
@@ -40,8 +40,8 @@ public class TableMetaDataParserAutoConfiguration {
 
     @Bean
     @ConditionalOnClass(name = "oracle.jdbc.driver.OracleDriver")
-    public OracleTableMetaParser oracleTableMetaParser() {
-        return new OracleTableMetaParser(sqlExecutor);
+    public OracleTableMetaDataParser oracleTableMetaParser() {
+        return new OracleTableMetaDataParser(sqlExecutor);
     }
 
     @Bean