Full Code of hs-web/hsweb-framework for AI

5.0.x 47573d460bdf cached
784 files
1.8 MB
447.5k tokens
3974 symbols
1 requests
Download .txt
Showing preview only (2,142K chars total). Download the full file or copy to clipboard to get everything.
Repository: hs-web/hsweb-framework
Branch: 5.0.x
Commit: 47573d460bdf
Files: 784
Total size: 1.8 MB

Directory structure:
gitextract_kk74s25r/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   ├── future.md
│   │   └── qa.md
│   └── workflows/
│       ├── maven-publish-4x.yml
│       ├── maven-publish-5x.yml
│       ├── pull_request.yml
│       └── pull_request_5x.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── README.md
├── build.sh
├── changes.sh
├── hsweb-authorization/
│   ├── README.md
│   ├── hsweb-authorization-api/
│   │   ├── README.md
│   │   ├── custom-data-access.md
│   │   ├── define.md
│   │   ├── pom.xml
│   │   ├── src/
│   │   │   ├── main/
│   │   │   │   ├── java/
│   │   │   │   │   └── org/
│   │   │   │   │       └── hswebframework/
│   │   │   │   │           └── web/
│   │   │   │   │               └── authorization/
│   │   │   │   │                   ├── Authentication.java
│   │   │   │   │                   ├── AuthenticationHolder.java
│   │   │   │   │                   ├── AuthenticationManager.java
│   │   │   │   │                   ├── AuthenticationPredicate.java
│   │   │   │   │                   ├── AuthenticationRequest.java
│   │   │   │   │                   ├── AuthenticationSupplier.java
│   │   │   │   │                   ├── AuthenticationUtils.java
│   │   │   │   │                   ├── DefaultDimensionType.java
│   │   │   │   │                   ├── Dimension.java
│   │   │   │   │                   ├── DimensionProvider.java
│   │   │   │   │                   ├── DimensionType.java
│   │   │   │   │                   ├── Permission.java
│   │   │   │   │                   ├── ReactiveAuthenticationHolder.java
│   │   │   │   │                   ├── ReactiveAuthenticationInitializeService.java
│   │   │   │   │                   ├── ReactiveAuthenticationManager.java
│   │   │   │   │                   ├── ReactiveAuthenticationManagerProvider.java
│   │   │   │   │                   ├── ReactiveAuthenticationSupplier.java
│   │   │   │   │                   ├── Role.java
│   │   │   │   │                   ├── User.java
│   │   │   │   │                   ├── access/
│   │   │   │   │                   │   ├── DataAccessConfig.java
│   │   │   │   │                   │   ├── DataAccessConfiguration.java
│   │   │   │   │                   │   ├── DataAccessController.java
│   │   │   │   │                   │   ├── DataAccessHandler.java
│   │   │   │   │                   │   ├── DataAccessType.java
│   │   │   │   │                   │   ├── DefaultDataAccessType.java
│   │   │   │   │                   │   ├── DimensionHelper.java
│   │   │   │   │                   │   ├── FieldFilterDataAccessConfig.java
│   │   │   │   │                   │   ├── OwnCreatedDataAccessConfig.java
│   │   │   │   │                   │   ├── ScopeDataAccessConfig.java
│   │   │   │   │                   │   └── UserAttachEntity.java
│   │   │   │   │                   ├── annotation/
│   │   │   │   │                   │   ├── Authorize.java
│   │   │   │   │                   │   ├── CreateAction.java
│   │   │   │   │                   │   ├── DataAccess.java
│   │   │   │   │                   │   ├── DataAccessType.java
│   │   │   │   │                   │   ├── DeleteAction.java
│   │   │   │   │                   │   ├── Dimension.java
│   │   │   │   │                   │   ├── DimensionDataAccess.java
│   │   │   │   │                   │   ├── Dimensions.java
│   │   │   │   │                   │   ├── FieldDataAccess.java
│   │   │   │   │                   │   ├── Logical.java
│   │   │   │   │                   │   ├── QueryAction.java
│   │   │   │   │                   │   ├── RequiresRoles.java
│   │   │   │   │                   │   ├── Resource.java
│   │   │   │   │                   │   ├── ResourceAction.java
│   │   │   │   │                   │   ├── SaveAction.java
│   │   │   │   │                   │   ├── TwoFactor.java
│   │   │   │   │                   │   └── UserOwnData.java
│   │   │   │   │                   ├── builder/
│   │   │   │   │                   │   ├── AuthenticationBuilder.java
│   │   │   │   │                   │   ├── AuthenticationBuilderFactory.java
│   │   │   │   │                   │   ├── DataAccessConfigBuilder.java
│   │   │   │   │                   │   └── DataAccessConfigBuilderFactory.java
│   │   │   │   │                   ├── context/
│   │   │   │   │                   │   ├── AuthenticationThreadLocalAccessor.java
│   │   │   │   │                   │   └── ThreadLocalReactiveAuthenticationSupplier.java
│   │   │   │   │                   ├── define/
│   │   │   │   │                   │   ├── AopAuthorizeDefinition.java
│   │   │   │   │                   │   ├── AuthorizeDefinition.java
│   │   │   │   │                   │   ├── AuthorizeDefinitionContext.java
│   │   │   │   │                   │   ├── AuthorizeDefinitionCustomizer.java
│   │   │   │   │                   │   ├── AuthorizeDefinitionInitializedEvent.java
│   │   │   │   │                   │   ├── AuthorizingContext.java
│   │   │   │   │                   │   ├── CompositeAuthorizeDefinitionCustomizer.java
│   │   │   │   │                   │   ├── DataAccessDefinition.java
│   │   │   │   │                   │   ├── DataAccessTypeDefinition.java
│   │   │   │   │                   │   ├── DimensionDefinition.java
│   │   │   │   │                   │   ├── DimensionsDefinition.java
│   │   │   │   │                   │   ├── HandleType.java
│   │   │   │   │                   │   ├── MergedAuthorizeDefinition.java
│   │   │   │   │                   │   ├── Phased.java
│   │   │   │   │                   │   ├── ResourceActionDefinition.java
│   │   │   │   │                   │   ├── ResourceDefinition.java
│   │   │   │   │                   │   └── ResourcesDefinition.java
│   │   │   │   │                   ├── dimension/
│   │   │   │   │                   │   ├── DimensionManager.java
│   │   │   │   │                   │   ├── DimensionUserBind.java
│   │   │   │   │                   │   ├── DimensionUserBindProvider.java
│   │   │   │   │                   │   └── DimensionUserDetail.java
│   │   │   │   │                   ├── events/
│   │   │   │   │                   │   ├── AbstractAuthorizationEvent.java
│   │   │   │   │                   │   ├── AuthorizationBeforeEvent.java
│   │   │   │   │                   │   ├── AuthorizationDecodeEvent.java
│   │   │   │   │                   │   ├── AuthorizationEvent.java
│   │   │   │   │                   │   ├── AuthorizationExitEvent.java
│   │   │   │   │                   │   ├── AuthorizationFailedEvent.java
│   │   │   │   │                   │   ├── AuthorizationInitializeEvent.java
│   │   │   │   │                   │   ├── AuthorizationSuccessEvent.java
│   │   │   │   │                   │   └── AuthorizingHandleBeforeEvent.java
│   │   │   │   │                   ├── exception/
│   │   │   │   │                   │   ├── AccessDenyException.java
│   │   │   │   │                   │   ├── AuthenticationException.java
│   │   │   │   │                   │   ├── NeedTwoFactorException.java
│   │   │   │   │                   │   └── UnAuthorizedException.java
│   │   │   │   │                   ├── setting/
│   │   │   │   │                   │   ├── SettingNullValueHolder.java
│   │   │   │   │                   │   ├── SettingValueHolder.java
│   │   │   │   │                   │   ├── StringSourceSettingHolder.java
│   │   │   │   │                   │   ├── UserSettingManager.java
│   │   │   │   │                   │   └── UserSettingPermission.java
│   │   │   │   │                   ├── simple/
│   │   │   │   │                   │   ├── AbstractDataAccessConfig.java
│   │   │   │   │                   │   ├── CompositeReactiveAuthenticationManager.java
│   │   │   │   │                   │   ├── DefaultAuthorizationAutoConfiguration.java
│   │   │   │   │                   │   ├── DefaultDimensionManager.java
│   │   │   │   │                   │   ├── DimensionDataAccessConfig.java
│   │   │   │   │                   │   ├── PlainTextUsernamePasswordAuthenticationRequest.java
│   │   │   │   │                   │   ├── SimpleAuthentication.java
│   │   │   │   │                   │   ├── SimpleDimension.java
│   │   │   │   │                   │   ├── SimpleDimensionType.java
│   │   │   │   │                   │   ├── SimpleFieldFilterDataAccessConfig.java
│   │   │   │   │                   │   ├── SimpleOwnCreatedDataAccessConfig.java
│   │   │   │   │                   │   ├── SimplePermission.java
│   │   │   │   │                   │   ├── SimpleRole.java
│   │   │   │   │                   │   ├── SimpleUser.java
│   │   │   │   │                   │   └── builder/
│   │   │   │   │                   │       ├── DataAccessConfigConverter.java
│   │   │   │   │                   │       ├── SimpleAuthenticationBuilder.java
│   │   │   │   │                   │       ├── SimpleAuthenticationBuilderFactory.java
│   │   │   │   │                   │       ├── SimpleDataAccessConfigBuilder.java
│   │   │   │   │                   │       └── SimpleDataAccessConfigBuilderFactory.java
│   │   │   │   │                   ├── token/
│   │   │   │   │                   │   ├── AllopatricLoginMode.java
│   │   │   │   │                   │   ├── AuthenticationUserToken.java
│   │   │   │   │                   │   ├── DefaultUserTokenManager.java
│   │   │   │   │                   │   ├── LocalAuthenticationUserToken.java
│   │   │   │   │                   │   ├── LocalUserToken.java
│   │   │   │   │                   │   ├── ParsedToken.java
│   │   │   │   │                   │   ├── ReactiveTokenAuthenticationSupplier.java
│   │   │   │   │                   │   ├── SimpleParsedToken.java
│   │   │   │   │                   │   ├── ThirdPartAuthenticationManager.java
│   │   │   │   │                   │   ├── ThirdPartReactiveAuthenticationManager.java
│   │   │   │   │                   │   ├── TokenAuthenticationManager.java
│   │   │   │   │                   │   ├── TokenState.java
│   │   │   │   │                   │   ├── UserToken.java
│   │   │   │   │                   │   ├── UserTokenAuthenticationSupplier.java
│   │   │   │   │                   │   ├── UserTokenBeforeCreateEvent.java
│   │   │   │   │                   │   ├── UserTokenHolder.java
│   │   │   │   │                   │   ├── UserTokenManager.java
│   │   │   │   │                   │   ├── UserTokenReactiveAuthenticationSupplier.java
│   │   │   │   │                   │   ├── event/
│   │   │   │   │                   │   │   ├── UserTokenChangedEvent.java
│   │   │   │   │                   │   │   ├── UserTokenCreatedEvent.java
│   │   │   │   │                   │   │   └── UserTokenRemovedEvent.java
│   │   │   │   │                   │   └── redis/
│   │   │   │   │                   │       ├── RedisTokenAuthenticationManager.java
│   │   │   │   │                   │       ├── RedisUserTokenManager.java
│   │   │   │   │                   │       ├── SimpleAuthenticationUserToken.java
│   │   │   │   │                   │       └── SimpleUserToken.java
│   │   │   │   │                   └── twofactor/
│   │   │   │   │                       ├── TwoFactorToken.java
│   │   │   │   │                       ├── TwoFactorTokenManager.java
│   │   │   │   │                       ├── TwoFactorValidator.java
│   │   │   │   │                       ├── TwoFactorValidatorManager.java
│   │   │   │   │                       ├── TwoFactorValidatorProvider.java
│   │   │   │   │                       └── defaults/
│   │   │   │   │                           ├── DefaultTwoFactorValidator.java
│   │   │   │   │                           ├── DefaultTwoFactorValidatorManager.java
│   │   │   │   │                           ├── DefaultTwoFactorValidatorProvider.java
│   │   │   │   │                           ├── HashMapTwoFactorTokenManager.java
│   │   │   │   │                           └── UnsupportedTwoFactorValidator.java
│   │   │   │   ├── java9/
│   │   │   │   │   └── module-info.java
│   │   │   │   └── resources/
│   │   │   │       ├── META-INF/
│   │   │   │       │   ├── services/
│   │   │   │       │   │   └── io.micrometer.context.ThreadLocalAccessor
│   │   │   │       │   └── spring/
│   │   │   │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │   │   │       └── i18n/
│   │   │   │           └── authentication/
│   │   │   │               ├── messages_en.properties
│   │   │   │               └── messages_zh.properties
│   │   │   └── test/
│   │   │       └── java/
│   │   │           └── org/
│   │   │               └── hswebframework/
│   │   │                   └── web/
│   │   │                       └── authorization/
│   │   │                           ├── AuthenticationTests.java
│   │   │                           ├── UserTokenManagerTests.java
│   │   │                           ├── context/
│   │   │                           │   └── AuthenticationThreadLocalAccessorTest.java
│   │   │                           ├── define/
│   │   │                           │   └── MergedAuthorizeDefinitionTest.java
│   │   │                           ├── simple/
│   │   │                           │   ├── DefaultDimensionManagerTest.java
│   │   │                           │   └── SimpleAuthenticationTest.java
│   │   │                           ├── token/
│   │   │                           │   └── redis/
│   │   │                           │       └── RedisUserTokenManagerTest.java
│   │   │                           └── twofactor/
│   │   │                               └── defaults/
│   │   │                                   └── HashMapTwoFactorTokenManagerTest.java
│   │   └── token.md
│   ├── hsweb-authorization-basic/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── authorization/
│   │       │   │                   └── basic/
│   │       │   │                       ├── aop/
│   │       │   │                       │   ├── AopAuthorizingController.java
│   │       │   │                       │   ├── AopMethodAuthorizeDefinitionCustomizerParser.java
│   │       │   │                       │   ├── AopMethodAuthorizeDefinitionParser.java
│   │       │   │                       │   └── DefaultAopMethodAuthorizeDefinitionParser.java
│   │       │   │                       ├── configuration/
│   │       │   │                       │   ├── AopAuthorizeAutoConfiguration.java
│   │       │   │                       │   ├── AuthorizingHandlerAutoConfiguration.java
│   │       │   │                       │   ├── BasicAuthorizationTokenParser.java
│   │       │   │                       │   ├── EnableAopAuthorize.java
│   │       │   │                       │   └── WebMvcAuthorizingConfiguration.java
│   │       │   │                       ├── define/
│   │       │   │                       │   ├── AopAuthorizeDefinitionParser.java
│   │       │   │                       │   ├── DefaultBasicAuthorizeDefinition.java
│   │       │   │                       │   ├── EmptyAuthorizeDefinition.java
│   │       │   │                       │   └── MergedAuthorizeDefinition.java
│   │       │   │                       ├── embed/
│   │       │   │                       │   ├── EmbedAuthenticationInfo.java
│   │       │   │                       │   ├── EmbedAuthenticationManager.java
│   │       │   │                       │   ├── EmbedAuthenticationProperties.java
│   │       │   │                       │   └── EmbedReactiveAuthenticationManager.java
│   │       │   │                       ├── handler/
│   │       │   │                       │   ├── AuthorizationLoginLoggerInfoHandler.java
│   │       │   │                       │   ├── AuthorizingHandler.java
│   │       │   │                       │   ├── DefaultAuthorizingHandler.java
│   │       │   │                       │   ├── UserAllowPermissionHandler.java
│   │       │   │                       │   └── access/
│   │       │   │                       │       └── DimensionDataAccessHandler.java
│   │       │   │                       └── web/
│   │       │   │                           ├── AuthorizationController.java
│   │       │   │                           ├── AuthorizedToken.java
│   │       │   │                           ├── BearerTokenParser.java
│   │       │   │                           ├── DefaultUserTokenGenPar.java
│   │       │   │                           ├── GeneratedToken.java
│   │       │   │                           ├── ReactiveUserTokenController.java
│   │       │   │                           ├── ReactiveUserTokenGenerator.java
│   │       │   │                           ├── ReactiveUserTokenParser.java
│   │       │   │                           ├── ServletUserTokenGenPar.java
│   │       │   │                           ├── SessionIdUserTokenGenerator.java
│   │       │   │                           ├── SessionIdUserTokenParser.java
│   │       │   │                           ├── UserOnSignIn.java
│   │       │   │                           ├── UserOnSignOut.java
│   │       │   │                           ├── UserTokenForTypeParser.java
│   │       │   │                           ├── UserTokenGenerator.java
│   │       │   │                           ├── UserTokenParser.java
│   │       │   │                           ├── UserTokenWebFilter.java
│   │       │   │                           └── WebUserTokenInterceptor.java
│   │       │   ├── java9/
│   │       │   │   └── module-info.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           ├── additional-spring-configuration-metadata.json
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── authorization/
│   │           │                   └── basic/
│   │           │                       ├── aop/
│   │           │                       │   ├── AopAuthorizingControllerTest.java
│   │           │                       │   ├── FluxTestController.java
│   │           │                       │   ├── TestApplication.java
│   │           │                       │   ├── TestController.java
│   │           │                       │   ├── TestDataAccess.java
│   │           │                       │   └── TestEntity.java
│   │           │                       ├── define/
│   │           │                       │   └── DefaultBasicAuthorizeDefinitionTest.java
│   │           │                       └── web/
│   │           │                           └── CompositeReactiveAuthenticationManagerTest.java
│   │           └── resources/
│   │               └── application.yml
│   ├── hsweb-authorization-oauth2/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── oauth2/
│   │       │   │                   ├── ErrorType.java
│   │       │   │                   ├── GrantType.java
│   │       │   │                   ├── OAuth2Constants.java
│   │       │   │                   ├── OAuth2Exception.java
│   │       │   │                   ├── ResponseType.java
│   │       │   │                   └── server/
│   │       │   │                       ├── AccessToken.java
│   │       │   │                       ├── AccessTokenManager.java
│   │       │   │                       ├── OAuth2Client.java
│   │       │   │                       ├── OAuth2ClientManager.java
│   │       │   │                       ├── OAuth2GrantService.java
│   │       │   │                       ├── OAuth2Granter.java
│   │       │   │                       ├── OAuth2Properties.java
│   │       │   │                       ├── OAuth2Request.java
│   │       │   │                       ├── OAuth2Response.java
│   │       │   │                       ├── OAuth2ServerAutoConfiguration.java
│   │       │   │                       ├── ScopePredicate.java
│   │       │   │                       ├── auth/
│   │       │   │                       │   └── ReactiveOAuth2AccessTokenParser.java
│   │       │   │                       ├── code/
│   │       │   │                       │   ├── AuthorizationCodeCache.java
│   │       │   │                       │   ├── AuthorizationCodeGranter.java
│   │       │   │                       │   ├── AuthorizationCodeRequest.java
│   │       │   │                       │   ├── AuthorizationCodeResponse.java
│   │       │   │                       │   ├── AuthorizationCodeTokenRequest.java
│   │       │   │                       │   └── DefaultAuthorizationCodeGranter.java
│   │       │   │                       ├── credential/
│   │       │   │                       │   ├── ClientCredentialGranter.java
│   │       │   │                       │   ├── ClientCredentialRequest.java
│   │       │   │                       │   └── DefaultClientCredentialGranter.java
│   │       │   │                       ├── event/
│   │       │   │                       │   └── OAuth2GrantedEvent.java
│   │       │   │                       ├── impl/
│   │       │   │                       │   ├── CompositeOAuth2GrantService.java
│   │       │   │                       │   ├── RedisAccessToken.java
│   │       │   │                       │   └── RedisAccessTokenManager.java
│   │       │   │                       ├── refresh/
│   │       │   │                       │   ├── DefaultRefreshTokenGranter.java
│   │       │   │                       │   ├── RefreshTokenGranter.java
│   │       │   │                       │   └── RefreshTokenRequest.java
│   │       │   │                       ├── utils/
│   │       │   │                       │   └── OAuth2ScopeUtils.java
│   │       │   │                       └── web/
│   │       │   │                           └── OAuth2AuthorizeController.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── oauth2/
│   │           │                   └── server/
│   │           │                       ├── OAuth2ClientTest.java
│   │           │                       ├── RedisHelper.java
│   │           │                       ├── code/
│   │           │                       │   └── DefaultAuthorizationCodeGranterTest.java
│   │           │                       ├── impl/
│   │           │                       │   └── RedisAccessTokenManagerTest.java
│   │           │                       ├── utils/
│   │           │                       │   └── OAuth2ScopeUtilsTest.java
│   │           │                       └── web/
│   │           │                           └── OAuth2AuthorizeControllerTest.java
│   │           └── resources/
│   │               └── logback.xml
│   └── pom.xml
├── hsweb-commons/
│   ├── hsweb-commons-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── api/
│   │       │   │                   └── crud/
│   │       │   │                       └── entity/
│   │       │   │                           ├── Entity.java
│   │       │   │                           ├── EntityFactory.java
│   │       │   │                           ├── EntityFactoryHolder.java
│   │       │   │                           ├── EntityFactoryHolderConfiguration.java
│   │       │   │                           ├── ExtendableEntity.java
│   │       │   │                           ├── ExtendableTreeSortSupportEntity.java
│   │       │   │                           ├── GenericEntity.java
│   │       │   │                           ├── GenericI18nEntity.java
│   │       │   │                           ├── GenericTreeSortSupportEntity.java
│   │       │   │                           ├── ImplementFor.java
│   │       │   │                           ├── PagerResult.java
│   │       │   │                           ├── QueryNoPagingOperation.java
│   │       │   │                           ├── QueryOperation.java
│   │       │   │                           ├── QueryParamEntity.java
│   │       │   │                           ├── RecordCreationEntity.java
│   │       │   │                           ├── RecordModifierEntity.java
│   │       │   │                           ├── SortSupportEntity.java
│   │       │   │                           ├── TermExpressionParser.java
│   │       │   │                           ├── TransactionManagers.java
│   │       │   │                           ├── TreeSortSupportEntity.java
│   │       │   │                           ├── TreeSupportEntity.java
│   │       │   │                           └── TreeUtils.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── api/
│   │                               └── crud/
│   │                                   └── entity/
│   │                                       ├── ExtendableEntityTest.java
│   │                                       ├── TermExpressionParserTest.java
│   │                                       └── TreeUtilsTest.java
│   ├── hsweb-commons-crud/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── crud/
│   │       │   │                   ├── annotation/
│   │       │   │                   │   ├── DDL.java
│   │       │   │                   │   ├── EnableEasyormRepository.java
│   │       │   │                   │   ├── EnableEntityEvent.java
│   │       │   │                   │   └── Reactive.java
│   │       │   │                   ├── configuration/
│   │       │   │                   │   ├── AutoDDLProcessor.java
│   │       │   │                   │   ├── CompositeEntityTableMetadataResolver.java
│   │       │   │                   │   ├── DefaultEntityResultWrapperFactory.java
│   │       │   │                   │   ├── DetectEntityColumnMapping.java
│   │       │   │                   │   ├── DialectProvider.java
│   │       │   │                   │   ├── DialectProviders.java
│   │       │   │                   │   ├── EasyormConfiguration.java
│   │       │   │                   │   ├── EasyormProperties.java
│   │       │   │                   │   ├── EasyormRepositoryRegistrar.java
│   │       │   │                   │   ├── EntityFactoryConfiguration.java
│   │       │   │                   │   ├── EntityInfo.java
│   │       │   │                   │   ├── EntityResultWrapperFactory.java
│   │       │   │                   │   ├── EntityTableMetadataResolver.java
│   │       │   │                   │   ├── JdbcSqlExecutorConfiguration.java
│   │       │   │                   │   ├── R2dbcSqlExecutorConfiguration.java
│   │       │   │                   │   ├── ReactiveRepositoryFactoryBean.java
│   │       │   │                   │   ├── SyncRepositoryFactoryBean.java
│   │       │   │                   │   └── TableMetadataCustomizer.java
│   │       │   │                   ├── entity/
│   │       │   │                   │   └── factory/
│   │       │   │                   │       ├── DefaultMapperFactory.java
│   │       │   │                   │       ├── DefaultPropertyCopier.java
│   │       │   │                   │       ├── EntityMappingCustomizer.java
│   │       │   │                   │       ├── MapperEntityFactory.java
│   │       │   │                   │       └── PropertyCopier.java
│   │       │   │                   ├── events/
│   │       │   │                   │   ├── CompositeEventListener.java
│   │       │   │                   │   ├── CreatorEventListener.java
│   │       │   │                   │   ├── DefaultEntityEventListenerConfigure.java
│   │       │   │                   │   ├── EntityBeforeCreateEvent.java
│   │       │   │                   │   ├── EntityBeforeDeleteEvent.java
│   │       │   │                   │   ├── EntityBeforeModifyEvent.java
│   │       │   │                   │   ├── EntityBeforeQueryEvent.java
│   │       │   │                   │   ├── EntityBeforeSaveEvent.java
│   │       │   │                   │   ├── EntityCreatedEvent.java
│   │       │   │                   │   ├── EntityDDLEvent.java
│   │       │   │                   │   ├── EntityDeletedEvent.java
│   │       │   │                   │   ├── EntityEventHelper.java
│   │       │   │                   │   ├── EntityEventListener.java
│   │       │   │                   │   ├── EntityEventListenerConfigure.java
│   │       │   │                   │   ├── EntityEventListenerCustomizer.java
│   │       │   │                   │   ├── EntityEventPhase.java
│   │       │   │                   │   ├── EntityEventType.java
│   │       │   │                   │   ├── EntityModifyEvent.java
│   │       │   │                   │   ├── EntityPrepareCreateEvent.java
│   │       │   │                   │   ├── EntityPrepareModifyEvent.java
│   │       │   │                   │   ├── EntityPrepareSaveEvent.java
│   │       │   │                   │   ├── EntitySavedEvent.java
│   │       │   │                   │   ├── SqlExpressionInvoker.java
│   │       │   │                   │   ├── ValidateEventListener.java
│   │       │   │                   │   └── expr/
│   │       │   │                   │       ├── AbstractSqlExpressionInvoker.java
│   │       │   │                   │       └── SpelSqlExpressionInvoker.java
│   │       │   │                   ├── exception/
│   │       │   │                   │   └── DatabaseExceptionAnalyzerReporter.java
│   │       │   │                   ├── generator/
│   │       │   │                   │   ├── CurrentTimeGenerator.java
│   │       │   │                   │   ├── DefaultIdGenerator.java
│   │       │   │                   │   ├── Generators.java
│   │       │   │                   │   ├── MD5Generator.java
│   │       │   │                   │   ├── RandomIdGenerator.java
│   │       │   │                   │   └── SnowFlakeStringIdGenerator.java
│   │       │   │                   ├── query/
│   │       │   │                   │   ├── DefaultQueryHelper.java
│   │       │   │                   │   ├── JoinConditionalSpec.java
│   │       │   │                   │   ├── JoinNestConditionalSpec.java
│   │       │   │                   │   ├── JoinOnSpec.java
│   │       │   │                   │   ├── QueryAnalyzer.java
│   │       │   │                   │   ├── QueryAnalyzerImpl.java
│   │       │   │                   │   ├── QueryHelper.java
│   │       │   │                   │   ├── QueryHelperUtils.java
│   │       │   │                   │   └── ToHumpMap.java
│   │       │   │                   ├── service/
│   │       │   │                   │   ├── CrudService.java
│   │       │   │                   │   ├── EnableCacheReactiveCrudService.java
│   │       │   │                   │   ├── GenericCrudService.java
│   │       │   │                   │   ├── GenericReactiveCacheSupportCrudService.java
│   │       │   │                   │   ├── GenericReactiveCrudService.java
│   │       │   │                   │   ├── GenericReactiveTreeSupportCrudService.java
│   │       │   │                   │   ├── GenericTreeSupportCrudService.java
│   │       │   │                   │   ├── ReactiveCrudService.java
│   │       │   │                   │   ├── ReactiveTreeSortEntityService.java
│   │       │   │                   │   ├── ReactiveTreeSortServiceHelper.java
│   │       │   │                   │   ├── SyncTreeSortServiceHelper.java
│   │       │   │                   │   ├── TreeSortEntityService.java
│   │       │   │                   │   └── TreeSortServiceHelper.java
│   │       │   │                   ├── sql/
│   │       │   │                   │   ├── DefaultJdbcExecutor.java
│   │       │   │                   │   ├── DefaultJdbcReactiveExecutor.java
│   │       │   │                   │   ├── DefaultR2dbcExecutor.java
│   │       │   │                   │   └── terms/
│   │       │   │                   │       └── TreeChildTermBuilder.java
│   │       │   │                   ├── utils/
│   │       │   │                   │   └── TransactionUtils.java
│   │       │   │                   └── web/
│   │       │   │                       ├── CommonErrorControllerAdvice.java
│   │       │   │                       ├── CommonWebFluxConfiguration.java
│   │       │   │                       ├── CommonWebMvcConfiguration.java
│   │       │   │                       ├── CommonWebMvcErrorControllerAdvice.java
│   │       │   │                       ├── CrudController.java
│   │       │   │                       ├── DeleteController.java
│   │       │   │                       ├── QueryController.java
│   │       │   │                       ├── R2dbcErrorControllerAdvice.java
│   │       │   │                       ├── ResponseMessage.java
│   │       │   │                       ├── ResponseMessageWrapper.java
│   │       │   │                       ├── ResponseMessageWrapperAdvice.java
│   │       │   │                       ├── SaveController.java
│   │       │   │                       ├── ServiceCrudController.java
│   │       │   │                       ├── ServiceDeleteController.java
│   │       │   │                       ├── ServiceQueryController.java
│   │       │   │                       ├── ServiceSaveController.java
│   │       │   │                       ├── TreeServiceQueryController.java
│   │       │   │                       └── reactive/
│   │       │   │                           ├── ReactiveCrudController.java
│   │       │   │                           ├── ReactiveDeleteController.java
│   │       │   │                           ├── ReactiveQueryController.java
│   │       │   │                           ├── ReactiveSaveController.java
│   │       │   │                           ├── ReactiveServiceCrudController.java
│   │       │   │                           ├── ReactiveServiceDeleteController.java
│   │       │   │                           ├── ReactiveServiceQueryController.java
│   │       │   │                           ├── ReactiveServiceSaveController.java
│   │       │   │                           └── ReactiveTreeServiceQueryController.java
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   ├── services/
│   │       │       │   │   └── org.hswebframework.web.exception.analyzer.ExceptionAnalyzer
│   │       │       │   └── spring/
│   │       │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │       └── i18n/
│   │       │           └── commons/
│   │       │               ├── messages_en.properties
│   │       │               └── messages_zh.properties
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── crud/
│   │           │                   ├── CrudTests.java
│   │           │                   ├── TestApplication.java
│   │           │                   ├── entity/
│   │           │                   │   ├── CustomTestEntity.java
│   │           │                   │   ├── EventTestEntity.java
│   │           │                   │   ├── TestEntity.java
│   │           │                   │   └── TestTreeSortEntity.java
│   │           │                   ├── events/
│   │           │                   │   ├── DefaultEntityEventListenerConfigureTest.java
│   │           │                   │   ├── EntityEventListenerTest.java
│   │           │                   │   ├── TestEntityListener.java
│   │           │                   │   └── expr/
│   │           │                   │       └── SpelSqlExpressionInvokerTest.java
│   │           │                   ├── exception/
│   │           │                   │   └── DatabaseExceptionAnalyzerReporterTest.java
│   │           │                   ├── query/
│   │           │                   │   ├── DefaultQueryHelperTest.java
│   │           │                   │   ├── QueryAnalyzerImplTest.java
│   │           │                   │   └── QueryHelperUtilsTest.java
│   │           │                   └── service/
│   │           │                       ├── CustomTestCustom.java
│   │           │                       ├── GenericReactiveCacheSupportCrudServiceTest.java
│   │           │                       ├── ReactiveTreeSortEntityServiceTest.java
│   │           │                       ├── TestCacheEntityService.java
│   │           │                       ├── TestEntityService.java
│   │           │                       ├── TestTreeChildTermBuilder.java
│   │           │                       └── TestTreeSortEntityService.java
│   │           └── resources/
│   │               └── application.yml
│   └── pom.xml
├── hsweb-concurrent/
│   ├── hsweb-concurrent-cache/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── cache/
│   │       │   │                   ├── ReactiveCache.java
│   │       │   │                   ├── ReactiveCacheManager.java
│   │       │   │                   ├── ReactiveCacheResolver.java
│   │       │   │                   ├── configuration/
│   │       │   │                   │   ├── ReactiveCacheManagerConfiguration.java
│   │       │   │                   │   └── ReactiveCacheProperties.java
│   │       │   │                   └── supports/
│   │       │   │                       ├── AbstractReactiveCache.java
│   │       │   │                       ├── AbstractReactiveCacheManager.java
│   │       │   │                       ├── CaffeineReactiveCache.java
│   │       │   │                       ├── CaffeineReactiveCacheManager.java
│   │       │   │                       ├── GuavaReactiveCache.java
│   │       │   │                       ├── GuavaReactiveCacheManager.java
│   │       │   │                       ├── NullValue.java
│   │       │   │                       ├── RedisLocalReactiveCacheManager.java
│   │       │   │                       ├── RedisReactiveCache.java
│   │       │   │                       └── UnSupportedReactiveCache.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── cache/
│   │           │                   ├── CaffeineReactiveCacheManagerTest.java
│   │           │                   ├── GuavaReactiveCacheManagerTest.java
│   │           │                   ├── RedisReactiveCacheManagerTest.java
│   │           │                   └── TestApplication.java
│   │           └── resources/
│   │               └── application-redis.yml
│   └── pom.xml
├── hsweb-core/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── hswebframework/
│       │   │           └── web/
│       │   │               ├── CodeConstants.java
│       │   │               ├── aop/
│       │   │               │   ├── MethodInterceptorContext.java
│       │   │               │   └── MethodInterceptorHolder.java
│       │   │               ├── bean/
│       │   │               │   ├── BeanFactory.java
│       │   │               │   ├── ClassDescription.java
│       │   │               │   ├── ClassDescriptions.java
│       │   │               │   ├── CompareUtils.java
│       │   │               │   ├── Converter.java
│       │   │               │   ├── Copier.java
│       │   │               │   ├── DefaultToStringOperator.java
│       │   │               │   ├── Diff.java
│       │   │               │   ├── ExtendableToBeanCopier.java
│       │   │               │   ├── ExtendableToMapCopier.java
│       │   │               │   ├── ExtendableUtils.java
│       │   │               │   ├── FastBeanCopier.java
│       │   │               │   ├── MapToExtendableCopier.java
│       │   │               │   ├── SingleValueMap.java
│       │   │               │   ├── ToString.java
│       │   │               │   └── ToStringOperator.java
│       │   │               ├── context/
│       │   │               │   ├── Context.java
│       │   │               │   ├── ContextHolder.java
│       │   │               │   ├── ContextKey.java
│       │   │               │   ├── ContextUtils.java
│       │   │               │   ├── MapContext.java
│       │   │               │   └── ThreadLocalContextHolderSupport.java
│       │   │               ├── convert/
│       │   │               │   └── CustomMessageConverter.java
│       │   │               ├── dict/
│       │   │               │   ├── ClassDictDefine.java
│       │   │               │   ├── Dict.java
│       │   │               │   ├── DictDefine.java
│       │   │               │   ├── DictDefineRepository.java
│       │   │               │   ├── EnumDict.java
│       │   │               │   ├── I18nEnumDict.java
│       │   │               │   ├── ItemDefine.java
│       │   │               │   └── defaults/
│       │   │               │       ├── DefaultClassDictDefine.java
│       │   │               │       ├── DefaultDictDefine.java
│       │   │               │       ├── DefaultDictDefineRepository.java
│       │   │               │       └── DefaultItemDefine.java
│       │   │               ├── enums/
│       │   │               │   └── TrueOrFalse.java
│       │   │               ├── event/
│       │   │               │   ├── AsyncEvent.java
│       │   │               │   ├── AsyncEventHooks.java
│       │   │               │   ├── DefaultAsyncEvent.java
│       │   │               │   └── GenericsPayloadApplicationEvent.java
│       │   │               ├── exception/
│       │   │               │   ├── BusinessException.java
│       │   │               │   ├── I18nSupportException.java
│       │   │               │   ├── NotFoundException.java
│       │   │               │   ├── TraceSourceException.java
│       │   │               │   ├── ValidationException.java
│       │   │               │   └── analyzer/
│       │   │               │       ├── ExceptionAnalyzer.java
│       │   │               │       ├── ExceptionAnalyzerReporter.java
│       │   │               │       └── ExceptionAnalyzers.java
│       │   │               ├── i18n/
│       │   │               │   ├── ContextLocaleResolver.java
│       │   │               │   ├── I18nSupportEntity.java
│       │   │               │   ├── I18nSupportUtils.java
│       │   │               │   ├── LocaleThreadLocalAccessor.java
│       │   │               │   ├── LocaleUtils.java
│       │   │               │   ├── MessageSourceInitializer.java
│       │   │               │   ├── MultipleI18nSupportEntity.java
│       │   │               │   ├── SingleI18nSupportEntity.java
│       │   │               │   ├── UnsupportedMessageSource.java
│       │   │               │   └── WebFluxLocaleFilter.java
│       │   │               ├── id/
│       │   │               │   ├── IDGenerator.java
│       │   │               │   ├── RandomIdGenerator.java
│       │   │               │   └── SnowflakeIdGenerator.java
│       │   │               ├── logger/
│       │   │               │   └── ReactiveLogger.java
│       │   │               ├── proxy/
│       │   │               │   └── Proxy.java
│       │   │               ├── recycler/
│       │   │               │   ├── Recyclable.java
│       │   │               │   ├── Recycler.java
│       │   │               │   ├── RecyclerImpl.java
│       │   │               │   └── Recyclers.java
│       │   │               ├── utils/
│       │   │               │   ├── AnnotationUtils.java
│       │   │               │   ├── CollectionUtils.java
│       │   │               │   ├── DigestUtils.java
│       │   │               │   ├── DynamicArrayList.java
│       │   │               │   ├── ExpressionUtils.java
│       │   │               │   ├── FluxCache.java
│       │   │               │   ├── HttpParameterConverter.java
│       │   │               │   ├── ModuleUtils.java
│       │   │               │   ├── ReactiveWebUtils.java
│       │   │               │   ├── TemplateParser.java
│       │   │               │   └── WebUtils.java
│       │   │               ├── validator/
│       │   │               │   ├── CreateGroup.java
│       │   │               │   ├── UpdateGroup.java
│       │   │               │   └── ValidatorUtils.java
│       │   │               └── warn/
│       │   │                   └── Warning.java
│       │   ├── java9/
│       │   │   └── module-info.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       └── io.micrometer.context.ThreadLocalAccessor
│       │       └── i18n/
│       │           └── core/
│       │               ├── messages_en.properties
│       │               └── messages_zh.properties
│       └── test/
│           └── java/
│               └── org/
│                   └── hswebframework/
│                       └── web/
│                           ├── bean/
│                           │   ├── Color.java
│                           │   ├── CompareUtilsTest.java
│                           │   ├── DiffTest.java
│                           │   ├── FastBeanCopierTest.java
│                           │   ├── NestObject.java
│                           │   ├── Source.java
│                           │   └── Target.java
│                           ├── dict/
│                           │   ├── EnumDictTest.java
│                           │   ├── TestEnum.java
│                           │   └── TestEnumInteger.java
│                           ├── event/
│                           │   └── EventTest.java
│                           ├── exception/
│                           │   └── TraceSourceExceptionTest.java
│                           ├── i18n/
│                           │   ├── I18nSupportUtilsTest.java
│                           │   ├── LocaleThreadLocalAccessorTest.java
│                           │   ├── LocaleUtilsTest.java
│                           │   └── MultipleI18nSupportEntityTest.java
│                           ├── id/
│                           │   ├── IDGeneratorTests.java
│                           │   ├── RandomIdGeneratorTest.java
│                           │   └── SnowflakeIdGeneratorTest.java
│                           ├── logger/
│                           │   └── ReactiveLoggerTest.java
│                           ├── recycler/
│                           │   └── RecyclerImplTest.java
│                           ├── utils/
│                           │   ├── CollectionUtilsTest.java
│                           │   ├── DigestUtilsTest.java
│                           │   └── TemplateParserTest.java
│                           └── validator/
│                               └── ValidatorUtilsTest.java
├── hsweb-datasource/
│   ├── README.md
│   ├── hsweb-datasource-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── datasource/
│   │       │   │                   ├── AopDataSourceSwitcherAutoConfiguration.java
│   │       │   │                   ├── DataSourceHolder.java
│   │       │   │                   ├── DatabaseType.java
│   │       │   │                   ├── DynamicDataSource.java
│   │       │   │                   ├── DynamicDataSourceAutoConfiguration.java
│   │       │   │                   ├── DynamicDataSourceProxy.java
│   │       │   │                   ├── DynamicDataSourceService.java
│   │       │   │                   ├── HswebDataSourceProperties.java
│   │       │   │                   ├── JdbcDataSource.java
│   │       │   │                   ├── R2dbcDataSource.java
│   │       │   │                   ├── annotation/
│   │       │   │                   │   ├── UseDataSource.java
│   │       │   │                   │   └── UseDefaultDataSource.java
│   │       │   │                   ├── config/
│   │       │   │                   │   ├── DynamicDataSourceConfig.java
│   │       │   │                   │   ├── DynamicDataSourceConfigRepository.java
│   │       │   │                   │   └── InSpringDynamicDataSourceConfig.java
│   │       │   │                   ├── exception/
│   │       │   │                   │   ├── DataSourceClosedException.java
│   │       │   │                   │   └── DataSourceNotFoundException.java
│   │       │   │                   ├── strategy/
│   │       │   │                   │   ├── AnnotationDataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   ├── CachedDataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   ├── CachedTableSwitchStrategyMatcher.java
│   │       │   │                   │   ├── DataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   ├── ExpressionDataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   └── TableSwitchStrategyMatcher.java
│   │       │   │                   └── switcher/
│   │       │   │                       ├── DataSourceSwitcher.java
│   │       │   │                       ├── DefaultJdbcSwitcher.java
│   │       │   │                       ├── DefaultR2dbcSwicher.java
│   │       │   │                       ├── DefaultReactiveSwitcher.java
│   │       │   │                       ├── DefaultSwitcher.java
│   │       │   │                       ├── JdbcSwitcher.java
│   │       │   │                       ├── R2dbcSwitcher.java
│   │       │   │                       ├── ReactiveSwitcher.java
│   │       │   │                       ├── SchemaSwitcher.java
│   │       │   │                       ├── Switcher.java
│   │       │   │                       └── TableSwitcher.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── datasource/
│   │                               └── switcher/
│   │                                   ├── DefaultReactiveSwitcherTest.java
│   │                                   └── DefaultSwitcherTest.java
│   └── pom.xml
├── hsweb-logging/
│   ├── README.md
│   ├── hsweb-access-logging-aop/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── logging/
│   │                               └── aop/
│   │                                   ├── AccessLoggerParser.java
│   │                                   ├── AopAccessLoggerSupport.java
│   │                                   ├── AopAccessLoggerSupportAutoConfiguration.java
│   │                                   ├── DefaultAccessLoggerParser.java
│   │                                   ├── EnableAccessLogger.java
│   │                                   ├── ReactiveAopAccessLoggerSupport.java
│   │                                   ├── ResourceAccessLoggerParser.java
│   │                                   ├── Swagger3AccessLoggerParser.java
│   │                                   └── SwaggerAccessLoggerParser.java
│   ├── hsweb-access-logging-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── logging/
│   │                               ├── AccessLogger.java
│   │                               ├── AccessLoggerHolder.java
│   │                               ├── AccessLoggerInfo.java
│   │                               ├── AccessLoggerListener.java
│   │                               ├── LoggerDefine.java
│   │                               ├── RequestInfo.java
│   │                               └── events/
│   │                                   ├── AccessLoggerAfterEvent.java
│   │                                   └── AccessLoggerBeforeEvent.java
│   └── pom.xml
├── hsweb-starter/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── hswebframework/
│       │   │           └── web/
│       │   │               └── starter/
│       │   │                   ├── CorsAutoConfiguration.java
│       │   │                   ├── CorsProperties.java
│       │   │                   ├── i18n/
│       │   │                   │   ├── CompositeMessageSource.java
│       │   │                   │   └── I18nConfiguration.java
│       │   │                   ├── jackson/
│       │   │                   │   ├── CustomCodecsAutoConfiguration.java
│       │   │                   │   ├── CustomDeserializers.java
│       │   │                   │   ├── CustomJackson2JsonDecoder.java
│       │   │                   │   ├── CustomJackson2jsonEncoder.java
│       │   │                   │   ├── CustomMappingJackson2HttpMessageConverter.java
│       │   │                   │   ├── CustomTypeFactory.java
│       │   │                   │   └── Jackson2Tokenizer.java
│       │   │                   └── reporter/
│       │   │                       └── GenericExceptionReport.java
│       │   └── resources/
│       │       └── META-INF/
│       │           ├── spring/
│       │           │   └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│       │           └── spring.factories
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── hswebframework/
│           │           └── web/
│           │               └── starter/
│           │                   ├── initialize/
│           │                   │   ├── SystemInitializeTest.java
│           │                   │   └── TestApplication.java
│           │                   ├── jackson/
│           │                   │   ├── CustomJackson2JsonDecoderTest.java
│           │                   │   ├── CustomJackson2jsonEncoderTest.java
│           │                   │   └── CustomTypeFactoryTest.java
│           │                   └── reporter/
│           │                       └── GenericExceptionReportTest.java
│           └── resources/
│               ├── hsweb-starter.js
│               └── i18n/
│                   ├── messages_en_US.properties
│                   └── messages_zh_CN.properties
├── hsweb-system/
│   ├── README.md
│   ├── hsweb-system-authorization/
│   │   ├── README.md
│   │   ├── hsweb-system-authorization-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   └── java/
│   │   │       │       └── org/
│   │   │       │           └── hswebframework/
│   │   │       │               └── web/
│   │   │       │                   └── system/
│   │   │       │                       └── authorization/
│   │   │       │                           └── api/
│   │   │       │                               ├── PasswordEncoder.java
│   │   │       │                               ├── PasswordValidator.java
│   │   │       │                               ├── UserDimensionProvider.java
│   │   │       │                               ├── UsernameValidator.java
│   │   │       │                               ├── entity/
│   │   │       │                               │   ├── ActionEntity.java
│   │   │       │                               │   ├── AuthorizationSettingEntity.java
│   │   │       │                               │   ├── DataAccessEntity.java
│   │   │       │                               │   ├── DimensionEntity.java
│   │   │       │                               │   ├── DimensionTypeEntity.java
│   │   │       │                               │   ├── DimensionUserEntity.java
│   │   │       │                               │   ├── OptionalField.java
│   │   │       │                               │   ├── ParentPermission.java
│   │   │       │                               │   ├── PermissionEntity.java
│   │   │       │                               │   └── UserEntity.java
│   │   │       │                               ├── enums/
│   │   │       │                               │   └── DimensionUserFeature.java
│   │   │       │                               ├── event/
│   │   │       │                               │   ├── ClearUserAuthorizationCacheEvent.java
│   │   │       │                               │   ├── DimensionBindEvent.java
│   │   │       │                               │   ├── DimensionDeletedEvent.java
│   │   │       │                               │   ├── DimensionUnbindEvent.java
│   │   │       │                               │   ├── UserBeforeCreateEvent.java
│   │   │       │                               │   ├── UserCreatedEvent.java
│   │   │       │                               │   ├── UserDeletedEvent.java
│   │   │       │                               │   ├── UserModifiedEvent.java
│   │   │       │                               │   └── UserStateChangedEvent.java
│   │   │       │                               ├── request/
│   │   │       │                               │   └── SaveUserRequest.java
│   │   │       │                               └── service/
│   │   │       │                                   ├── UserService.java
│   │   │       │                                   └── reactive/
│   │   │       │                                       └── ReactiveUserService.java
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── hswebframework/
│   │   │                       └── web/
│   │   │                           └── system/
│   │   │                               └── authorization/
│   │   │                                   └── api/
│   │   │                                       └── UsernameValidatorTest.java
│   │   ├── hsweb-system-authorization-default/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── java/
│   │   │       │   │   └── org/
│   │   │       │   │       └── hswebframework/
│   │   │       │   │           └── web/
│   │   │       │   │               └── system/
│   │   │       │   │                   └── authorization/
│   │   │       │   │                       └── defaults/
│   │   │       │   │                           ├── configuration/
│   │   │       │   │                           │   ├── AuthorizationServiceAutoConfiguration.java
│   │   │       │   │                           │   ├── AuthorizationWebAutoConfiguration.java
│   │   │       │   │                           │   └── PermissionProperties.java
│   │   │       │   │                           ├── service/
│   │   │       │   │                           │   ├── AuthenticationInitializeCustomizer.java
│   │   │       │   │                           │   ├── AuthenticationInitializeProperties.java
│   │   │       │   │                           │   ├── DefaultAuthorizationSettingService.java
│   │   │       │   │                           │   ├── DefaultDimensionService.java
│   │   │       │   │                           │   ├── DefaultDimensionUserService.java
│   │   │       │   │                           │   ├── DefaultPermissionService.java
│   │   │       │   │                           │   ├── DefaultReactiveAuthenticationInitializeService.java
│   │   │       │   │                           │   ├── DefaultReactiveAuthenticationManager.java
│   │   │       │   │                           │   ├── DefaultReactiveUserService.java
│   │   │       │   │                           │   ├── DynamicDimension.java
│   │   │       │   │                           │   ├── PermissionSynchronization.java
│   │   │       │   │                           │   ├── RemoveUserTokenWhenUserDisabled.java
│   │   │       │   │                           │   └── terms/
│   │   │       │   │                           │       ├── DimensionTerm.java
│   │   │       │   │                           │       └── UserDimensionTerm.java
│   │   │       │   │                           └── webflux/
│   │   │       │   │                               ├── DimensionTypeResponse.java
│   │   │       │   │                               ├── WebFluxAuthorizationSettingController.java
│   │   │       │   │                               ├── WebFluxDimensionController.java
│   │   │       │   │                               ├── WebFluxDimensionTypeController.java
│   │   │       │   │                               ├── WebFluxDimensionUserController.java
│   │   │       │   │                               ├── WebFluxPermissionController.java
│   │   │       │   │                               └── WebFluxUserController.java
│   │   │       │   └── resources/
│   │   │       │       ├── META-INF/
│   │   │       │       │   └── spring/
│   │   │       │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │   │       │       └── i18n/
│   │   │       │           └── authentication-default/
│   │   │       │               ├── messages_en.properties
│   │   │       │               └── messages_zh.properties
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── hswebframework/
│   │   │           │           └── web/
│   │   │           │               └── system/
│   │   │           │                   └── authorization/
│   │   │           │                       └── defaults/
│   │   │           │                           └── service/
│   │   │           │                               ├── DefaultDimensionUserServiceTest.java
│   │   │           │                               └── reactive/
│   │   │           │                                   ├── DefaultReactiveAuthenticationManagerTest.java
│   │   │           │                                   ├── DefaultReactiveUserServiceTest.java
│   │   │           │                                   ├── ReactiveTestApplication.java
│   │   │           │                                   └── WebFluxPermissionControllerTest.java
│   │   │           └── resources/
│   │   │               └── application.yml
│   │   ├── hsweb-system-authorization-oauth2/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── java/
│   │   │       │   │   └── org/
│   │   │       │   │       └── hswebframework/
│   │   │       │   │           └── web/
│   │   │       │   │               └── oauth2/
│   │   │       │   │                   ├── configuration/
│   │   │       │   │                   │   └── OAuth2ClientManagerAutoConfiguration.java
│   │   │       │   │                   ├── entity/
│   │   │       │   │                   │   └── OAuth2ClientEntity.java
│   │   │       │   │                   ├── enums/
│   │   │       │   │                   │   └── OAuth2ClientState.java
│   │   │       │   │                   ├── service/
│   │   │       │   │                   │   ├── InDBOAuth2ClientManager.java
│   │   │       │   │                   │   └── OAuth2ClientService.java
│   │   │       │   │                   └── web/
│   │   │       │   │                       └── WebFluxOAuth2ClientController.java
│   │   │       │   └── resources/
│   │   │       │       └── META-INF/
│   │   │       │           └── spring/
│   │   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── hswebframework/
│   │   │           │           └── web/
│   │   │           │               └── oauth2/
│   │   │           │                   ├── ReactiveTestApplication.java
│   │   │           │                   ├── configuration/
│   │   │           │                   │   └── OAuth2ClientManagerAutoConfigurationTest.java
│   │   │           │                   └── service/
│   │   │           │                       └── OAuth2ClientServiceTest.java
│   │   │           └── resources/
│   │   │               └── application.yml
│   │   └── pom.xml
│   ├── hsweb-system-dictionary/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── dictionary/
│   │       │   │                   ├── configuration/
│   │       │   │                   │   ├── DictionaryAutoConfiguration.java
│   │       │   │                   │   └── DictionaryProperties.java
│   │       │   │                   ├── entity/
│   │       │   │                   │   ├── DictionaryEntity.java
│   │       │   │                   │   └── DictionaryItemEntity.java
│   │       │   │                   ├── event/
│   │       │   │                   │   └── ClearDictionaryCacheEvent.java
│   │       │   │                   ├── service/
│   │       │   │                   │   ├── CompositeDictDefineRepository.java
│   │       │   │                   │   ├── DefaultDictionaryItemService.java
│   │       │   │                   │   └── DefaultDictionaryService.java
│   │       │   │                   └── webflux/
│   │       │   │                       ├── WebfluxDictionaryController.java
│   │       │   │                       └── WebfluxDictionaryItemController.java
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   └── spring/
│   │       │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │       └── i18n/
│   │       │           └── dictionary/
│   │       │               ├── messages_en.properties
│   │       │               └── messages_zh.properties
│   │       └── test/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── dictionary/
│   │                               ├── ReactiveTestApplication.java
│   │                               ├── configuration/
│   │                               │   └── DictionaryAutoConfigurationTest.java
│   │                               └── service/
│   │                                   └── DefaultDictionaryItemServiceTest.java
│   ├── hsweb-system-file/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── file/
│   │       │   │                   ├── FileServiceConfiguration.java
│   │       │   │                   ├── FileUploadProperties.java
│   │       │   │                   ├── service/
│   │       │   │                   │   ├── FileStorageService.java
│   │       │   │                   │   └── LocalFileStorageService.java
│   │       │   │                   └── web/
│   │       │   │                       └── ReactiveFileController.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── file/
│   │           │                   ├── FileUploadPropertiesTest.java
│   │           │                   ├── service/
│   │           │                   │   └── LocalFileStorageServiceTest.java
│   │           │                   └── web/
│   │           │                       ├── ReactiveFileControllerTest.java
│   │           │                       └── TestApplication.java
│   │           └── resources/
│   │               └── test.json
│   └── pom.xml
├── mvnw
├── mvnw.cmd
└── pom.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: 提交Bug
about: 提交bug,帮助我们更好完善项目.
title: "[BUG]"
labels: bug
assignees: zhou-hao

---

# BUG 说明
简要说明bug情况

# 运行环境
java: 1.8.0_131
maven: 3.3.9
hsweb: 3.0.5
 
# 复现步骤

# 期望结果
此功能期望的执行结果

# 截图说明


================================================
FILE: .github/ISSUE_TEMPLATE/future.md
================================================
---
name: 需求 特性
about: 提出你想要的,帮助完善hsweb
title: "[需求]"
labels: 需求
assignees: zhou-hao

---

# 场景

# 需求说明


================================================
FILE: .github/ISSUE_TEMPLATE/qa.md
================================================
---
name: 疑问 帮助
about: 有任何疑问尽管提
title: "[疑问]"
labels: 帮助
assignees: zhou-hao

---

# 环境
java: 1.8.0_131
hsweb: 3.0.5

# 问题说明


================================================
FILE: .github/workflows/maven-publish-4x.yml
================================================
name: Auto Deploy 4.x to the Maven Repository
on:
  push:
    branches: ["master"]

jobs:
  publish:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node_version: [ 18.x ]
        #        os: [ubuntu-latest, windows-latest, macOS-latest]
        os: [ ubuntu-latest ]
    steps:
      - uses: actions/checkout@v4
        with:
            fetch-depth: '2'
      - run: echo ${{github.ref}}
      - name: Set up Repository info
        uses: actions/setup-java@v4
        with:
          java-version: '8'
          distribution: 'temurin'
      - name: Cache Maven Repository
        uses: actions/cache@v3
        with:
          path: ~/.m2
          key: ${{ runner.os }}-${{ hashFiles('**/pom.xml') }}
      - name: Create Maven settings.xml
        #uses: actions/cache@v3
        env:
          MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
        run: |
          mkdir -p ~/.m2
          echo "<settings>
                  <servers>
                    <server>
                      <id>snapshots</id>
                      <username>${MAVEN_USERNAME}</username>
                      <password>${MAVEN_PASSWORD}</password>
                    </server>
                  </servers>
                </settings>" > ~/.m2/settings.xml

          # Step 4: 构建并发布到 Maven 私有仓库
      - name: Build and Deploy to Maven
        run: mvn clean deploy -q -DskipTests -pl "$(./changes.sh)"


================================================
FILE: .github/workflows/maven-publish-5x.yml
================================================
name: Auto Deploy 5.x to the Maven Repository
on:
  push:
    branches: ["5.0.x"]

jobs:
  publish:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node_version: [ 18.x ]
        #        os: [ubuntu-latest, windows-latest, macOS-latest]
        os: [ ubuntu-latest ]
    steps:
      - uses: actions/checkout@v4
        with:
            fetch-depth: '2'
      - run: echo ${{github.ref}}
      - name: Set up Repository info
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Cache Maven Repository
        uses: actions/cache@v3
        with:
          path: ~/.m2
          key: ${{ runner.os }}-${{ hashFiles('**/pom.xml') }}
      - name: Create Maven settings.xml
        #uses: actions/cache@v3
        env:
          MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
          MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
        run: |
          mkdir -p ~/.m2
          echo "<settings>
                  <servers>
                    <server>
                      <id>snapshots</id>
                      <username>${MAVEN_USERNAME}</username>
                      <password>${MAVEN_PASSWORD}</password>
                    </server>
                  </servers>
                </settings>" > ~/.m2/settings.xml

          # Step 4: 构建并发布到 Maven 私有仓库
      - name: Build and Deploy to Maven
        run: mvn clean deploy -DskipTests -pl "$(./changes.sh)"


================================================
FILE: .github/workflows/pull_request.yml
================================================
name: Pull Request test master

on:
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Cache Maven Repository
      uses: actions/cache@v4.2.3
      with:
        path: ~/.m2
        key: ${{ runner.os }}-${{ hashFiles('**/pom.xml') }}
    - name: Build with Maven
      run: ./mvnw test -q


================================================
FILE: .github/workflows/pull_request_5x.yml
================================================
name: Pull Request test 5.0.x

on:
  pull_request:
    branches: [ 5.0.x ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 17
      uses: actions/setup-java@v1
      with:
        java-version: 17
    - name: Cache Maven Repository
      uses: actions/cache@v4.2.3
      with:
        path: ~/.m2
        key: ${{ runner.os }}-${{ hashFiles('**/pom.xml') }}
    - name: Build with Maven
      run: ./mvnw test -q


================================================
FILE: .gitignore
================================================
**/pom.xml.versionsBackup
**/target/
**/out/
**/log/
*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
.idea/
/nbproject
*.ipr
*.iws
*.iml

# Package Files #
*.jar
*.war
*.ear
*.log
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
**/transaction-logs/
pom.xml.versionsBackup
build/
!maven-wrapper.jar
.java-version

================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
distributionUrl=https://archive.apache.org/dist/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.zip

================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at admin@hsweb.me. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: CONTRIBUTING.md
================================================
# 贡献你的代码
1. fork 本仓库
2. 修改,增加代码
3. 执行`mvn test`通过
4. 提交`pull request`
5. 坐等审查
6. 合并

# BUG
如果知道导致bug的位置,你可以直接修改后`pull request`,也可以提交[issues](https://github.com/hs-web/hsweb-framework/issues/new).我们会尽快解决.

# 需求&优化
你可以通过issues提交你希望`hsweb`增加的特性以及功能优化,并可以在 [projects](https://github.com/hs-web/hsweb-framework/projects)中查看`hsweb`的开发进展以及计划.

# 社区&交流
你可以通过提交`issues`或者加入官方QQ群:[515649185](http://shang.qq.com/wpa/qunwpa?idkey=3d66b5dd14991d7645af694e7649b373f3a9ce1216131094c78cb2348d542c41)
以及发送邮件和我们取得联系.


================================================
FILE: ISSUE_TEMPLATE.md
================================================
1. 问题描述:
2. 复现步骤:
3. 日志内容:

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2020 http://hsweb.me

   Licensed 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.
 


================================================
FILE: README.md
================================================
# hsweb4 基于spring-boot2,全响应式的后台管理框架

[![Codecov](https://codecov.io/gh/hs-web/hsweb-framework/branch/4.0.x/graph/badge.svg)](https://codecov.io/gh/hs-web/hsweb-framework/branch/master)
[![Build Status](https://api.travis-ci.com/hs-web/hsweb-framework.svg?branch=4.0.x)](https://travis-ci.com/hs-web/hsweb-framework)
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=flat-square)](https://www.apache.org/licenses/LICENSE-2.0.html)

# 功能,特性

- [x] 基于[r2dbc](https://github.com/r2dbc) ,[easy-orm](https://github.com/hs-web/hsweb-easy-orm/tree/4.0.x) 的通用响应式CRUD
    - [x] H2,Mysql,SqlServer,PostgreSQL
- [x] 响应式r2dbc事务控制
- [x] 响应式权限控制,以及权限信息获取
    - [x] RBAC权限控制
    - [x] 数据权限控制
    - [ ] 双因子验证
- [x] 多维度权限管理功能
- [x] 响应式缓存
- [ ] 非响应式支持(mvc,jdbc)
- [ ] 内置业务功能
    - [x] 权限管理
        - [x] 用户管理
        - [x] 权限设置
        - [x] 权限分配
    - [ ] 文件上传
        - [x] 静态文件上传
        - [ ] 文件秒传
    - [x] 数据字典

# 示例

https://github.com/zhou-hao/hsweb4-examples

## 应用场景

1. 完全开源的后台管理系统.
2. 模块化的后台管理系统.
3. 功能可拓展的后台管理系统.
4. 集成各种常用功能的后台管理系统.
5. 前后分离的后台管理系统.

注意:
项目主要基于`spring-boot`,`spring-webflux`. 在使用`hsweb`之前,你应该对 [project-reactor](https://projectreactor.io/) ,
[spring-boot](https://github.com/spring-projects/spring-boot) 有一定的了解.

项目模块太多?不要被吓到.我们不推荐将本项目直接`clone`后修改,运行.而是使用maven依赖的方式使用`hsweb`. 选择自己需要的模块进行依赖,正式版发布后,所有模块都将发布到maven中央仓库.

## 文档

各个模块的使用方式查看对应模块下的 `README.md`,在使用之前, 你可以先粗略浏览一下各个模块,对每个模块的作用有大致的了解.

## 核心技术选型

1. Java 8
2. Maven3
3. Spring Boot 2.x
4. Project Reactor 响应式编程框架
5. hsweb easy orm 对r2dbc的orm封装

## 模块简介

| 模块       |     说明     |  
| ------------- |:----------:| 
|[hsweb-authorization](hsweb-authorization)|    权限控制    |
|[hsweb-commons](hsweb-commons) |   基础通用功能   | 
|[hsweb-concurrent](hsweb-concurrent)|  并发包,缓存,等  | 
|[hsweb-core](hsweb-core)| 框架核心,基础工具类 | 
|[hsweb-datasource](hsweb-datasource)|    数据源     | 
|[hsweb-logging](hsweb-logging)|     日志     |  
|[hsweb-starter](hsweb-starter)|   模块启动器    | 
|[hsweb-system](hsweb-system)| **系统常用功能** |

## 核心特性

1. 响应式,首个基于spring-webflux,r2dbc,从头到位的响应式.
2. DSL风格,可拓展的通用curd,支持前端直接传参数,无需担心任何sql注入.

```java
  //where name = #{name}
  createQuery()
          .where("name",name)
          .fetch();

          //update s_user set name = #{user.name} where id = #{user.id}
          createUpdate()
          .set(user::getName)
          .where(user::getId)
          .execute();

```

3. 类JPA增删改

```java

@Table(name = "s_entity")
public class MyEntity {
    
    @Id
    private String id;
    
    @Column
    private String name;

    @Column
    private Long createTime;
}

```

直接注入即可实现增删改查

```java

@Autowire
private ReactiveRepository<MyEntity, String> repository;

```

2. 灵活的权限控制

```java

@PostMapping("/account")
@SaveAction
public Mono<String> addAccount(@RequestBody Mono<Account> account){
     return accountService.doSave(account);
}

```

## License

[Apache 2.0](https://github.com/spring-projects/spring-boot/blob/main/LICENSE.txt)


[![Stargazers over time](https://starchart.cc/hs-web/hsweb-framework.svg?variant=adaptive)](https://starchart.cc/hs-web/hsweb-framework)


================================================
FILE: build.sh
================================================
#!/usr/bin/env bash
./mvnw install -Dgit.commit.hash=$(git rev-parse HEAD) -DskipTests=true

================================================
FILE: changes.sh
================================================
#!/usr/bin/env bash

# 收集变更模块
modules=$(git diff --name-only HEAD~1 HEAD | \
while read file; do
  dir=$(dirname "$file")
  while [ "$dir" != "." ] && [ "$dir" != "/" ]; do
    if [ -f "$dir/pom.xml" ]; then echo "$dir"; break; fi
    dir=$(dirname "$dir")
  done
done | sort -u | tr '\n' ',' | sed 's/,$//')

# 如果为空,则使用默认值 '.'
if [ -z "$modules" ]; then
  echo "."
else
  echo "$modules"
fi

================================================
FILE: hsweb-authorization/README.md
================================================
# 授权认证模块
用于整个系统的授权认证管理

# 目录介绍
1. [hsweb-authorization-api](hsweb-authorization-api):权限控制API
3. [hsweb-authorization-basic](hsweb-authorization-basic):权限控制基础实现



================================================
FILE: hsweb-authorization/hsweb-authorization-api/README.md
================================================
# 权限控制API
用于权限控制的API接口,支持RBAC权限控制,支持数据级(控制到行,列)权限控制.

[用户令牌管理](token.md)

[权限控制配置](define.md)

# 介绍

以下讲到的类都是基于包:org.hswebframework.web.authorization

### 常用注解:
_点击名称,查看源代码注释获得使用说明_

| 注解名称       | 说明          | 
| ------------- |:-------------:| 
| [`@Authorize`](src/main/java/org/hswebframework/web/authorization/annotation/Authorize.java)    | RBAC方式权限控制注解 | 
| [`@RequiresExpression`](src/main/java/org/hswebframework/web/authorization/annotation/RequiresExpression.java)      | 表达式方式验证      | 
| [`@RequiresDataAccess`](src/main/java/org/hswebframework/web/authorization/annotation/RequiresDataAccess.java)      | 数据权限控制      | 

[自定义数据权限控制](custom-data-access.md)

### 常用类
_点击名称,查看源代码注释获得使用说明_


| 类名       | 说明          | 
| ------------- |:-------------:| 
| [`Authentication`](src/main/java/org/hswebframework/web/authorization/Authentication.java)    | 用户的认证信息 | 
| [`AuthenticationHolder`](src/main/java/org/hswebframework/web/authorization/AuthenticationHolder.java)      | 用于获取当前登录用户的认证信息      | 


### Listener
api提供[AuthorizationListener](src/main/java/org/hswebframework/web/authorization/listener/AuthorizationListener.java)
来进行授权逻辑拓展,在授权前后执行可自定义的操作.如rsa解密帐号密码,验证码判断等。

默认事件列表():

| 类名       | 说明          | 
| ------------- |:-------------:| 
| [`AuthorizationDecodeEvent`](src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationDecodeEvent.java)    | 接收到请求参数时 | 
| [`AuthorizationBeforeEvent`](src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationBeforeEvent.java)      | 验证密码前触发      | 
| [`AuthorizationFailedEvent`](src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationFailedEvent.java)      | 授权验证失败时触发      | 
| [`AuthorizationSuccessEvent`](src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationSuccessEvent.java)      | 授权成功时触发      | 
| [`AuthorizationExitEvent`](src/main/java/org/hswebframework/web/authorization/listener/event/AuthorizationExitEvent.java)      | 用户注销时触发      | 

例子:

```java
@Component
public class CustomAuthorizationSuccessListener implements AuthorizationListener<AuthorizationSuccessEvent>{
        @Override
        public void on(AuthorizationSuccessEvent event) {
            Authentication authentication=event.getAuthentication();
            //....
            System.out.println(authentication.getUser().getName()+"登录啦");
        }
}
```



================================================
FILE: hsweb-authorization/hsweb-authorization-api/custom-data-access.md
================================================
# 自定义拓展数据权限控制

1. 编写配置转换器,将在前端配置的内容转换为api需要的配置信息

实现 ``DataAccessConfigConvert``接口
```java
@org.springframework.stereotype.Component
public class MyDataAccessConfigConvert implements DataAccessConfigConvert {

    @Override
    public boolean isSupport(String type, String action, String config) {
        return "custom_type".equals(type);
    }

    @Override
    public DataAccessConfig convert(String type, String action, String config) {
        MyDataAccessConfig accessConfig = JSON.parseObject(config, MyDataAccessConfig.class);
        accessConfig.setAction(action);
        accessConfig.setType(type);
        return accessConfig;
    }
}
```


2. 实现 ``DataAccessHandler``接口
```java
@org.springframework.stereotype.Component //提供给Spring才会生效
public class MyDataAccessHandler implements org.hswebframework.web.authorization.access.DataAccessHandler{
    
        @Override
        public boolean isSupport(DataAccessConfig access) {
            //DataAccessConfig 在用户登录的时候,初始化
            //DataAccessConfig 由
            //支持的配置类型
            return "custom_type".equals(access.getType());
        }
    
        //处理请求,返回true表示授权通过
        @Override
        public boolean handle(DataAccessConfig access, MethodInterceptorParamContext context) {
            //被拦截的方法参数
           Map<String,Object> param= context.getNamedArguments();
           // 判断逻辑
           //...
            return true;
        }
}
```

================================================
FILE: hsweb-authorization/hsweb-authorization-api/define.md
================================================
# 权限配置定义

用于告诉权限框架哪些请求需要进行权限控制,怎么控制.

================================================
FILE: hsweb-authorization/hsweb-authorization-api/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>hsweb-authorization</artifactId>
        <groupId>org.hswebframework.web</groupId>
        <version>5.0.2-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <name>${project.artifactId}</name>
    <description>授权,权限管理API</description>
    <artifactId>hsweb-authorization-api</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.hswebframework.web</groupId>
            <artifactId>hsweb-core</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>io.swagger.core.v3</groupId>
            <artifactId>swagger-annotations</artifactId>
        </dependency>

        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>context-propagation</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization;

import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono;

import java.io.Serializable;
import java.util.*;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * 用户授权信息,当前登录用户的权限信息,包括用户的基本信息,角色,权限集合等常用信息<br>
 * 获取方式:
 * <ul>
 * <li>springmvc 入参方式: ResponseMessage myTest(Authorization auth){}</li>
 * <li>静态方法方式:AuthorizationHolder.get();</li>
 * <li>响应式方式: return Authentication.currentReactive().map(auth->....)</li>
 * </ul>
 *
 * @author zhouhao
 * @see ReactiveAuthenticationHolder
 * @see AuthenticationManager
 * @since 3.0
 */
public interface Authentication extends Serializable {

    /**
     * 获取当前登录的用户权限信息
     * <pre>
     *     public Mono&lt;User&gt; getUser(){
     *         return Authentication.currentReactive()
     *                 .switchIfEmpty(Mono.error(new UnAuthorizedException()))
     *                 .flatMap(autz->findUserByUserId(autz.getUser().getId()));
     *     }
     * </pre>
     *
     * @return 当前用户权限信息
     * @see ReactiveAuthenticationHolder
     * @since 4.0
     */
    static Mono<Authentication> currentReactive() {
        return ReactiveAuthenticationHolder.get();
    }

    /**
     * 非响应式环境适用
     * <pre>
     *
     *   Authentication auth= Authentication.current().get();
     *   //如果权限信息不存在将抛出{@link NoSuchElementException}建议使用下面的方式获取
     *   Authentication auth=Authentication.current().orElse(null);
     *   //或者
     *   Authentication auth=Authentication.current().orElseThrow(UnAuthorizedException::new);
     * </pre>
     *
     * @return 当前用户权限信息
     * @see Optional
     */
    static Optional<Authentication> current() {
        return AuthenticationHolder.get();
    }

    /**
     * @return 用户信息
     */
    User getUser();

    /**
     * @return 用户所有维度
     * @since 4.0
     */
    List<Dimension> getDimensions();

    /**
     * @return 用户持有的权限集合
     */
    List<Permission> getPermissions();

    default boolean hasDimension(String type, String... id) {
        return hasAnyDimension(type, Arrays.asList(id));
    }

    default boolean hasAllDimension(String type, Collection<String> id) {
        if (id.isEmpty()) {
            return !getDimensions(type).isEmpty();
        }
        return getDimensions(type)
            .stream()
            .allMatch(p -> id.contains(p.getId()));
    }

    default boolean hasAnyDimension(String type, Collection<String> id) {
        if (id.isEmpty()) {
            return !getDimensions(type).isEmpty();
        }
        return getDimensions(type)
            .stream()
            .anyMatch(p -> id.contains(p.getId()));
    }

    @Deprecated
    default boolean hasDimension(String type, Collection<String> id) {
        if (id.isEmpty()) {
            return !getDimensions(type).isEmpty();
        }
        return getDimensions(type)
            .stream()
            .anyMatch(p -> id.contains(p.getId()));
    }

    default boolean hasDimension(DimensionType type, String id) {
        return getDimension(type, id).isPresent();
    }

    default Optional<Dimension> getDimension(String type, String id) {
        if (!StringUtils.hasText(type)) {
            return Optional.empty();
        }
        return getDimensions()
            .stream()
            .filter(dimension -> dimension.getId().equals(id) && type.equalsIgnoreCase(dimension.getType().getId()))
            .findFirst();
    }

    default Optional<Dimension> getDimension(DimensionType type, String id) {
        if (type == null) {
            return Optional.empty();
        }
        return getDimensions()
            .stream()
            .filter(dimension -> dimension.getId().equals(id) && type.isSameType(dimension.getType()))
            .findFirst();
    }


    default List<Dimension> getDimensions(String type) {
        if (!StringUtils.hasText(type)) {
            return Collections.emptyList();
        }
        return getDimensions()
            .stream()
            .filter(dimension -> dimension.getType().isSameType(type))
            .collect(Collectors.toList());
    }

    default List<Dimension> getDimensions(DimensionType type) {
        if (type == null) {
            return Collections.emptyList();
        }
        return getDimensions()
            .stream()
            .filter(dimension -> dimension.getType().isSameType(type))
            .collect(Collectors.toList());
    }


    /**
     * 根据权限id获取权限信息,权限不存在则返回null
     *
     * @param id 权限id
     * @return 权限信息
     */
    default Optional<Permission> getPermission(String id) {
        if (null == id) {
            return Optional.empty();
        }
        return getPermissions()
            .stream()
            .filter(permission -> permission.getId().equals(id))
            .findAny();
    }

    /**
     * 判断是否持有某权限以及对权限的可操作事件
     *
     * @param permissionId 权限id {@link Permission#getId()}
     * @param actions      可操作动作 {@link Permission#getActions()} 如果为空,则不判断action,只判断permissionId
     * @return 是否持有权限
     */
    default boolean hasPermission(String permissionId, String... actions) {
        return hasPermission(permissionId,
                             actions.length == 0
                                 ? Collections.emptyList()
                                 : Arrays.asList(actions));
    }

    default boolean hasPermission(String permissionId, Collection<String> actions) {
        for (Permission permission : getPermissions()) {
            if (Objects.equals(permission.getId(), "*") ||
                Objects.equals(permissionId, permission.getId())) {
                return actions.isEmpty()
                    || permission.getActions().containsAll(actions)
                    || permission.getActions().contains("*");
            }
        }
        return false;
    }

    /**
     * 根据属性名获取属性值,返回一个{@link Optional}对象。<br>
     * 此方法可用于获取自定义的属性信息
     *
     * @param name 属性名
     * @param <T>  属性值类型
     * @return Optional属性值
     */
    <T extends Serializable> Optional<T> getAttribute(String name);

    /**
     * @return 全部属性集合
     */
    Map<String, Serializable> getAttributes();

    /**
     * 设置属性,注意: 此属性可能并不会被持久化,仅用于临时传递信息.
     *
     * @param key   key
     * @param value value
     */
    default void setAttribute(String key, Serializable value) {
        getAttributes().put(key, value);
    }

    /**
     * 合并权限
     *
     * @param source 源权限信息
     * @return 合并后的信息
     */
    Authentication merge(Authentication source);

    /**
     * copy为新的权限信息
     *
     * @param permissionFilter 权限过滤
     * @param dimension        维度过滤
     * @return 新的权限信息
     */
    Authentication copy(BiPredicate<Permission, String> permissionFilter,
                        Predicate<Dimension> dimension);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationHolder.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization;

import io.netty.util.concurrent.FastThreadLocal;
import lombok.SneakyThrows;
import org.hswebframework.web.authorization.simple.SimpleAuthentication;
import reactor.core.Disposable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Callable;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 权限获取器,用于静态方式获取当前登录用户的权限信息.
 * 例如:
 * <pre>
 *     &#064;RequestMapping("/example")
 *     public ResponseMessage example(){
 *         Authorization auth = AuthorizationHolder.get();
 *         return ResponseMessage.ok();
 *     }
 * </pre>
 *
 * @author zhouhao
 * @see AuthenticationSupplier
 * @since 3.0
 */
public final class AuthenticationHolder {
    private static final List<AuthenticationSupplier> suppliers = new ArrayList<>();

    private static final ReadWriteLock lock = new ReentrantReadWriteLock();

    private static final FastThreadLocal<Authentication> CURRENT = new FastThreadLocal<>();


    private static Optional<Authentication> get(Function<AuthenticationSupplier, Optional<Authentication>> function) {
        int size = suppliers.size();
        if (size == 0) {
            return Optional.empty();
        }
        if (size == 1) {
            return function.apply(suppliers.get(0));
        }
        AuthenticationUtils.AuthenticationMerging merging
            = new AuthenticationUtils.AuthenticationMerging();
        for (AuthenticationSupplier supplier : suppliers) {
            function.apply(supplier).ifPresent(merging::merge);
        }
        return Optional.ofNullable(merging.get());
    }


    /**
     * @return 当前登录的用户权限信息
     */
    public static Optional<Authentication> get() {
        Authentication current = CURRENT.getIfExists();
        if (current != null) {
            return Optional.of(current);
        }
        return get(AuthenticationSupplier::get);
    }

    /**
     * 获取指定用户的权限信息
     *
     * @param userId 用户ID
     * @return 权限信息
     */
    public static Optional<Authentication> get(String userId) {
        return get(supplier -> supplier.get(userId));
    }

    /**
     * 初始化 {@link AuthenticationSupplier}
     *
     * @param supplier 认证信息提供者
     */
    public static void addSupplier(AuthenticationSupplier supplier) {
        lock.writeLock().lock();
        try {
            suppliers.add(supplier);
        } finally {
            lock.writeLock().unlock();
        }
    }

    public static void resetCurrent() {
        CURRENT.remove();
    }

    public static void makeCurrent(Authentication authentication) {
        if (authentication == null) {
            resetCurrent();
        } else {
            CURRENT.set(authentication);
        }
    }

    /**
     * 指定用户权限,执行一个任务。任务执行过程中可通过 {@link Authentication#current()}获取到当前权限.
     *
     * @param current  当前用户权限信息
     * @param callable 任务执行器
     * @param <T>      任务执行结果类型
     * @return 任务执行结果
     */
    @SneakyThrows
    public static <T> T executeWith(Authentication current, Callable<T> callable) {
        Authentication previous = CURRENT.getIfExists();
        try {
            CURRENT.set(current);
            return callable.call();
        } finally {
            CURRENT.set(previous);
        }
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationManager.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization;

import java.util.Optional;

/**
 * 授权信息管理器,用于获取用户授权和同步授权信息
 *
 * @author zhouhao
 * @see 3.0
 */
public interface AuthenticationManager {

    /**
     * 进行授权操作
     *
     * @param request 授权请求
     * @return 授权成功则返回用户权限信息
     */
    Authentication authenticate(AuthenticationRequest request);

    /**
     * 根据用户ID获取权限信息
     *
     * @param userId 用户ID
     * @return 权限信息
     */
    Optional<Authentication> getByUserId(String userId);


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationPredicate.java
================================================
package org.hswebframework.web.authorization;

import org.hswebframework.web.authorization.exception.AccessDenyException;

import java.util.Arrays;
import java.util.Objects;
import java.util.function.Predicate;

/**
 * @author zhouhao
 * @since 3.0
 */
@FunctionalInterface
public interface AuthenticationPredicate extends Predicate<Authentication> {

    static AuthenticationPredicate has(String permissionString) {
        return AuthenticationUtils.createPredicate(permissionString);
    }

    static AuthenticationPredicate dimension(String dimension, String... id) {
        return autz -> autz.hasAnyDimension(dimension, Arrays.asList(id));
    }

    static AuthenticationPredicate permission(String permissionId, String... actions) {
        return autz -> autz.hasPermission(permissionId, actions);
    }

    default AuthenticationPredicate and(String permissionString) {
        return and(has(permissionString));
    }

    default AuthenticationPredicate or(String permissionString) {
        return or(has(permissionString));
    }

    @Override
    default AuthenticationPredicate and(Predicate<? super Authentication> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    @Override
    default AuthenticationPredicate or(Predicate<? super Authentication> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }


    default void assertHas(Authentication authentication) {
        if (!test(authentication)) {
            throw new AccessDenyException();
        }
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationRequest.java
================================================
package org.hswebframework.web.authorization;

import java.io.Serializable;

/**
 * @author zhouhao
 * @since 3.0.0-RC
 */
public interface AuthenticationRequest extends Serializable {
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationSupplier.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization;


import java.util.Optional;
import java.util.function.Supplier;

/**
 * @author zhouhao
 * @see Supplier
 * @see Authentication
 * @see ReactiveAuthenticationHolder
 */
public interface AuthenticationSupplier extends Supplier<Optional<Authentication>> {

    Optional<Authentication> get(String userId);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationUtils.java
================================================
package org.hswebframework.web.authorization;

import org.hswebframework.web.authorization.simple.SimpleAuthentication;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * @author zhouhao
 * @since 3.0
 */
public class AuthenticationUtils {


    public static Mono<Authentication> merge(Flux<Authentication> authenticationFlux){
        return authenticationFlux
            .collect(AuthenticationMerging::new, AuthenticationMerging::merge)
            .mapNotNull(AuthenticationMerging::get);
    }

    static class AuthenticationMerging {

        private Authentication auth;
        private int count;

        public synchronized void merge(Authentication auth) {
            if (this.auth == null || this.auth == auth) {
                this.auth = auth;
            } else {
                if (count++ == 0) {
                    SimpleAuthentication newAuth = new SimpleAuthentication();
                    newAuth.merge(this.auth);
                    this.auth = newAuth;
                }
                this.auth.merge(auth);
            }
        }

        Authentication get() {
            return auth;
        }
    }


    public static AuthenticationPredicate createPredicate(String expression) {
        if (ObjectUtils.isEmpty(expression)) {
            return (authentication -> false);
        }
        AuthenticationPredicate main = null;
        // resource:user:add or update
        AuthenticationPredicate temp = null;
        boolean lastAnd = true;
        for (String conf : expression.split("[ ]")) {
            if (conf.startsWith("resource:")||conf.startsWith("permission:")) {
                String[] permissionAndActions = conf.split("[:]", 2);
                if (permissionAndActions.length < 2) {
                    temp = authentication -> !authentication.getPermissions().isEmpty();
                } else {
                    String[] real = permissionAndActions[1].split("[:]");
                    temp = real.length > 1 ?
                            AuthenticationPredicate.permission(real[0], real[1].split("[,]"))
                            : AuthenticationPredicate.permission(real[0]);
                }
            } else if (main != null && conf.equalsIgnoreCase("and")) {
                lastAnd = true;
                main = main.and(temp);
            } else if (main != null && conf.equalsIgnoreCase("or")) {
                main = main.or(temp);
                lastAnd = false;
            } else {
                String[] real = conf.split("[:]", 2);
                if (real.length < 2) {
                    temp = AuthenticationPredicate.dimension(real[0]);
                } else {
                    temp = AuthenticationPredicate.dimension(real[0], real[1].split(","));
                }
            }
            if (main == null) {
                main = temp;
            }
        }
        return main == null ? a -> false : (lastAnd ? main.and(temp) : main.or(temp));
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DefaultDimensionType.java
================================================
package org.hswebframework.web.authorization;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum DefaultDimensionType implements DimensionType {
    user("用户"),
    role("角色");

    private String name;

    @Override
    public String getId() {
        return name();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Dimension.java
================================================
package org.hswebframework.web.authorization;

import org.hswebframework.web.authorization.simple.SimpleDimension;

import java.io.Serializable;
import java.util.Map;
import java.util.Optional;

public interface Dimension extends Serializable {
    String getId();

    String getName();

    DimensionType getType();

    Map<String, Object> getOptions();

    default <T> Optional<T> getOption(String key) {
        return Optional.ofNullable(getOptions())
                .map(ops -> ops.get(key))
                .map(o -> (T) o);
    }

    default boolean typeIs(DimensionType type) {
        return this.getType() == type || this.getType().getId().equals(type.getId());
    }

    default boolean typeIs(String type) {
        return this.getType().getId().equals(type);
    }

    static Dimension of(String id, String name, DimensionType type) {
        return of(id, name, type, null);
    }

    static Dimension of(String id, String name, DimensionType type, Map<String, Object> options) {
        return SimpleDimension.of(id, name, type, options);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionProvider.java
================================================
package org.hswebframework.web.authorization;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Collection;

/**
 * 维度提供商,用户管理维度信息
 *
 * @author zhouhao
 * @since 4.0
 */
public interface DimensionProvider {

    /**
     * 获取全部支持的维度
     *
     * @return 全部支持的维度
     */
    Flux<? extends DimensionType> getAllType();

    /**
     * 获取用户获取维度信息
     *
     * @param userId 用户ID
     * @return 维度列表
     */
    Flux<? extends Dimension> getDimensionByUserId(String userId);

    /**
     * 根据维度类型和ID获取维度信息
     *
     * @param type 类型
     * @param id   ID
     * @return 维度信息
     */
    Mono<? extends Dimension> getDimensionById(DimensionType type, String id);

    /**
     * 根据维度类型和Id获取多个维度
     * @param type 类型
     * @param idList ID
     * @return 维度信息
     */
    default Flux<? extends Dimension> getDimensionsById(DimensionType type, Collection<String> idList){
        return Flux
                .fromIterable(idList)
                .flatMap(id->this.getDimensionById(type,id));
    }

    /**
     * 根据维度ID获取用户ID
     *
     * @param dimensionId 维度ID
     * @return 用户ID
     */
    Flux<String> getUserIdByDimensionId(String dimensionId);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionType.java
================================================
package org.hswebframework.web.authorization;

public interface DimensionType {
    String getId();

    String getName();

    default boolean isSameType(DimensionType another) {
        return this == another || isSameType(another.getId());
    }

    default boolean isSameType(String anotherId) {
        return this.getId().equals(anotherId);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Permission.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization;

import org.hswebframework.web.authorization.access.DataAccessConfig;
import org.hswebframework.web.authorization.access.FieldFilterDataAccessConfig;
import org.hswebframework.web.authorization.access.ScopeDataAccessConfig;

import java.io.Serializable;
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static org.hswebframework.web.authorization.access.DataAccessConfig.DefaultType.DENY_FIELDS;

/**
 * 用户持有的权限信息,包含了权限基本信息、可操作范围(action)、行,列级权限控制规则。
 * 是用户权限的重要接口。
 *
 * @author zhouhao
 * @see Authentication
 * @since 3.0
 */
public interface Permission extends Serializable {
    /**
     * 查询
     */
    String ACTION_QUERY = "query";
    /**
     * 获取明细
     */
    String ACTION_GET = "get";
    /**
     * 新增
     */
    String ACTION_ADD = "add";
    /**
     * 保存
     */
    String ACTION_SAVE = "save";
    /**
     * 更新
     */
    String ACTION_UPDATE = "update";

    /**
     * 删除
     */
    String ACTION_DELETE = "delete";
    /**
     * 导入
     */
    String ACTION_IMPORT = "import";
    /**
     * 导出
     */
    String ACTION_EXPORT = "export";

    /**
     * 禁用
     */
    String ACTION_DISABLE = "disable";

    /**
     * 启用
     */
    String ACTION_ENABLE = "enable";

    /**
     * @return 权限ID,权限的唯一标识
     */
    String getId();

    /**
     * @return 权限名称
     */
    String getName();

    /**
     * @return 其他拓展字段
     */
    Map<String, Object> getOptions();

    default Optional<Object> getOption(String key) {
        return Optional.ofNullable(getOptions())
                .map(map -> map.get(key));
    }

    /**
     * 用户对此权限的可操作事件(按钮)
     * <p>
     * ⚠️:任何时候都不应该对返回的Set进行写操作
     *
     * @return 如果没有配置返回空{@link Collections#emptySet()},不会返回null.
     */
    Set<String> getActions();

    /**
     * 用户对此权限持有的数据权限信息, 用于数据级别的控制
     * <p>
     * ⚠️:任何时候都不应该对返回的Set进行写操作
     *
     * @return 如果没有配置返回空{@link Collections#emptySet()},不会返回null.
     * @see DataAccessConfig
     * @see org.hswebframework.web.authorization.access.DataAccessController
     */
    @Deprecated
    Set<DataAccessConfig> getDataAccesses();


    default Set<DataAccessConfig> getDataAccesses(String action) {
        return getDataAccesses()
                .stream()
                .filter(conf -> conf.getAction().equals(action))
                .collect(Collectors.toSet());
    }

    /**
     * 查找数据权限配置
     *
     * @param configPredicate 数据权限配置匹配规则
     * @param <T>             数据权限配置类型
     * @return {@link Optional}
     * @see this#scope(String, String, String)
     */
    @SuppressWarnings("all")
    default <T extends DataAccessConfig> Optional<T> findDataAccess(DataAccessPredicate<T> configPredicate) {
        return (Optional) getDataAccesses().stream()
                .filter(configPredicate)
                .findFirst();
    }

    /**
     * 查找字段过滤的数据权限配置(列级数据权限),比如:不查询某些字段
     *
     * @param action 权限操作类型 {@link Permission#ACTION_QUERY}
     * @return {@link Optional}
     * @see FieldFilterDataAccessConfig
     * @see FieldFilterDataAccessConfig#getFields()
     */
    default Optional<FieldFilterDataAccessConfig> findFieldFilter(String action) {
        return findDataAccess(conf -> conf instanceof FieldFilterDataAccessConfig && conf.getAction().equals(action));
    }

    /**
     * 获取不能执行操作的字段
     *
     * @param action 权限操作
     * @return 未配置时返回空set, 不会返回null
     */
    default Set<String> findDenyFields(String action) {
        return findFieldFilter(action)
                .filter(conf -> DENY_FIELDS.equals(conf.getType().getId()))
                .map(FieldFilterDataAccessConfig::getFields)
                .orElseGet(Collections::emptySet);
    }


    /**
     * 查找数据范围权限控制配置(行级数据权限),比如: 只能查询本机构的数据
     *
     * @param type      范围类型标识,由具体的实现定义,如: 机构范围
     * @param scopeType 范围类型,由具体的实现定义,如: 只能查看自己所在机构
     * @param action    权限操作 {@link Permission#ACTION_QUERY}
     * @return 未配置时返回空set, 不会返回null
     */
    default Set<Object> findScope(String action, String type, String scopeType) {
        return findScope(scope(action, type, scopeType));
    }

    default Set<Object> findScope(Permission.DataAccessPredicate<ScopeDataAccessConfig> predicate) {
        return findDataAccess(predicate)
                .map(ScopeDataAccessConfig::getScope)
                .orElseGet(Collections::emptySet);
    }

    /**
     * 构造一个数据范围权限控制配置查找逻辑
     *
     * @param type      范围类型标识,由具体的实现定义,如: 机构范围
     * @param scopeType 范围类型,由具体的实现定义,如: 只能查看自己所在机构
     * @param action    权限操作 {@link Permission#ACTION_QUERY}
     * @return {@link DataAccessPredicate}
     */
    static Permission.DataAccessPredicate<ScopeDataAccessConfig> scope(String action, String type, String scopeType) {
        Objects.requireNonNull(action, "action can not be null");
        Objects.requireNonNull(type, "type can not be null");
        Objects.requireNonNull(scopeType, "scopeType can not be null");

        return config ->
                config instanceof ScopeDataAccessConfig
                        && action.equals(config.getAction())
                        && type.equals(config.getType())
                        && scopeType.equals(((ScopeDataAccessConfig) config).getScopeType());
    }

    Permission copy();

    Permission copy(Predicate<String> actionFilter,Predicate<DataAccessConfig> dataAccessFilter);

    /**
     * 数据权限查找判断逻辑接口
     *
     * @param <T>
     */
    interface DataAccessPredicate<T extends DataAccessConfig> extends Predicate<DataAccessConfig> {
        boolean test(DataAccessConfig config);


        @Override
        default DataAccessPredicate<T> and(Predicate<? super DataAccessConfig> other) {
            return (t) -> test(t) && other.test(t);
        }

        @Override
        default DataAccessPredicate<T> or(Predicate<? super DataAccessConfig> other) {
            return (t) -> test(t) || other.test(t);
        }
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationHolder.java
================================================
/*
 *  Copyright 2019 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization;

import com.google.common.collect.Lists;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.context.Context;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;

/**
 * 响应式权限保持器,用于响应式方式获取当前登录用户的权限信息.
 * 例如:
 * <pre>{@code
 *     @RequestMapping("/example")
 *     public Mono<Authorization> example(){
 *         return ReactiveAuthenticationHolder.get();
 *     }
 *     }
 * </pre>
 *
 * @author zhouhao
 * @see ReactiveAuthenticationSupplier
 * @since 4.0
 */
public final class ReactiveAuthenticationHolder {
    private static final List<ReactiveAuthenticationSupplier> suppliers = new CopyOnWriteArrayList<>();

    public static final String IGNORE_AUTH_KEY = ".auth.ignore";

    static final Context IGNORE_AUTH_CONTEXT_Y = Context.of(IGNORE_AUTH_KEY, true);
    static final Context IGNORE_AUTH_CONTEXT_N = Context.of(IGNORE_AUTH_KEY, false);

    private static Mono<Authentication> get(Function<ReactiveAuthenticationSupplier, Mono<Authentication>> function) {
        return AuthenticationUtils
            .merge(Flux.merge(Lists.transform(suppliers, function::apply)));
    }

    /**
     * @return 当前登录的用户权限信息
     */
    public static Mono<Authentication> get() {

        return Mono.deferContextual(ctx -> {
            if (Boolean.TRUE.equals(ctx.getOrDefault(IGNORE_AUTH_KEY, false))) {
                return Mono.empty();
            }
            return get(ReactiveAuthenticationSupplier::get);
        });
    }

    /**
     * 获取指定用户的权限信息
     *
     * @param userId 用户ID
     * @return 权限信息
     */
    public static Mono<Authentication> get(String userId) {
        return get(supplier -> supplier.get(userId));
    }

    /**
     * 初始化 {@link ReactiveAuthenticationSupplier}
     *
     * @param supplier
     */
    public static void addSupplier(ReactiveAuthenticationSupplier supplier) {
        suppliers.add(supplier);
    }

    public static void setSupplier(ReactiveAuthenticationSupplier supplier) {
        suppliers.clear();
        suppliers.add(supplier);
    }

    public static Context ignoreContext(boolean ignore) {
        return ignore ? IGNORE_AUTH_CONTEXT_Y : IGNORE_AUTH_CONTEXT_N;
    }

    public static Function<Context, Context> ignoreIfAbsent(boolean ignore) {
        return ctx -> ctx.hasKey(IGNORE_AUTH_KEY)
            ? ctx
            : ctx.put(IGNORE_AUTH_KEY, ignore);
    }


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationInitializeService.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization;

import org.hswebframework.web.authorization.events.AuthorizationInitializeEvent;
import reactor.core.publisher.Mono;

/**
 * 授权信息初始化服务接口,使用该接口初始化用的权限信息
 *
 * @author zhouhao
 * @since 4.0
 */
public interface ReactiveAuthenticationInitializeService {
    /**
     * 根据用户ID初始化权限信息
     *
     * @param userId 用户ID
     * @return 权限信息
     * @see AuthorizationInitializeEvent
     */
    Mono<Authentication> initUserAuthorization(String userId);

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationManager.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization;

import reactor.core.publisher.Mono;

/**
 * 授权信息管理器,用于获取用户授权和同步授权信息
 *
 * @author zhouhao
 * @see 3.0
 */
public interface ReactiveAuthenticationManager {

    /**
     * 进行授权操作
     *
     * @param request 授权请求
     * @return 授权成功则返回用户权限信息
     */
    Mono<Authentication> authenticate(Mono<AuthenticationRequest> request);

    /**
     * 根据用户ID获取权限信息
     *
     * @param userId 用户ID
     * @return 权限信息
     */
    Mono<Authentication> getByUserId(String userId);


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationManagerProvider.java
================================================
package org.hswebframework.web.authorization;

import reactor.core.publisher.Mono;

public interface ReactiveAuthenticationManagerProvider {
    /**
     * 进行授权操作
     *
     * @param request 授权请求
     * @return 授权成功则返回用户权限信息
     */
    Mono<Authentication> authenticate(Mono<AuthenticationRequest> request);

    /**
     * 根据用户ID获取权限信息
     *
     * @param userId 用户ID
     * @return 权限信息
     */
    Mono<Authentication> getByUserId(String userId);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationSupplier.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization;

import reactor.core.publisher.Mono;

import java.util.function.Supplier;

/**
 * @author zhouhao
 * @see Supplier
 * @see Authentication
 * @see ReactiveAuthenticationHolder
 * @since 4.0
 */
public interface ReactiveAuthenticationSupplier extends Supplier<Mono<Authentication>> {
    Mono<Authentication> get(String userId);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Role.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization;


import org.hswebframework.web.authorization.simple.SimpleRole;

/**
 * 角色信息
 *
 * @author zhouhao
 * @since 3.0
 */
public interface Role extends Dimension {

    /**
     * @return 角色ID
     */
    String getId();

    /**
     * @return 角色名
     */
    String getName();

    @Override
    default DimensionType getType() {
        return DefaultDimensionType.role;
    }

    static Role fromDimension(Dimension dimension){
        return SimpleRole.of(dimension);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/User.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization;

/**
 * 用户信息
 *
 * @author zhouhao
 * @since 3.0
 */
public interface User extends Dimension {
    /**
     * @return 用户ID
     */
    String getId();

    /**
     * @return 用户名
     */
    String getUsername();

    /**
     * @return 姓名
     */
    String getName();

    /**
     * @return 用户类型
     */
    String getUserType();

    @Override
    default DimensionType getType() {
        return DefaultDimensionType.user;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessConfig.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.access;


import org.hswebframework.web.authorization.Permission;

import java.io.Serializable;

/**
 * 数据级的权限控制,此接口为控制方式配置
 * 具体的控制逻辑由控制器{@link DataAccessController}实现
 *
 * @author zhouhao
 * @see OwnCreatedDataAccessConfig
 */
public interface DataAccessConfig extends Serializable {

    /**
     * 对数据的操作事件
     *
     * @return 操作时间
     * @see Permission#ACTION_ADD
     * @see Permission#ACTION_DELETE
     * @see Permission#ACTION_GET
     * @see Permission#ACTION_QUERY
     * @see Permission#ACTION_UPDATE
     */
    String getAction();

    /**
     * 控制方式标识
     *
     * @return 控制方式
     * @see DefaultType
     */
    DataAccessType getType();

    /**
     * 内置的控制方式
     */
    interface DefaultType {
        /**
         * 自己创建的数据
         *
         * @see OwnCreatedDataAccessConfig#getType()
         */
        String OWN_CREATED = "OWN_CREATED";

        /**
         * 禁止操作字段
         *
         * @see FieldFilterDataAccessConfig#getType()
         */
        String DENY_FIELDS = "DENY_FIELDS";

        /**
         * 禁止操作字段
         *
         * @see org.hswebframework.web.authorization.simple.DimensionDataAccessConfig#getType()
         */
        String DIMENSION_SCOPE = "DIMENSION_SCOPE";


    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessConfiguration.java
================================================
package org.hswebframework.web.authorization.access;

public interface DataAccessConfiguration {
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessController.java
================================================
package org.hswebframework.web.authorization.access;

import org.hswebframework.web.authorization.define.AuthorizingContext;

/**
 * 数据级别权限控制器,通过此控制器对当前登录用户进行的操作进行数据级别的权限控制。
 * 如:A用户只能查询自己创建的B数据,A用户只能修改自己创建的B数据
 *
 * @author zhouhao
 * @since  3.0
 */
@Deprecated
public interface DataAccessController {
    /**
     * 执行权限控制
     * @param access 控制方式以及配置
     * @param context 权限验证上下文,用于传递验证过程用到的参数
     * @return 授权是否通过
     */
    boolean doAccess(DataAccessConfig access, AuthorizingContext context);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessHandler.java
================================================
package org.hswebframework.web.authorization.access;

import org.hswebframework.web.authorization.define.AuthorizingContext;

/**
 * 数据级别权限控制处理器接口,负责处理支持的权限控制配置
 *
 * @author zhouhao
 */
public interface DataAccessHandler {

    /**
     * 是否支持处理此配置
     *
     * @param access 控制配置
     * @return 是否支持
     */
    boolean isSupport(DataAccessConfig access);

    /**
     * 执行处理,返回处理结果
     *
     * @param access  控制配置
     * @param context 参数上下文
     * @return 处理结果
     */
    boolean handle(DataAccessConfig access, AuthorizingContext context);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessType.java
================================================
package org.hswebframework.web.authorization.access;

public interface DataAccessType {

    String getId();

    String getName();

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DefaultDataAccessType.java
================================================
package org.hswebframework.web.authorization.access;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.hswebframework.web.dict.Dict;
import org.hswebframework.web.dict.EnumDict;

@Getter
@AllArgsConstructor
public enum DefaultDataAccessType implements DataAccessType, EnumDict<String> {
    USER_OWN_DATA("自己的数据"),
    FIELD_DENY("禁止操作字段"),
    DIMENSION_SCOPE("维度范围");

    private final String name;

    @Override
    public String getText() {
        return name;
    }

    @Override
    public String getValue() {
        return getId();
    }

    @Override
    public String getId() {
        return name().toLowerCase();
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DimensionHelper.java
================================================
package org.hswebframework.web.authorization.access;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.authorization.Dimension;
import org.hswebframework.web.authorization.DimensionType;
import org.hswebframework.web.authorization.Permission;
import org.hswebframework.web.authorization.simple.DimensionDataAccessConfig;

import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public abstract class DimensionHelper {


    public static Set<Object> getDimensionDataAccessScope(Authentication atz,
                                                          Permission permission,
                                                          String action,
                                                          String dimensionType) {
        return permission
                .getDataAccesses(action)
                .stream()
                .filter(DimensionDataAccessConfig.class::isInstance)
                .map(DimensionDataAccessConfig.class::cast)
                .filter(conf -> dimensionType.equals(conf.getScopeType()))
                .flatMap(conf -> {
                    if (CollectionUtils.isEmpty(conf.getScope())) {
                        return atz.getDimensions(dimensionType)
                                .stream()
                                .map(Dimension::getId);
                    }
                    return conf.getScope().stream();
                }).collect(Collectors.toSet());
    }

    public static Set<Object> getDimensionDataAccessScope(Authentication atz,
                                                          Permission permission,
                                                          String action,
                                                          DimensionType dimensionType) {
        return getDimensionDataAccessScope(atz, permission, action, dimensionType.getId());
    }


    public static Set<Object> getDimensionDataAccessScope(Authentication atz,
                                                          String permission,
                                                          String action,
                                                          String dimensionType) {
        return atz
                .getPermission(permission)
                .map(per -> getDimensionDataAccessScope(atz, per, action, dimensionType)).orElseGet(Collections::emptySet);
    }

    public static Set<Object> getDimensionDataAccessScope(Authentication atz,
                                                          String permission,
                                                          String action,
                                                          DimensionType dimensionType) {
        return atz
                .getPermission(permission)
                .map(per -> getDimensionDataAccessScope(atz, per, action, dimensionType))
                .orElseGet(Collections::emptySet);
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/FieldFilterDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.access;

import java.util.Set;

/**
 * 对字段进行过滤操作配置,实现字段级别的权限控制
 *
 * @author zhouhao
 * @see DataAccessConfig
 * @see org.hswebframework.web.authorization.simple.SimpleFieldFilterDataAccessConfig
 */
public interface FieldFilterDataAccessConfig extends DataAccessConfig {
    Set<String> getFields();
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/OwnCreatedDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.access;

/**
 * 只能操作由自己创建的数据
 *
 * @author zhouhao
 */
public interface OwnCreatedDataAccessConfig extends DataAccessConfig {
    @Override
    default DataAccessType getType() {
        return DefaultDataAccessType.USER_OWN_DATA;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/ScopeDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.access;

import java.util.Set;

/**
 * 范围数据权限控制配置
 *
 * @author zhouhao
 * @see DataAccessConfig
 * @since 3.0
 */
public interface ScopeDataAccessConfig extends DataAccessConfig {

    /**
     * @return 范围类型
     */
    String getScopeType();

    /**
     * @return 自定义的控制范围
     */
    Set<Object> getScope();
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/UserAttachEntity.java
================================================
package org.hswebframework.web.authorization.access;


/**
 * 和user关联的实体
 *
 * @author zhouhao
 * @since 3.0.6
 */
public interface UserAttachEntity {
    String userId = "userId";

    String getUserId();

    void setUserId(String userId);

    default String getUserIdProperty() {
        return userId;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Authorize.java
================================================
/*
 *
 *  * Copyright 2020 http://www.hswebframework.org
 *  *
 *  * Licensed 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.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.define.Phased;

import java.lang.annotation.*;

/**
 * 基础权限控制注解,提供基本的控制配置
 *
 * @author zhouhao
 * @see org.hswebframework.web.authorization.Authentication
 * @see org.hswebframework.web.authorization.define.AuthorizeDefinition
 * @see Resource
 * @see ResourceAction
 * @see Dimension
 * @see DataAccess
 * @since 3.0
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Authorize {

    Resource[] resources() default {};

    Dimension[] dimension() default {};

    /**
     * 是否运行匿名访问,匿名访问时,直接允许执行,否则将进行权限验证.
     *
     * @return 是否允许匿名访问
     * @since 4.0.19
     */
    boolean anonymous() default false;

    /**
     * 验证失败时返回的消息
     *
     * @return 验证失败提示的消息
     */
    String message() default "无访问权限";

    /**
     * 是否合并类上的注解
     *
     * @return 是否合并类上的注解
     */
    boolean merge() default true;

    /**
     * 验证模式,在使用多个验证条件时有效
     *
     * @return logical
     */
    Logical logical() default Logical.DEFAULT;

    /**
     * @return 验证时机,在方法调用前还是调用后
     */
    Phased phased() default Phased.before;

    /**
     * @return 是否忽略, 忽略后将不进行权限控制
     */
    boolean ignore() default false;


    String[] description() default {};
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/CreateAction.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.Permission;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@ResourceAction(id = Permission.ACTION_ADD, name = "新增")
public @interface CreateAction {

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DataAccess.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.access.DataAccessController;

import java.lang.annotation.*;

/**
 * 数据级权限控制注解,用于进行需要数据级别权限控制的声明.
 * <p>
 * 此注解仅用于声明此方法需要进行数据级权限控制,具体权限控制方式由控制器实{@link DataAccessController}现
 * </p>
 *
 * @author zhouhao
 * @see DataAccessController
 * @see ResourceAction#dataAccess()
 * @since 3.0
 * @deprecated 已弃用, 4.1中移除
 */
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Deprecated
public @interface DataAccess {

    DataAccessType[] type() default {};

    /**
     * @return logical
     */
    Logical logical() default Logical.AND;

    /**
     * @return 是否忽略, 忽略后将不进行权限控制
     */
    boolean ignore() default false;


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DataAccessType.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.access.DataAccessConfiguration;
import org.hswebframework.web.authorization.access.DataAccessController;

import java.lang.annotation.*;

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Deprecated
public @interface DataAccessType {

    String id(); //标识

    String name(); //名称

    String[] description() default {};

    /**
     * @see DataAccessController
     */
    Class<? extends DataAccessController> controller() default DataAccessController.class;

    Class<? extends DataAccessConfiguration> configuration() default DataAccessConfiguration.class;

    boolean ignore() default false;
}

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DeleteAction.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.Permission;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@ResourceAction(id = Permission.ACTION_DELETE, name = "删除")
public @interface DeleteAction {

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Dimension.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.DimensionType;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 请使用注解继承方式使用此注解
 *
 * @author zhouhao
 * @see RequiresRoles
 * @since 4.0
 */
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Repeatable(value = Dimension.List.class)
public @interface Dimension {

    /**
     * 维度类型标识,如: role,org
     *
     * @return 维度类型
     * @see org.hswebframework.web.authorization.Dimension#getType()
     * @see DimensionType#getId()
     * @see org.hswebframework.web.authorization.Authentication#hasDimension(String, String...)
     */
    String type();

    /**
     * 具体的维度ID,如: 角色ID,组织ID
     *
     * @return 维度ID
     * @see org.hswebframework.web.authorization.Dimension#getId()
     * @see org.hswebframework.web.authorization.Authentication#hasDimension(String, String...)
     */
    String[] id() default {};

    /**
     * 配置了多个ID时的判断逻辑,默认为任意满足则认为有权限.
     *
     * @return Logical
     */
    Logical logical() default Logical.DEFAULT;

    /**
     * @return 说明
     */
    String[] description() default {};

    /**
     * @return 是否忽略
     */
    boolean ignore() default false;

    @Target({ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @Inherited
    @interface List {
        Dimension[] value() default {};
    }
}

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DimensionDataAccess.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.define.Phased;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

@DataAccessType(id = "dimension", name = "维度数据权限")
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Authorize
@Deprecated
public @interface DimensionDataAccess {

    Mapping[] mapping() default {};

    @AliasFor(annotation = Authorize.class)
    Phased phased() default Phased.before;

    @AliasFor(annotation = DataAccessType.class)
    boolean ignore() default false;

    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
    @interface Mapping {
        String dimensionType();

        String property();

        int idParamIndex() default -1;
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Dimensions.java
================================================
package org.hswebframework.web.authorization.annotation;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 标记多个维度的权限控制相关配置
 *
 * @author zhouhao
 * @since 5.0.1
 */
@Target({ElementType.METHOD, TYPE, ANNOTATION_TYPE, FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Dimensions {

    /**
     * 存在多个维度时的判断逻辑,默认任意一个满足则认为有权限
     *
     * @return Logical
     */
    Logical logical() default Logical.DEFAULT;

    /**
     * @return 针对当前配置的说明信息
     */
    String[] description() default {};

}

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/FieldDataAccess.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

/**
 * @deprecated 已弃用
 */
@DataAccessType(id = "FIELD_DENY", name = "字段权限")
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Deprecated
public @interface FieldDataAccess {

    @AliasFor(annotation = DataAccessType.class)
    boolean ignore() default false;
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Logical.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization.annotation;

public enum Logical {
    AND, OR, DEFAULT
}

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/QueryAction.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.Permission;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@ResourceAction(id = Permission.ACTION_QUERY, name = "查询")
public @interface QueryAction {

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/RequiresRoles.java
================================================
package org.hswebframework.web.authorization.annotation;


import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 注解根据角色维度进行权限控制,具有权限的用户才可访问对应的方法.
 *
 * <pre>{@code
 *    @RequiresRoles("admin")
 *    public Mono<Void> handleRequest(){
 *
 *    }
 * }</pre>
 *
 * @author zhouhao
 * @see Dimension
 * @since 4.0
 */
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Dimension(type = "role")
@Repeatable(RequiresRoles.List.class)
public @interface RequiresRoles {

    /**
     * @return 角色ID
     */
    @AliasFor(annotation = Dimension.class, attribute = "id")
    String[] value() default {};

    /**
     * 多个角色时的判断逻辑
     * @return Logical
     */
    @AliasFor(annotation = Dimension.class, attribute = "logical")
    Logical logical() default Logical.DEFAULT;

    @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
    @Retention(RUNTIME)
    @Documented
    @Inherited
    @Dimension.List()
    @interface List {
        RequiresRoles[] value();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Resource.java
================================================
package org.hswebframework.web.authorization.annotation;


import org.hswebframework.web.authorization.Permission;
import org.hswebframework.web.authorization.define.Phased;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 接口资源声明注解,声明Controller的资源相关信息,用于进行权限控制。
 * <br>
 * 在Controller进行注解,表示此接口需要有对应的权限{@link Permission#getId()}才能进行访问.
 * 具体的操作权限控制,需要在方法上注解{@link ResourceAction}.
 * <br>
 *
 *
 * <pre>{@code
 * @RestController
 * //声明资源
 * @Resource(id = "test", name = "测试功能")
 * public class TestController implements ReactiveCrudController<TestEntity, String> {
 *
 *     //声明操作,需要有 test:query 权限才能访问此接口
 *     @QueryAction
 *     public Mono<User> getUser() {
 *         return Authentication.currentReactive()
 *                 .switchIfEmpty(Mono.error(new UnAuthorizedException()))
 *                 .map(Authentication::getUser);
 *     }
 *
 * }
 * }
 * </pre>
 * 如果接口不需要进行权限控制,可注解{@link Authorize#ignore()}来标识此接口不需要权限控制.
 * 或者通过监听 {@link org.hswebframework.web.authorization.events.AuthorizingHandleBeforeEvent}来进行自定义处理
 * <pre>{@code
 *   @EventListener
 *   public void handleAuthEvent(AuthorizingHandleBeforeEvent e) {
 *      //admin用户可以访问全部操作
 *      if ("admin".equals(e.getContext().getAuthentication().getUser().getUsername())) {
 *         e.setAllow(true);
 *       }
 *    }
 * }</pre>
 *
 * @author zhouhao
 * @see ResourceAction
 * @see Authorize
 * @see org.hswebframework.web.authorization.events.AuthorizingHandleBeforeEvent
 * @since 4.0
 */
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD,ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Repeatable(Resource.List.class)
public @interface Resource {

    /**
     * 资源ID
     *
     * @return 资源ID
     */
    String id();

    /**
     * @return 资源名称
     */
    String name();

    /**
     * @return 资源操作定义
     */
    ResourceAction[] actions() default {};

    /**
     * @return 多个操作控制逻辑
     */
    Logical logical() default Logical.DEFAULT;

    /**
     * @return 权限控制阶段
     */
    Phased phased() default Phased.before;

    /**
     * @return 资源描述
     */
    String[] description() default {};

    /**
     * @return 资源分组
     */
    String[] group() default {};

    /**
     * 如果在方法上设置此属性,表示是否合并类上注解的属性
     *
     * @return 是否合并
     */
    boolean merge() default true;

    @Target({ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @Inherited
    @interface List {
        Resource[] value();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/ResourceAction.java
================================================
package org.hswebframework.web.authorization.annotation;


import org.hswebframework.web.authorization.Permission;

import java.lang.annotation.*;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 对资源操作的描述,通常用来进行权限控制.
 * <p>
 * 在Controller方法上添加此注解,来声明根据权限操作{@link Permission#getActions()}进行权限控制.
 * <p>
 * 可以使用注解继承的方式来统一定义操作:
 * <pre>{@code
 * @Target(ElementType.METHOD)
 * @Retention(RetentionPolicy.RUNTIME)
 * @Inherited
 * @Documented
 * @ResourceAction(id = "create", name = "新增")
 * public @interface CreateAction {
 *
 * }
 * }
 * </pre>
 *
 * @see CreateAction
 * @see DeleteAction
 * @see SaveAction
 * @see org.hswebframework.web.authorization.Authentication
 * @see Permission#getActions()
 */
@Target({ANNOTATION_TYPE, FIELD, METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Repeatable(ResourceAction.List.class)
public @interface ResourceAction {
    /**
     * 操作标识
     *
     * @return 操作标识
     * @see Permission#getActions()
     */
    String id();

    /**
     * @return 操作名称
     */
    String name();

    /**
     * @return 操作说明
     */
    String[] description() default {};

    /**
     * @return 多个操作时的判断逻辑
     */
    Logical logical() default Logical.DEFAULT;

    @Target({ANNOTATION_TYPE, FIELD, METHOD})
    @Retention(RUNTIME)
    @Documented
    @Inherited
    @interface List {
        ResourceAction[] value();
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/SaveAction.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.Permission;

import java.lang.annotation.*;

/**
 * 继承{@link ResourceAction},提供统一的id定义
 *
 * @author zhouhao
 * @since 4.0
 */
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@ResourceAction(id = Permission.ACTION_SAVE, name = "保存")
public @interface SaveAction {


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/TwoFactor.java
================================================
package org.hswebframework.web.authorization.annotation;

import org.hswebframework.web.authorization.twofactor.TwoFactorValidator;

import java.lang.annotation.*;

/**
 * 开启2FA双重验证
 *
 * @see org.hswebframework.web.authorization.twofactor.TwoFactorValidatorManager
 * @see org.hswebframework.web.authorization.twofactor.TwoFactorValidatorProvider
 * @see org.hswebframework.web.authorization.twofactor.TwoFactorValidator
 * @since 3.0.4
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TwoFactor {

    /**
     * @return 接口的标识, 用于实现不同的操作, 可能会配置不同的验证规则
     */
    String value();

    /**
     * @return 验证有效期, 超过有效期后需要重新进行验证
     */
    long timeout() default 10 * 60 * 1000L;

    /**
     * 验证器供应商,如: totp,sms,email,由{@link org.hswebframework.web.authorization.twofactor.TwoFactorValidatorProvider}进行自定义.
     * <p>
     * 可通过配置项: hsweb.authorize.two-factor.default-provider 来修改默认配置
     *
     * @return provider
     * @see TwoFactorValidator#getProvider()
     */
    String provider() default "default";

    /**
     * 验证码的http参数名,在进行验证的时候需要传入此参数
     *
     * @return 验证码的参数名
     */
    String parameter() default "verifyCode";

    /**
     * @return 关闭验证
     */
    boolean ignore() default false;

    /**
     *
     * @return 错误提示
     * @since 3.0.6
     */
    String message() default "validation.verify_code_error";
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/UserOwnData.java
================================================
package org.hswebframework.web.authorization.annotation;

import java.lang.annotation.*;

/**
 * 声明某个操作支持用户查看自己的数据
 *
 * @deprecated 已弃用
 */
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@DataAccessType(id = "user_own_data", name = "用户自己的数据")
@Deprecated
public @interface UserOwnData {

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/AuthenticationBuilder.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization.builder;

import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.authorization.Permission;
import org.hswebframework.web.authorization.Role;
import org.hswebframework.web.authorization.User;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface AuthenticationBuilder extends Serializable {

    AuthenticationBuilder user(User user);

    AuthenticationBuilder user(String user);

    AuthenticationBuilder user(Map<String, String> user);


    AuthenticationBuilder role(List<Role> role);

    AuthenticationBuilder role(String role);


    AuthenticationBuilder permission(List<Permission> permission);

    AuthenticationBuilder permission(String permission);

    AuthenticationBuilder attributes(String attributes);

    AuthenticationBuilder attributes(Map<String, Serializable> permission);

    AuthenticationBuilder json(String json);

    Authentication build();

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/AuthenticationBuilderFactory.java
================================================
package org.hswebframework.web.authorization.builder;

/**
 * 权限构造器工厂
 *
 * @author zhouhao
 */
public interface AuthenticationBuilderFactory {
    /**
     * @return 新建一个权限构造器
     */
    AuthenticationBuilder create();
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/DataAccessConfigBuilder.java
================================================
package org.hswebframework.web.authorization.builder;

import org.hswebframework.web.authorization.access.DataAccessConfig;

import java.util.Map;

/**
 *
 * @author zhouhao
 */
public interface DataAccessConfigBuilder {
    DataAccessConfigBuilder fromJson(String json);

    DataAccessConfigBuilder fromMap(Map<String,Object> json);

    DataAccessConfig build();
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/DataAccessConfigBuilderFactory.java
================================================
package org.hswebframework.web.authorization.builder;

/**
 * 数据权限配置构造器工厂
 *
 * @author zhouhao
 */
public interface DataAccessConfigBuilderFactory {
    /**
     * @return 新建一个数据权限配置构造器工厂
     */
    DataAccessConfigBuilder create();
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java
================================================
package org.hswebframework.web.authorization.context;

import io.micrometer.context.ThreadLocalAccessor;
import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.authorization.AuthenticationHolder;
import org.hswebframework.web.authorization.ReactiveAuthenticationHolder;

import javax.annotation.Nonnull;

public class AuthenticationThreadLocalAccessor
    implements ThreadLocalAccessor<Authentication> {

    static final Object KEY = Authentication.class;

    static {
        ReactiveAuthenticationHolder.addSupplier(
            new ThreadLocalReactiveAuthenticationSupplier()
        );
    }

    @Override
    @Nonnull
    public Object key() {
        return KEY;
    }

    @Override
    public Authentication getValue() {
        return AuthenticationHolder.get().orElse(null);
    }

    @Override
    public void setValue() {
        AuthenticationHolder.resetCurrent();
    }

    @Override
    public void setValue(@Nonnull Authentication value) {
        AuthenticationHolder.makeCurrent(value);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/ThreadLocalReactiveAuthenticationSupplier.java
================================================
package org.hswebframework.web.authorization.context;

import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.authorization.AuthenticationHolder;
import org.hswebframework.web.authorization.ReactiveAuthenticationSupplier;
import reactor.core.publisher.Mono;

class ThreadLocalReactiveAuthenticationSupplier implements ReactiveAuthenticationSupplier {
    @Override
    public Mono<Authentication> get(String userId) {
        return Mono.empty();
    }

    @Override
    public Mono<Authentication> get() {
        return Mono.justOrEmpty(AuthenticationHolder.get());
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AopAuthorizeDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import java.lang.reflect.Method;

/**
 * @author zhouhao
 * @since 1.0
 */
public interface AopAuthorizeDefinition extends AuthorizeDefinition {
    Class<?> getTargetClass();

    Method getTargetMethod();
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinition.java
================================================
package org.hswebframework.web.authorization.define;


import java.util.StringJoiner;

/**
 * 权限控制定义,定义权限控制的方式
 *
 * @author zhouhao
 * @since 3.0
 */
public interface AuthorizeDefinition {

    ResourcesDefinition getResources();

    DimensionsDefinition getDimensions();

    String getMessage();

    Phased getPhased();

    boolean isEmpty();

    default boolean allowAnonymous() {
        return false;
    }

    default String getDescription() {
        ResourcesDefinition res = getResources();
        StringJoiner joiner = new StringJoiner(";");
        for (ResourceDefinition resource : res.getResources()) {
            joiner.add(resource.getId() + ":" + String.join(",", resource.getActionIds()));
        }
        return joiner.toString();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionContext.java
================================================
package org.hswebframework.web.authorization.define;

public interface AuthorizeDefinitionContext {

    void addResource(ResourceDefinition def);

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionCustomizer.java
================================================
package org.hswebframework.web.authorization.define;

public interface AuthorizeDefinitionCustomizer {

    void custom(AuthorizeDefinitionContext context);

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionInitializedEvent.java
================================================
package org.hswebframework.web.authorization.define;

import org.hswebframework.web.authorization.events.AuthorizationEvent;
import org.springframework.context.ApplicationEvent;

import java.util.List;

public class AuthorizeDefinitionInitializedEvent extends ApplicationEvent implements AuthorizationEvent {
    private static final long serialVersionUID = -8185138454949381441L;

    public AuthorizeDefinitionInitializedEvent(List<AuthorizeDefinition> all) {
        super(all);
    }

    @SuppressWarnings("unchecked")
    public List<AuthorizeDefinition> getAllDefinition() {
        return ((List) getSource());
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizingContext.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hswebframework.web.aop.MethodInterceptorContext;
import org.hswebframework.web.authorization.Authentication;

/**
 * 权限控制上下文
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class AuthorizingContext {
    private AuthorizeDefinition definition;

    private Authentication authentication;

    private MethodInterceptorContext paramContext;

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/CompositeAuthorizeDefinitionCustomizer.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.AllArgsConstructor;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

@AllArgsConstructor
public class CompositeAuthorizeDefinitionCustomizer implements AuthorizeDefinitionCustomizer{

    private final List<AuthorizeDefinitionCustomizer> customizers;

    public CompositeAuthorizeDefinitionCustomizer(Iterable<AuthorizeDefinitionCustomizer> customizers){
        this(StreamSupport.stream(customizers.spliterator(),false).collect(Collectors.toList()));
    }

    @Override
    public void custom(AuthorizeDefinitionContext context) {
        for (AuthorizeDefinitionCustomizer customizer : customizers) {
            customizer.custom(context);
        }
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.Getter;
import lombok.Setter;

import java.util.*;

@Getter
@Setter
public class DataAccessDefinition {

    Set<DataAccessTypeDefinition> dataAccessTypes = new HashSet<>();

    public Optional<DataAccessTypeDefinition> getType(String typeId) {
        return dataAccessTypes
                .stream()
                .filter(type -> type.getId() != null && type.getId().equalsIgnoreCase(typeId))
                .findAny();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessTypeDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.authorization.access.DataAccessController;
import org.hswebframework.web.authorization.access.DataAccessType;
import org.hswebframework.web.authorization.access.DataAccessConfiguration;
import org.hswebframework.web.bean.FastBeanCopier;

@Getter
@Setter
@EqualsAndHashCode(of = "id")
public class DataAccessTypeDefinition implements DataAccessType {
    private String id;

    private String name;

    private String description;

    private Class<? extends DataAccessController> controller;

    private Class<? extends DataAccessConfiguration> configuration;

    public DataAccessTypeDefinition copy(){
        return FastBeanCopier.copy(this,DataAccessTypeDefinition::new);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DimensionDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.authorization.DimensionType;
import org.hswebframework.web.authorization.annotation.Logical;
import org.hswebframework.web.bean.FastBeanCopier;
import reactor.function.Predicate3;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.function.BiPredicate;
import java.util.function.Predicate;

@Getter
@Setter
@EqualsAndHashCode(of = "typeId")
public class DimensionDefinition {

    private String typeId;

    private String typeName;

    private Set<String> dimensionId = new HashSet<>();

    private Logical logical = Logical.DEFAULT;

    public boolean hasDimension(Predicate3<String,Logical, Set<String>> filter) {
        return filter.test(typeId,logical, Collections.unmodifiableSet(dimensionId));
    }

    public boolean hasDimension(Set<String> dimensionIdPredicate) {
        if (logical == Logical.AND) {
            return dimensionIdPredicate.containsAll(dimensionId);
        }
        return dimensionId
            .stream()
            .anyMatch(dimensionIdPredicate::contains);
    }

    public boolean hasDimension(String id) {
        return dimensionId.contains(id);
    }

    public void addDimensionI(Set<String> id) {
        dimensionId.addAll(id);
    }

    public DimensionDefinition copy() {
        return FastBeanCopier.copy(this, DimensionDefinition::new);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DimensionsDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Predicate;
import org.hswebframework.web.authorization.Dimension;
import org.hswebframework.web.authorization.annotation.Logical;
import reactor.function.Predicate3;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;

@Getter
@Setter
public class DimensionsDefinition {

    private Map<String, DimensionDefinition> dimensionsMapping = new ConcurrentHashMap<>();

    private Logical logical = Logical.DEFAULT;

    private String description;

    public Set<DimensionDefinition> getDimensions() {
        return new HashSet<>(dimensionsMapping.values());
    }

    public void clear() {
        dimensionsMapping.clear();
    }

    public void addDimension(DimensionDefinition definition) {
        DimensionDefinition old = dimensionsMapping.putIfAbsent(definition.getTypeId(), definition);
        if (old != null) {
            old.addDimensionI(definition.getDimensionId());
        }
    }

    public boolean isEmpty() {
        return MapUtils.isEmpty(this.dimensionsMapping);
    }

    public boolean hasDimension(Dimension dimension) {
        DimensionDefinition def = dimensionsMapping.get(dimension.getType().getId());
        return def != null && def.hasDimension(dimension.getId());
    }

    public boolean hasDimension(Predicate3<String,Logical, Set<String>> filter) {
        if (logical == Logical.AND) {
            return dimensionsMapping
                .values()
                .stream()
                .allMatch(e -> e.hasDimension(filter));
        } else {
            return dimensionsMapping
                .values()
                .stream()
                .anyMatch(e -> e.hasDimension(filter));
        }

    }

    public boolean hasDimension(List<Dimension> dimensions) {

        if (logical == Logical.AND) {
            return dimensions.stream().allMatch(this::hasDimension);
        }

        return dimensions.stream().anyMatch(this::hasDimension);
    }

    @Override
    public String toString() {
        return dimensionsMapping
            .values()
            .stream()
            .map(d -> String.join(",", d.getDimensionId()) + "@" + d.getTypeId())
            .collect(Collectors.joining(";"));
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/HandleType.java
================================================
package org.hswebframework.web.authorization.define;

public enum HandleType{
        RBAC,DATA
    }

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/MergedAuthorizeDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import java.util.List;
import java.util.Set;


public class MergedAuthorizeDefinition implements AuthorizeDefinitionContext {

    private final ResourcesDefinition resources = new ResourcesDefinition();

    private final DimensionsDefinition dimensions = new DimensionsDefinition();

    public Set<ResourceDefinition> getResources() {
        return resources.getResources();
    }

    public Set<DimensionDefinition> getDimensions() {
        return dimensions.getDimensions();
    }

    public void addResource(ResourceDefinition resource) {
        resources.addResource(resource, true);
    }

    public void addDimension(DimensionDefinition resource) {
        dimensions.addDimension(resource);
    }

    public void merge(List<AuthorizeDefinition> definitions) {
        for (AuthorizeDefinition definition : definitions) {
            definition.getResources().getResources().forEach(this::addResource);
            definition.getDimensions().getDimensions().forEach(this::addDimension);
        }
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/Phased.java
================================================
package org.hswebframework.web.authorization.define;

public enum Phased {
    before, after
}

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.bean.FastBeanCopier;
import org.hswebframework.web.i18n.I18nSupportUtils;
import org.hswebframework.web.i18n.MultipleI18nSupportEntity;

import java.util.Collection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import static org.hswebframework.web.authorization.define.ResourceDefinition.supportLocale;

@Getter
@Setter
@EqualsAndHashCode(of = "id")
public class ResourceActionDefinition implements MultipleI18nSupportEntity {
    private String id;

    private String name;

    private String description;

    private Map<String, Map<String, String>> i18nMessages;

    @Deprecated
    private DataAccessDefinition dataAccess = new DataAccessDefinition();


    private final static String resolveActionPrefix = "hswebframework.web.system.action.";

    public ResourceActionDefinition copy() {
        return FastBeanCopier.copy(this, ResourceActionDefinition::new);
    }

    public Map<String, Map<String, String>> getI18nMessages() {
        if (org.springframework.util.CollectionUtils.isEmpty(i18nMessages)) {
            this.i18nMessages = I18nSupportUtils
                    .putI18nMessages(
                            resolveActionPrefix + this.id, "name", supportLocale, null, this.i18nMessages
                    );
        }
        return i18nMessages;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;
import org.hswebframework.web.authorization.annotation.Logical;
import org.hswebframework.web.bean.FastBeanCopier;
import org.hswebframework.web.i18n.I18nSupportUtils;
import org.hswebframework.web.i18n.MultipleI18nSupportEntity;

import java.util.*;
import java.util.stream.Collectors;

@Getter
@Setter
@EqualsAndHashCode(of = "id")
public class ResourceDefinition implements MultipleI18nSupportEntity {
    private String id;

    private String name;

    private String description;

    private Set<ResourceActionDefinition> actions = new HashSet<>();

    private List<String> group;

    private Map<String, Map<String, String>> i18nMessages;

    @Setter(value = AccessLevel.PRIVATE)
    @JsonIgnore
    private volatile Set<String> actionIds;

    private Logical logical = Logical.DEFAULT;

    private Phased phased = Phased.before;

    public final static List<Locale> supportLocale = new ArrayList<>();

    static {
        supportLocale.add(Locale.CHINESE);
        supportLocale.add(Locale.ENGLISH);
    }


    private final static String resolvePermissionPrefix = "hswebframework.web.system.permission.";

    public static ResourceDefinition of(String id, String name) {
        ResourceDefinition definition = new ResourceDefinition();
        definition.setId(id);
        definition.setName(name);
        return definition;
    }

    public Map<String, Map<String, String>> getI18nMessages() {
        if (org.springframework.util.CollectionUtils.isEmpty(i18nMessages)) {
            this.i18nMessages = I18nSupportUtils
                    .putI18nMessages(
                            resolvePermissionPrefix + this.id, "name", supportLocale, null, this.i18nMessages
                    );
        }
        return i18nMessages;
    }

    public ResourceDefinition copy() {
        ResourceDefinition definition = FastBeanCopier.copy(this, ResourceDefinition::new);
        definition.setActions(actions.stream().map(ResourceActionDefinition::copy).collect(Collectors.toSet()));
        return definition;
    }

    public ResourceDefinition addAction(String id, String name) {
        ResourceActionDefinition action = new ResourceActionDefinition();
        action.setId(id);
        action.setName(name);
        return addAction(action);
    }

    public synchronized ResourceDefinition addAction(ResourceActionDefinition action) {
        actionIds = null;
        actions.add(action);
        return this;
    }

    public Optional<ResourceActionDefinition> getAction(String action) {
        return actions.stream()
                      .filter(act -> act.getId().equalsIgnoreCase(action))
                      .findAny();
    }

    public Set<String> getActionIds() {
        if (actionIds == null) {
            actionIds = this.actions
                    .stream()
                    .map(ResourceActionDefinition::getId)
                    .collect(Collectors.toSet());
        }
        return actionIds;
    }

    @JsonIgnore
    public List<ResourceActionDefinition> getDataAccessAction() {
        return actions.stream()
                      .filter(act -> CollectionUtils.isNotEmpty(act.getDataAccess().getDataAccessTypes()))
                      .collect(Collectors.toList());
    }

    public boolean hasDataAccessAction() {
        return actions.stream()
                      .anyMatch(act -> CollectionUtils.isNotEmpty(act.getDataAccess().getDataAccessTypes()));
    }

    public boolean hasAction(Collection<String> actions) {
        if (CollectionUtils.isEmpty(this.actions)) {
            return true;
        }

        if (CollectionUtils.isEmpty(actions)) {
            return false;
        }

        if (logical == Logical.AND) {
            return getActionIds().containsAll(actions);
        }
        return getActionIds().stream().anyMatch(actions::contains);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourcesDefinition.java
================================================
package org.hswebframework.web.authorization.define;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;
import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.authorization.Permission;
import org.hswebframework.web.authorization.annotation.Logical;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

@Getter
@Setter
public class ResourcesDefinition {

    private final Set<ResourceDefinition> resources = ConcurrentHashMap.newKeySet();

    private Logical logical = Logical.DEFAULT;

    private Phased phased = Phased.before;

    public void clear() {
        resources.clear();
    }

    public void addResource(ResourceDefinition resource, boolean merge) {
        ResourceDefinition definition = getResource(resource.getId()).orElse(null);
        if (definition != null) {
            if (merge) {
                resource.getActions()
                        .stream()
                        .map(ResourceActionDefinition::copy)
                        .forEach(definition::addAction);
            } else {
                resources.remove(definition);
            }
        }
        resources.add(resource.copy());

    }


    public Optional<ResourceDefinition> getResource(String id) {
        return resources
            .stream()
            .filter(resource -> resource.getId().equals(id))
            .findAny();
    }

    @JsonIgnore
    public List<ResourceDefinition> getDataAccessResources() {
        return resources
            .stream()
            .filter(ResourceDefinition::hasDataAccessAction)
            .collect(Collectors.toList());
    }

    public boolean hasPermission(Permission permission) {
        if (CollectionUtils.isEmpty(resources)) {
            return true;
        }
        return getResource(permission.getId())
            .filter(resource -> resource.hasAction(permission.getActions()))
            .isPresent();
    }

    public boolean isEmpty() {
        return resources.isEmpty();
    }

    public boolean hasPermission(Authentication authentication) {

        int size = resources.size();
        if (size == 0) {
            return true;
        }
        if (size == 1) {
            for (ResourceDefinition resource : resources) {
                if (authentication.hasPermission(resource.getId(), resource.getActionIds())) {
                    return true;
                }
            }
            return false;
        }

        if (logical == Logical.AND) {
            return resources
                .stream()
                .allMatch(resource -> authentication.hasPermission(resource.getId(), resource.getActionIds()));
        }

        return resources
            .stream()
            .anyMatch(resource -> authentication.hasPermission(resource.getId(), resource.getActionIds()));
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionManager.java
================================================
package org.hswebframework.web.authorization.dimension;

import reactor.core.publisher.Flux;

import java.util.Collection;

/**
 * 维度管理器
 *
 * @author zhouhao
 * @since 4.0.12
 */
public interface DimensionManager {

    /**
     * 获取用户维度
     *
     * @param userId 用户ID
     * @return 用户维度信息
     */
    Flux<DimensionUserDetail> getUserDimension(Collection<String> userId);


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserBind.java
================================================
package org.hswebframework.web.authorization.dimension;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

@Getter
@Setter
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
public class DimensionUserBind implements Externalizable {
    private static final long serialVersionUID = -6849794470754667710L;

    private String userId;

    private String dimensionType;

    private String dimensionId;

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(userId);
        out.writeUTF(dimensionType);
        out.writeUTF(dimensionId);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        userId = in.readUTF();
        dimensionType = in.readUTF();
        dimensionId = in.readUTF();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserBindProvider.java
================================================
package org.hswebframework.web.authorization.dimension;

import reactor.core.publisher.Flux;

import java.util.Collection;

public interface DimensionUserBindProvider {

    Flux<DimensionUserBind> getDimensionBindInfo(Collection<String> userIdList);

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserDetail.java
================================================
package org.hswebframework.web.authorization.dimension;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hswebframework.web.authorization.Dimension;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
public class DimensionUserDetail implements Serializable {
    private static final long serialVersionUID = -6849794470754667710L;


    private String userId;

    private List<Dimension> dimensions;

    public DimensionUserDetail merge(DimensionUserDetail detail) {
        DimensionUserDetail newDetail = new DimensionUserDetail();
        newDetail.setUserId(userId);
        newDetail.setDimensions(new ArrayList<>());
        if (null != dimensions) {
            newDetail.dimensions.addAll(dimensions);
        }
        if (null != detail.getDimensions()) {
            newDetail.dimensions.addAll(detail.getDimensions());
        }
        return newDetail;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;


import org.hswebframework.web.event.DefaultAsyncEvent;

import java.util.Optional;
import java.util.function.Function;

/**
 * 抽象授权事件,保存事件常用的数据
 *
 * @author zhouhao
 * @since 3.0
 */
public abstract class AbstractAuthorizationEvent extends DefaultAsyncEvent implements AuthorizationEvent {
    private static final long serialVersionUID = -3027505108916079214L;

    protected String username;

    protected String password;

    private final transient Function<String, Object> parameterGetter;

    /**
     * 所有参数不能为null
     *
     * @param username        用户名
     * @param password        密码
     * @param parameterGetter 参数获取函数,用户获取授权时传入的参数
     */
    public AbstractAuthorizationEvent(String username, String password, Function<String, Object> parameterGetter) {
        if (username == null || password == null || parameterGetter == null) {
            throw new NullPointerException();
        }
        this.username = username;
        this.password = password;
        this.parameterGetter = parameterGetter;
    }

    @SuppressWarnings("unchecked")
    public <T> Optional<T> getParameter(String name) {
        return Optional.ofNullable((T) parameterGetter.apply(name));
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationBeforeEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;

import lombok.Getter;
import org.hswebframework.web.authorization.Authentication;

import java.util.function.Function;

/**
 * 授权前事件
 *
 * @author zhouhao
 * @since 3.0
 */
@Getter
public class AuthorizationBeforeEvent extends AbstractAuthorizationEvent {

    private static final long serialVersionUID = 5948747533500518524L;

    private String userId;

    private Authentication authentication;

    public AuthorizationBeforeEvent(String username, String password, Function<String, Object> parameterGetter) {
        super(username, password, parameterGetter);
    }

    public void setAuthorized(String userId) {
        this.userId = userId;
    }

    public void setAuthorized(Authentication authentication) {
        this.authentication = authentication;
    }

    public boolean isAuthorized() {
        return userId != null || authentication != null;
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationDecodeEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;

import java.util.function.Function;

/**
 * 在进行授权时的最开始,触发此事件进行用户名密码解码,解码后请调用{@link #setUsername(String)} {@link #setPassword(String)}重新设置用户名密码
 *
 * @author zhouhao
 * @since 3.0
 */
public class AuthorizationDecodeEvent extends AbstractAuthorizationEvent {

    private static final long serialVersionUID = 5418501934490174251L;

    public AuthorizationDecodeEvent(String username, String password, Function<String, Object> parameterGetter) {
        super(username, password, parameterGetter);
    }

    public void setUsername(String username) {
        super.username = username;
    }

    public void setPassword(String password) {
        super.password = password;
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;

/**
 * 授权事件
 *
 * @author zhouhao
 * @see AuthorizationSuccessEvent
 * @see AuthorizationFailedEvent
 * @see AuthorizationBeforeEvent
 * @see AuthorizationDecodeEvent
 * @see AuthorizationExitEvent
 * @see org.springframework.context.ApplicationEvent
 * @since 3.0
 */
public interface AuthorizationEvent {
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationExitEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;

import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.event.DefaultAsyncEvent;
import org.springframework.context.ApplicationEvent;

/**
 * 退出登录事件
 *
 * @author zhouhao
 */
public class AuthorizationExitEvent extends DefaultAsyncEvent implements AuthorizationEvent {

    private static final long serialVersionUID = -4590245933665047280L;

    private final Authentication authentication;

    public AuthorizationExitEvent(Authentication authentication) {
        this.authentication = authentication;
    }

    public Authentication getAuthentication() {
        return authentication;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationFailedEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;

import java.util.function.Function;

/**
 * 授权失败时触发
 *
 * @author zhouhao
 */
public class AuthorizationFailedEvent extends AbstractAuthorizationEvent {

    private static final long serialVersionUID = -101792832265740828L;

    /**
     * 异常信息
     */
    private Throwable exception;

    public AuthorizationFailedEvent(String username,
                                    String password,
                                    Function<String, Object> parameterGetter) {
        super(username, password, parameterGetter);
    }

    public Throwable getException() {
        return exception;
    }

    public void setException(Throwable exception) {
        this.exception = exception;
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java
================================================
package org.hswebframework.web.authorization.events;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.event.DefaultAsyncEvent;

@Getter
@Setter
@AllArgsConstructor
public class AuthorizationInitializeEvent extends DefaultAsyncEvent {

    private Authentication authentication;
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java
================================================
/*
 *  Copyright 2020 http://www.hswebframework.org
 *
 *  Licensed 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.hswebframework.web.authorization.events;

import org.hswebframework.web.authorization.Authentication;
import org.hswebframework.web.event.DefaultAsyncEvent;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;

/**
 * 授权成功事件,当授权成功时,触发此事件,并传入授权的信息
 *
 * @author zhouhao
 * @see Authentication
 * @since 3.0
 */
public class AuthorizationSuccessEvent extends DefaultAsyncEvent implements AuthorizationEvent {
    private static final long serialVersionUID = -2452116314154155058L;
    private final Authentication authentication;

    private final transient Function<String, Object> parameterGetter;

    private Map<String, Object> result = new HashMap<>();

    public AuthorizationSuccessEvent(Authentication authentication, Function<String, Object> parameterGetter) {
        this.authentication = authentication;
        this.parameterGetter = parameterGetter;
    }

    public Authentication getAuthentication() {
        return authentication;
    }

    @SuppressWarnings("unchecked")
    public <T> Optional<T> getParameter(String name) {
        return Optional.ofNullable((T) parameterGetter.apply(name));
    }

    public Map<String, Object> getResult() {
        return result;
    }

    public void setResult(Map<String, Object> result) {
        this.result = result;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizingHandleBeforeEvent.java
================================================
package org.hswebframework.web.authorization.events;

import org.hswebframework.web.authorization.define.AuthorizingContext;
import org.hswebframework.web.authorization.define.HandleType;
import org.hswebframework.web.event.DefaultAsyncEvent;
import org.springframework.context.ApplicationEvent;

/**
 * 权限控制事件,在进行权限控制之前会推送此事件,用于自定义权限控制结果:
 * <pre>{@code
 *   @EventListener
 *   public void handleAuthEvent(AuthorizingHandleBeforeEvent e) {
 *      //admin用户可以访问全部操作
 *      if ("admin".equals(e.getContext().getAuthentication().getUser().getUsername())) {
 *         e.setAllow(true);
 *       }
 *    }
 * }</pre>
 *
 * @author zhouhao
 * @since 4.0
 */
public class AuthorizingHandleBeforeEvent extends DefaultAsyncEvent implements AuthorizationEvent {

    private boolean allow = false;

    private boolean execute = true;

    private String message;

    private final AuthorizingContext context;

    /**
     * @deprecated 数据权限控制已取消,4.1版本后移除
     */
    @Deprecated
    private final HandleType handleType;

    public AuthorizingHandleBeforeEvent(AuthorizingContext context, HandleType handleType) {
        this.context = context;
        this.handleType = handleType;
    }

    public AuthorizingContext getContext() {
        return context;
    }

    public boolean isExecute() {
        return execute;
    }

    public boolean isAllow() {
        return allow;
    }

    /**
     * 设置通过当前请求
     *
     * @param allow allow
     */
    public void setAllow(boolean allow) {
        execute = false;
        this.allow = allow;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 设置错误提示消息
     *
     * @param message 消息
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * @return 权限控制类型
     */
    public HandleType getHandleType() {
        return handleType;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/AccessDenyException.java
================================================
package org.hswebframework.web.authorization.exception;

import lombok.Getter;
import org.hswebframework.web.exception.I18nSupportException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.util.Set;

/**
 * 权限验证异常
 *
 * @author zhouhao
 * @since 3.0
 */
@ResponseStatus(HttpStatus.FORBIDDEN)
@Getter
public class AccessDenyException extends I18nSupportException {

    private static final long serialVersionUID = -5135300127303801430L;

    private String code;

    public AccessDenyException() {
        this("error.access_denied");
    }

    public AccessDenyException(String message) {
        super(message);
    }

    public AccessDenyException(String permission, Set<String> actions) {
        super("error.permission_denied", permission, actions);
    }

    public AccessDenyException(String message, String code) {
        this(message, code, null);
    }

    public AccessDenyException(String message, Throwable cause) {
        this(message, "access_denied", cause);
    }

    public AccessDenyException(String message, String code, Throwable cause) {
        super(message, cause, code);
        this.code = code;
    }

    /**
     * 不填充线程栈的异常,在一些对线程栈不敏感,且对异常不可控(如: 来自未认证请求产生的异常)的情况下不填充线程栈对性能有利。
     */
    public static class NoStackTrace extends AccessDenyException {
        public NoStackTrace() {
            super();
        }

        public NoStackTrace(String message) {
            super(message);
        }

        public NoStackTrace(String permission, Set<String> actions) {
            super(permission, actions);
        }

        public NoStackTrace(String message, String code) {
            super(message, code);
        }

        public NoStackTrace(String message, Throwable cause) {
            super(message, cause);
        }

        public NoStackTrace(String message, String code, Throwable cause) {
            super(message, code, cause);
        }

        @Override
        public final synchronized Throwable fillInStackTrace() {
            return this;
        }
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/AuthenticationException.java
================================================
package org.hswebframework.web.authorization.exception;

import lombok.Getter;
import org.hswebframework.web.exception.I18nSupportException;

@Getter
public class AuthenticationException extends I18nSupportException {


    public static String ILLEGAL_PASSWORD = "illegal_password";

    public static String USER_DISABLED = "user_disabled";


    private final String code;

    public AuthenticationException(String code) {
        this(code, "error." + code);
    }

    public AuthenticationException(String code, String message) {
        super(message);
        this.code = code;
    }

    public AuthenticationException(String code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

    /**
     * 不填充线程栈的异常,在一些对线程栈不敏感,且对异常不可控(如: 来自未认证请求产生的异常)的情况下不填充线程栈对性能有利。
     */
    public static class NoStackTrace extends AuthenticationException {
        public NoStackTrace(String code) {
            super(code);
        }

        public NoStackTrace(String code, String message) {
            super(code, message);
        }

        public NoStackTrace(String code, String message, Throwable cause) {
            super(code, message, cause);
        }

        @Override
        public final synchronized Throwable fillInStackTrace() {
            return this;
        }
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/NeedTwoFactorException.java
================================================
package org.hswebframework.web.authorization.exception;

import lombok.Getter;

/**
 * @author zhouhao
 * @since 3.0.4
 */
@Getter
public class NeedTwoFactorException extends RuntimeException {
    private static final long   serialVersionUID = 3655980280834947633L;
    private              String provider;

    public NeedTwoFactorException(String message, String provider) {
        super(message);
        this.provider = provider;
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/UnAuthorizedException.java
================================================
/*
 *
 *  * Copyright 2020 http://www.hswebframework.org
 *  *
 *  * Licensed 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.hswebframework.web.authorization.exception;

import lombok.Getter;
import org.hswebframework.web.authorization.token.TokenState;
import org.hswebframework.web.exception.I18nSupportException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * 未授权异常
 *
 * @author zhouhao
 * @since 3.0
 */
@Getter
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public class UnAuthorizedException extends I18nSupportException {
    private static final long serialVersionUID = 2422918455013900645L;

    private final TokenState state;

    public UnAuthorizedException() {
        this(TokenState.expired);
    }

    public UnAuthorizedException(TokenState state) {
        this(state.getText(), state);
    }

    public UnAuthorizedException(String message, TokenState state) {
        super(message);
        this.state = state;
    }

    public UnAuthorizedException(String message, TokenState state, Throwable cause) {
        super(message, cause);
        this.state = state;
    }

    /**
     * 不填充线程栈的异常,在一些对线程栈不敏感,且对异常不可控(如: 来自未认证请求产生的异常)的情况下不填充线程栈对性能有利。
     */
    public static class NoStackTrace extends UnAuthorizedException {
        public NoStackTrace() {
            super();
        }

        public NoStackTrace(TokenState state) {
            super(state);
        }

        public NoStackTrace(String message, TokenState state) {
            super(message, state);
        }

        public NoStackTrace(String message, TokenState state, Throwable cause) {
            super(message, state, cause);
        }

        @Override
        public final synchronized Throwable fillInStackTrace() {
            return this;
        }
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/SettingNullValueHolder.java
================================================
package org.hswebframework.web.authorization.setting;

import java.util.List;
import java.util.Optional;

/**
 * @author zhouhao
 * @since 1.0.0
 */
public class SettingNullValueHolder implements SettingValueHolder {

    public static final SettingNullValueHolder INSTANCE = new SettingNullValueHolder();

    private SettingNullValueHolder() {
    }

    @Override
    public <T> Optional<List<T>> asList(Class<T> t) {
        return Optional.empty();
    }

    @Override
    public <T> Optional<T> as(Class<T> t) {
        return Optional.empty();
    }

    @Override
    public Optional<String> asString() {
        return Optional.empty();
    }

    @Override
    public Optional<Long> asLong() {
        return Optional.empty();
    }

    @Override
    public Optional<Integer> asInt() {
        return Optional.empty();
    }

    @Override
    public Optional<Double> asDouble() {
        return Optional.empty();
    }

    @Override
    public Optional<Object> getValue() {
        return Optional.empty();
    }

    @Override
    public UserSettingPermission getPermission() {
        return UserSettingPermission.NONE;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/SettingValueHolder.java
================================================
package org.hswebframework.web.authorization.setting;

import java.util.List;
import java.util.Optional;

public interface SettingValueHolder {

    SettingValueHolder NULL = SettingNullValueHolder.INSTANCE;

    <T> Optional<List<T>> asList(Class<T> t);

    <T> Optional<T> as(Class<T> t);

    Optional<String> asString();

    Optional<Long> asLong();

    Optional<Integer> asInt();

    Optional<Double> asDouble();

    Optional<Object> getValue();

    UserSettingPermission getPermission();

}

================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/StringSourceSettingHolder.java
================================================
package org.hswebframework.web.authorization.setting;


import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.hswebframework.utils.StringUtils;
import org.hswebframework.web.dict.EnumDict;

import java.util.List;
import java.util.Optional;

/**
 * @author zhouhao
 * @since 3.0.4
 */
@AllArgsConstructor
@Getter
public class StringSourceSettingHolder implements SettingValueHolder {

    private String value;

    private UserSettingPermission permission;

    public static SettingValueHolder of(String value, UserSettingPermission permission) {
        if (value == null) {
            return SettingValueHolder.NULL;
        }
        return new StringSourceSettingHolder(value, permission);
    }

    @Override
    public <T> Optional<List<T>> asList(Class<T> t) {
        return getNativeValue()
                .map(v -> JSON.parseArray(v, t));
    }

    protected <T> T convert(String value, Class<T> t) {
        if (t.isEnum()) {
            if (EnumDict.class.isAssignableFrom(t)) {
                T val = (T) EnumDict.find((Class) t, value).orElse(null);
                if (null != val) {
                    return val;
                }
            }
            for (T enumConstant : t.getEnumConstants()) {
                if (((Enum) enumConstant).name().equalsIgnoreCase(value)) {
                    return enumConstant;
                }
            }
        }
        return JSON.parseObject(value, t);
    }

    @Override
    @SuppressWarnings("all")
    public <T> Optional<T> as(Class<T> t) {
        if (t == String.class) {
            return (Optional) asString();
        } else if (Long.class == t || long.class == t) {
            return (Optional) asLong();
        } else if (Integer.class == t || int.class == t) {
            return (Optional) asInt();
        } else if (Double.class == t || double.class == t) {
            return (Optional) asDouble();
        }
        return getNativeValue().map(v -> convert(v, t));
    }

    @Override
    public Optional<String> asString() {
        return getNativeValue();
    }

    @Override
    public Optional<Long> asLong() {
        return getNativeValue().map(StringUtils::toLong);
    }

    @Override
    public Optional<Integer> asInt() {
        return getNativeValue().map(StringUtils::toInt);
    }

    @Override
    public Optional<Double> asDouble() {
        return getNativeValue().map(StringUtils::toDouble);
    }

    private Optional<String> getNativeValue() {
        return Optional.ofNullable(value);
    }

    @Override
    public Optional<Object> getValue() {
        return Optional.ofNullable(value);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/UserSettingManager.java
================================================
package org.hswebframework.web.authorization.setting;

/**
 * @author zhouhao
 * @since 3.0.4
 */
public interface UserSettingManager {

    SettingValueHolder getSetting(String userId, String key);

    void saveSetting(String userId, String key, String value, UserSettingPermission permission);

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/UserSettingPermission.java
================================================
package org.hswebframework.web.authorization.setting;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.hswebframework.web.dict.Dict;
import org.hswebframework.web.dict.EnumDict;

/**
 * @author zhouhao
 * @since 3.0.4
 */
@AllArgsConstructor
@Getter
@Dict("user-setting-permission")
public enum UserSettingPermission implements EnumDict<String> {
    NONE("无"),
    R("读"),
    W("写"),
    RW("读写");
    private String text;

    @Override
    public String getValue() {
        return name();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/AbstractDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.simple;

import org.hswebframework.web.authorization.access.DataAccessConfig;

/**
 * @author zhouhao
 * @see DataAccessConfig
 * @since 3.0
 */
public abstract class AbstractDataAccessConfig implements DataAccessConfig {

    private static final long serialVersionUID = -9025349704771557106L;

    private String action;

    @Override
    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/CompositeReactiveAuthenticationManager.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.hswebframework.web.authorization.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

@AllArgsConstructor
@Slf4j
public class CompositeReactiveAuthenticationManager implements ReactiveAuthenticationManager {

    private final List<ReactiveAuthenticationManagerProvider> providers;

    @Override
    public Mono<Authentication> authenticate(Mono<AuthenticationRequest> request) {
        return Flux
            .concat(
                providers
                    .stream()
                    .map(manager -> manager
                        .authenticate(request)
                        .onErrorResume((err) -> {
                            log.warn("get user authenticate error", err);
                            return Mono.empty();
                        }))
                    .collect(Collectors.toList()))
            .take(1)
            .next();
    }

    @Override
    public Mono<Authentication> getByUserId(String userId) {
        if (providers.size() == 1) {
            return providers.get(0).getByUserId(userId);
        }
        return Flux
            .fromStream(providers
                            .stream()
                            .map(manager -> manager
                                .getByUserId(userId)
                                .onErrorResume((err) -> {
                                    log.warn("get user [{}] authentication error", userId, err);
                                    return Mono.empty();
                                })
                            ))
            .flatMap(Function.identity())
            .as(AuthenticationUtils::merge);
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java
================================================
package org.hswebframework.web.authorization.simple;

import org.hswebframework.web.authorization.*;
import org.hswebframework.web.authorization.builder.AuthenticationBuilderFactory;
import org.hswebframework.web.authorization.builder.DataAccessConfigBuilderFactory;
import org.hswebframework.web.authorization.dimension.DimensionManager;
import org.hswebframework.web.authorization.dimension.DimensionUserBindProvider;
import org.hswebframework.web.authorization.simple.builder.DataAccessConfigConverter;
import org.hswebframework.web.authorization.simple.builder.SimpleAuthenticationBuilderFactory;
import org.hswebframework.web.authorization.simple.builder.SimpleDataAccessConfigBuilderFactory;
import org.hswebframework.web.authorization.token.*;
import org.hswebframework.web.authorization.twofactor.TwoFactorValidatorManager;
import org.hswebframework.web.authorization.twofactor.defaults.DefaultTwoFactorValidatorManager;
import org.hswebframework.web.convert.CustomMessageConverter;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * @author zhouhao
 */
@AutoConfiguration
public class DefaultAuthorizationAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(UserTokenManager.class)
    @ConfigurationProperties(prefix = "hsweb.user-token")
    public UserTokenManager userTokenManager() {
        return new DefaultUserTokenManager();
    }

    @Bean
    @ConditionalOnMissingBean
//    @ConditionalOnBean(ReactiveAuthenticationManagerProvider.class)
    public ReactiveAuthenticationManager reactiveAuthenticationManager(List<ReactiveAuthenticationManagerProvider> providers) {
        return new CompositeReactiveAuthenticationManager(providers);
    }

    @Bean
    @ConditionalOnBean(ReactiveAuthenticationManager.class)
    public UserTokenReactiveAuthenticationSupplier userTokenReactiveAuthenticationSupplier(UserTokenManager userTokenManager,
                                                                                           ReactiveAuthenticationManager authenticationManager) {
        UserTokenReactiveAuthenticationSupplier supplier = new UserTokenReactiveAuthenticationSupplier(userTokenManager, authenticationManager);
        ReactiveAuthenticationHolder.addSupplier(supplier);
        return supplier;
    }

    @Bean
    @ConditionalOnBean(AuthenticationManager.class)
    public UserTokenAuthenticationSupplier userTokenAuthenticationSupplier(UserTokenManager userTokenManager,
                                                                           AuthenticationManager authenticationManager) {
        UserTokenAuthenticationSupplier supplier = new UserTokenAuthenticationSupplier(userTokenManager, authenticationManager);
        AuthenticationHolder.addSupplier(supplier);
        return supplier;
    }

    @Bean
    @ConditionalOnMissingBean(DataAccessConfigBuilderFactory.class)
    @ConfigurationProperties(prefix = "hsweb.authorization.data-access", ignoreInvalidFields = true)
    public SimpleDataAccessConfigBuilderFactory dataAccessConfigBuilderFactory() {
        return new SimpleDataAccessConfigBuilderFactory();
    }

    @Bean
    @ConditionalOnMissingBean(AuthenticationBuilderFactory.class)
    public AuthenticationBuilderFactory authenticationBuilderFactory(DataAccessConfigBuilderFactory dataAccessConfigBuilderFactory) {
        return new SimpleAuthenticationBuilderFactory(dataAccessConfigBuilderFactory);
    }

    @Bean
    public CustomMessageConverter authenticationCustomMessageConverter(AuthenticationBuilderFactory factory) {
        return new CustomMessageConverter() {
            @Override
            public boolean support(Class clazz) {
                return clazz == Authentication.class;
            }

            @Override
            public Object convert(Class clazz, byte[] message) {
                String json = new String(message);

                return factory.create().json(json).build();
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean(DimensionManager.class)
    public DimensionManager defaultDimensionManager(ObjectProvider<DimensionUserBindProvider>bindProviders,
                                                    ObjectProvider<DimensionProvider> providers){
        DefaultDimensionManager manager =  new DefaultDimensionManager();
        bindProviders.forEach(manager::addBindProvider);
        providers.forEach(manager::addProvider);

        return manager;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultDimensionManager.java
================================================
package org.hswebframework.web.authorization.simple;

import org.hswebframework.web.authorization.Dimension;
import org.hswebframework.web.authorization.DimensionProvider;
import org.hswebframework.web.authorization.dimension.DimensionManager;
import org.hswebframework.web.authorization.dimension.DimensionUserBind;
import org.hswebframework.web.authorization.dimension.DimensionUserBindProvider;
import org.hswebframework.web.authorization.dimension.DimensionUserDetail;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.util.function.Tuple2;
import reactor.util.function.Tuples;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;
import java.util.stream.Collectors;

public class DefaultDimensionManager implements DimensionManager {

    private final List<DimensionProvider> dimensionProviders = new CopyOnWriteArrayList<>();
    private final List<DimensionUserBindProvider> bindProviders = new CopyOnWriteArrayList<>();

    private final Mono<Map<String, DimensionProvider>> providerMapping = Flux
            .defer(() -> Flux.fromIterable(dimensionProviders))
            .flatMap(provider -> provider
                    .getAllType()
                    .map(type -> Tuples.of(type.getId(), provider)))
            .collectMap(Tuple2::getT1, Tuple2::getT2);

    public DefaultDimensionManager() {

    }

    public void addProvider(DimensionProvider provider) {
        dimensionProviders.add(provider);
    }

    public void addBindProvider(DimensionUserBindProvider bindProvider) {
        bindProviders.add(bindProvider);
    }

    private Mono<Map<String, DimensionProvider>> providerMapping() {
        return providerMapping;
    }

    @Override
    public Flux<DimensionUserDetail> getUserDimension(Collection<String> userId) {
        return this
                .providerMapping()
                .flatMapMany(providerMapping -> Flux
                        .fromIterable(bindProviders)
                        //获取绑定信息
                        .flatMap(provider -> provider.getDimensionBindInfo(userId))
                        .groupBy(DimensionUserBind::getDimensionType)
                        .flatMap(group -> {
                            String type = group.key();
                            Flux<DimensionUserBind> binds = group.cache();
                            DimensionProvider provider = providerMapping.get(type);
                            if (null == provider) {
                                return Mono.empty();
                            }
                            //获取维度信息
                            return binds
                                    .map(DimensionUserBind::getDimensionId)
                                    .collect(Collectors.toSet())
                                    .flatMapMany(idList -> provider.getDimensionsById(SimpleDimensionType.of(type), idList))
                                    .collectMap(Dimension::getId, Function.identity())
                                    .flatMapMany(mapping -> binds
                                            .groupBy(DimensionUserBind::getUserId)
                                            .flatMap(userGroup -> Mono
                                                    .zip(
                                                            Mono.just(userGroup.key()),
                                                            userGroup
                                                                    .<Dimension>handle((bind, sink) -> {
                                                                        Dimension dimension = mapping.get(bind.getDimensionId());
                                                                        if (dimension != null) {
                                                                            sink.next(dimension);
                                                                        }
                                                                    })
                                                                    .collectList(),
                                                            DimensionUserDetail::of
                                                    ))
                                    );
                        })
                        )
                .groupBy(DimensionUserDetail::getUserId)
                .flatMap(group->group.reduce(DimensionUserDetail::merge));
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DimensionDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.authorization.DimensionType;
import org.hswebframework.web.authorization.access.DataAccessType;
import org.hswebframework.web.authorization.access.DefaultDataAccessType;
import org.hswebframework.web.authorization.access.ScopeDataAccessConfig;
import org.hswebframework.web.authorization.simple.AbstractDataAccessConfig;

import java.util.Set;

@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
public class DimensionDataAccessConfig extends AbstractDataAccessConfig implements ScopeDataAccessConfig {

    private Set<Object> scope;

    private boolean children;

    /**
     * @see DimensionType#getId()
     */
    private String scopeType;

    @Override
    public DefaultDataAccessType getType() {
        return DefaultDataAccessType.DIMENSION_SCOPE;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/PlainTextUsernamePasswordAuthenticationRequest.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hswebframework.web.authorization.AuthenticationRequest;

/**
 * @author zhouhao
 * @since 3.0.0-RC
 */
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PlainTextUsernamePasswordAuthenticationRequest implements AuthenticationRequest {
    private String username;

    private String password;
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java
================================================
/*
 * Copyright 2020 http://www.hswebframework.org
 *
 * Licensed 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.hswebframework.web.authorization.simple;

import lombok.Getter;
import lombok.Setter;
import org.hswebframework.web.authorization.*;

import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class SimpleAuthentication implements Authentication {

    static final AtomicLongFieldUpdater<SimpleAuthentication> ACCESS_COUNT_UPDATER =
        AtomicLongFieldUpdater.newUpdater(SimpleAuthentication.class, "accessCount");

    @Serial
    private static final long serialVersionUID = -2898863220255336528L;

    @Getter
    private User user;

    @Setter
    private List<Permission> permissions = new ArrayList<>();

    private List<Dimension> dimensions = new ArrayList<>();

    @Setter
    private Map<String, Serializable> attributes = new HashMap<>();

    public static Authentication of() {
        return new SimpleAuthentication();
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T extends Serializable> Optional<T> getAttribute(String name) {
        return Optional.ofNullable((T) attributes.get(name));
    }

    public List<Dimension> getDimensions() {
        return dimensions == null ? Collections.emptyList() : dimensions;
    }

    public List<Permission> getPermissions() {
        return permissions == null ? Collections.emptyList() : permissions;
    }

    @Override
    public Map<String, Serializable> getAttributes() {
        return attributes == null ? Collections.emptyMap() : attributes;
    }

    public SimpleAuthentication merge(Authentication authentication) {
        Map<String, Permission> mePermissionGroup = permissions
            .stream()
            .collect(Collectors.toMap(Permission::getId, Function.identity()));

        if (authentication.getUser() != null) {
            user = authentication.getUser();
        }
        this.attributes = new HashMap<>(getAttributes());
        this.attributes.putAll(authentication.getAttributes());

        this.permissions = new ArrayList<>(this.getPermissions());
        for (Permission permission : authentication.getPermissions()) {
            Permission me = mePermissionGroup.get(permission.getId());
            if (me == null) {
                permissions.add(permission.copy());
                continue;
            }
            me.getActions().addAll(permission.getActions());
        }
        this.dimensions = new ArrayList<>(this.getDimensions());
        for (Dimension dimension : authentication.getDimensions()) {
            if (getDimension(dimension.getType(), dimension.getId()).isEmpty()) {
                dimensions.add(dimension);
            }
        }
        return this;
    }

    protected SimpleAuthentication newInstance() {
        return new SimpleAuthentication();
    }

    @Override
    public Authentication copy(BiPredicate<Permission, String> permissionFilter,
                               Predicate<Dimension> dimension) {
        SimpleAuthentication authentication = newInstance();
        authentication.setDimensions(dimensions
                                         .stream()
                                         .filter(dimension)
                                         .collect(Collectors.toList()));
        authentication.setPermissions(permissions
                                          .stream()
                                          .map(permission -> permission.copy(action -> permissionFilter.test(permission, action), conf -> true))
                                          .filter(per -> !per.getActions().isEmpty())
                                          .collect(Collectors.toList())
        );
        if (user != null) {
            authentication.setUser0(user);
        }
        authentication.setAttributes(new HashMap<>(attributes));
        return authentication;
    }

    public void setUser(User user) {
        this.user = user;
        dimensions.add(user);
    }

    protected void setUser0(User user) {
        this.user = user;
    }

    public void setDimensions(List<Dimension> dimensions) {
        this.dimensions.addAll(dimensions);
    }

    public void setDimensions(Collection<Dimension> dimensions) {
        this.dimensions.addAll(dimensions);
    }

    public void addDimension(Dimension dimension) {
        this.dimensions.add(dimension);
    }

    private transient volatile Map<String, Map<String, Dimension>> dimensionMapping;
    private transient volatile Map<String, Permission> permissionMapping;
    private transient volatile long accessCount;

    protected boolean fastPath() {
        // 总共访问超过8次,则进行初始化缓存.
        if (ACCESS_COUNT_UPDATER.incrementAndGet(this) == 8) {
            if (permissionMapping == null) {
                permissionMapping = permissions == null
                    ? Collections.emptyMap()
                    : permissions
                    .stream()
                    .collect(Collectors
                                 .toMap(Permission::getId,
                                        Function.identity(),
                                        (a, b) -> b));
                dimensionMapping = dimensions == null
                    ? Collections.emptyMap()
                    : dimensions
                    .stream()
                    .collect(Collectors
                                 .groupingBy(d -> d.getType().getId(),
                                             Collectors.toMap(
                                                 Dimension::getId,
                                                 Function.identity(),
                                                 (a, b) -> a)));
            }
        }
        return permissionMapping != null;
    }

    @Override
    public boolean hasPermission(String permissionId, Collection<String> actions) {
        Map<String, Permission> permissionMapping = this.permissionMapping;
        if (fastPath() && permissionMapping != null) {
            Permission permission = permissionMapping.get(permissionId);
            if (permission == null) {
                permission = permissionMapping.get("*");
            }
            if (permission == null) {
                return false;
            }
            return actions.isEmpty()
                || permission.getActions().containsAll(actions)
                || permission.getActions().contains("*");
        }
        return Authentication.super.hasPermission(permissionId, actions);
    }

    @Override
    public Optional<Dimension> getDimension(String type, String id) {
        Map<String, Map<String, Dimension>> dimensionMapping = this.dimensionMapping;
        if (fastPath() && dimensionMapping != null) {
            Map<String, Dimension> mapping = dimensionMapping.get(type);
            if (mapping == null) {
                return Optional.empty();
            }
            return Optional.ofNullable(mapping.get(id));
        }
        return Authentication.super.getDimension(type, id);
    }

    @Override
    public Optional<Dimension> getDimension(DimensionType type, String id) {
        return getDimension(type.getId(), id);
    }

    @Override
    public List<Dimension> getDimensions(DimensionType type) {
        return this.getDimensions(type.getId());
    }

    @Override
    public List<Dimension> getDimensions(String type) {
        Map<String, Map<String, Dimension>> dimensionMapping = this.dimensionMapping;
        if (fastPath() && dimensionMapping != null) {
            Map<String, Dimension> mapping = dimensionMapping.get(type);
            if (mapping == null) {
                return List.of();
            }
            return new ArrayList<>(mapping.values());
        }
        return Authentication.super.getDimensions(type);
    }

    @Override
    public Optional<Permission> getPermission(String id) {
        Map<String, Permission> permissionMapping = this.permissionMapping;
        if (fastPath() && permissionMapping != null) {
            return Optional.ofNullable(permissionMapping.get(id));
        }
        return Authentication.super.getPermission(id);
    }

}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleDimension.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.*;
import org.hswebframework.web.authorization.Dimension;
import org.hswebframework.web.authorization.DimensionType;

import java.util.Map;

@Getter
@Setter
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
@EqualsAndHashCode
public class SimpleDimension implements Dimension {

    private String id;

    private String name;

    private DimensionType type;

    private Map<String,Object> options;


}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleDimensionType.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.*;
import org.hswebframework.web.authorization.DimensionType;

import java.io.Serializable;

@Getter
@Setter
@AllArgsConstructor(staticName = "of")
@NoArgsConstructor
@EqualsAndHashCode
public class SimpleDimensionType implements DimensionType, Serializable {
    private static final long serialVersionUID = -6849794470754667710L;

    private String id;

    private String name;

    public static SimpleDimensionType of(String id) {
        return of(id, id);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleFieldFilterDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.simple;

import org.hswebframework.web.authorization.access.DataAccessType;
import org.hswebframework.web.authorization.access.DefaultDataAccessType;
import org.hswebframework.web.authorization.access.FieldFilterDataAccessConfig;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import static org.hswebframework.web.authorization.access.DataAccessConfig.DefaultType.DENY_FIELDS;

/**
 * 默认配置实现
 *
 * @author zhouhao
 * @see FieldFilterDataAccessConfig
 * @since 3.0
 */
public class SimpleFieldFilterDataAccessConfig extends AbstractDataAccessConfig implements FieldFilterDataAccessConfig {
    private static final long serialVersionUID = 8080660575093151866L;

    private Set<String> fields;

    public SimpleFieldFilterDataAccessConfig() {
    }

    public SimpleFieldFilterDataAccessConfig(String... fields) {
        this.fields = new HashSet<>(Arrays.asList(fields));
    }

    @Override
    public Set<String> getFields() {
        return fields;
    }

    public void setFields(Set<String> fields) {
        this.fields = fields;
    }

    @Override
    public DataAccessType getType() {
        return DefaultDataAccessType.FIELD_DENY;
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleOwnCreatedDataAccessConfig.java
================================================
package org.hswebframework.web.authorization.simple;

import org.hswebframework.web.authorization.access.OwnCreatedDataAccessConfig;

/**
 * @author zhouhao
 * @since 3.0
 */
public class SimpleOwnCreatedDataAccessConfig extends AbstractDataAccessConfig implements OwnCreatedDataAccessConfig {

    private static final long serialVersionUID = -6059330812806119730L;

    public SimpleOwnCreatedDataAccessConfig() {
    }

    public SimpleOwnCreatedDataAccessConfig(String action) {
        setAction(action);
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimplePermission.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.*;
import org.apache.commons.collections4.CollectionUtils;
import org.hswebframework.web.authorization.Permission;
import org.hswebframework.web.authorization.access.DataAccessConfig;

import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author zhouhao
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = "dataAccesses")
public class SimplePermission implements Permission {

    private static final long serialVersionUID = 7587266693680162184L;

    private String id;

    private String name;

    private Set<String> actions;

    private Set<DataAccessConfig> dataAccesses;

    private Map<String, Object> options;

    public Set<String> getActions() {
        if (actions == null) {
            actions = new java.util.HashSet<>();
        }
        return actions;
    }

    public Set<DataAccessConfig> getDataAccesses() {
        if (dataAccesses == null) {
            dataAccesses = new java.util.HashSet<>();
        }
        return dataAccesses;
    }

    @Override
    public Permission copy(Predicate<String> actionFilter,
                           Predicate<DataAccessConfig> dataAccessFilter) {
        SimplePermission permission = new SimplePermission();

        permission.setId(id);
        permission.setName(name);
        permission.setActions(getActions().stream().filter(actionFilter).collect(Collectors.toSet()));
        permission.setDataAccesses(getDataAccesses().stream().filter(dataAccessFilter).collect(Collectors.toSet()));
        if (options != null) {
            permission.setOptions(new HashMap<>(options));
        }
        return permission;
    }

    public Permission copy() {
        return copy(action -> true, conf -> true);
    }

    @Override
    public String toString() {
        return id + (CollectionUtils.isNotEmpty(actions) ? ":" + String.join(",", actions) : "");
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleRole.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.*;
import org.hswebframework.web.authorization.Dimension;
import org.hswebframework.web.authorization.Role;

import java.io.Serializable;
import java.util.Map;

/**
 * @author zhouhao
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class SimpleRole implements Role {

    private static final long serialVersionUID = 7460859165231311347L;

    private String id;

    private String name;

    private Map<String, Object> options;

    public static Role of(Dimension dimension) {
        return SimpleRole.builder()
                .name(dimension.getName())
                .id(dimension.getId())
                .options(dimension.getOptions())
                .build();
    }
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleUser.java
================================================
package org.hswebframework.web.authorization.simple;

import lombok.*;
import org.hswebframework.web.authorization.User;

import java.io.Serial;
import java.io.Serializable;
import java.util.Map;

/**
 * @author zhouhao
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode
public class SimpleUser implements User {

    @Serial
    private static final long serialVersionUID = 2194541828191869091L;

    private String id;

    private String username;

    private String name;

    private String userType;

    private Map<String, Object> options;
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/DataAccessConfigConverter.java
================================================
package org.hswebframework.web.authorization.simple.builder;

import org.hswebframework.web.authorization.access.DataAccessConfig;

/**
 * @author zhouhao
 */
public interface DataAccessConfigConverter {

    boolean isSupport(String type, String action, String config);

    DataAccessConfig convert(String type, String action, String config);
}


================================================
FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilder.java
================================================
package org.hswebframework.web.authorization.simple.builder;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import org.hswebframework.web.authorization.*;
import org.hswebframework.web.authorization.builder.AuthenticationBuilder;
import org.hswebframework.web.authorization.builder.DataAccessConfigBuilderFactory;
import org.hswebframework.web.authorization.simple.*;

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author zhouhao
 */
public class SimpleAuthenticationBuilder implements AuthenticationBuilder {
    private SimpleAuthentication authentication = new SimpleAuthentication();

    private DataAccessConfigBuilderFactory dataBuilderFactory;

    public SimpleAuthenticationBuilder(DataAccessConfigBuilderFactory dataBuilderFactory) {
        this.dataBuilderFactory = dataBuilderFactory;
    }

    public void setDataBuilderFactory(DataAccessConfigBuilderFactory dataBuilderFactory) {
        this.dataBuilderFactory = dataBuilderFactory;
    }

    @Override
    public AuthenticationBuilder user(User user) {
        Objects.requireNonNull(user);
        authentication.setUser(user);
        return this;
    }

    @Override
    public AuthenticationBuilder user(String user) {
        return user(JSON.parseObject(user, SimpleUser.class));
    }

    @Override
    public AuthenticationBuilder user(Map<String, String> user) {
        Objects.requireNonNull(user.get("id"));
        user(SimpleUser.builder()
                       .id(user.get("id"))
           
Download .txt
gitextract_kk74s25r/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   ├── future.md
│   │   └── qa.md
│   └── workflows/
│       ├── maven-publish-4x.yml
│       ├── maven-publish-5x.yml
│       ├── pull_request.yml
│       └── pull_request_5x.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── README.md
├── build.sh
├── changes.sh
├── hsweb-authorization/
│   ├── README.md
│   ├── hsweb-authorization-api/
│   │   ├── README.md
│   │   ├── custom-data-access.md
│   │   ├── define.md
│   │   ├── pom.xml
│   │   ├── src/
│   │   │   ├── main/
│   │   │   │   ├── java/
│   │   │   │   │   └── org/
│   │   │   │   │       └── hswebframework/
│   │   │   │   │           └── web/
│   │   │   │   │               └── authorization/
│   │   │   │   │                   ├── Authentication.java
│   │   │   │   │                   ├── AuthenticationHolder.java
│   │   │   │   │                   ├── AuthenticationManager.java
│   │   │   │   │                   ├── AuthenticationPredicate.java
│   │   │   │   │                   ├── AuthenticationRequest.java
│   │   │   │   │                   ├── AuthenticationSupplier.java
│   │   │   │   │                   ├── AuthenticationUtils.java
│   │   │   │   │                   ├── DefaultDimensionType.java
│   │   │   │   │                   ├── Dimension.java
│   │   │   │   │                   ├── DimensionProvider.java
│   │   │   │   │                   ├── DimensionType.java
│   │   │   │   │                   ├── Permission.java
│   │   │   │   │                   ├── ReactiveAuthenticationHolder.java
│   │   │   │   │                   ├── ReactiveAuthenticationInitializeService.java
│   │   │   │   │                   ├── ReactiveAuthenticationManager.java
│   │   │   │   │                   ├── ReactiveAuthenticationManagerProvider.java
│   │   │   │   │                   ├── ReactiveAuthenticationSupplier.java
│   │   │   │   │                   ├── Role.java
│   │   │   │   │                   ├── User.java
│   │   │   │   │                   ├── access/
│   │   │   │   │                   │   ├── DataAccessConfig.java
│   │   │   │   │                   │   ├── DataAccessConfiguration.java
│   │   │   │   │                   │   ├── DataAccessController.java
│   │   │   │   │                   │   ├── DataAccessHandler.java
│   │   │   │   │                   │   ├── DataAccessType.java
│   │   │   │   │                   │   ├── DefaultDataAccessType.java
│   │   │   │   │                   │   ├── DimensionHelper.java
│   │   │   │   │                   │   ├── FieldFilterDataAccessConfig.java
│   │   │   │   │                   │   ├── OwnCreatedDataAccessConfig.java
│   │   │   │   │                   │   ├── ScopeDataAccessConfig.java
│   │   │   │   │                   │   └── UserAttachEntity.java
│   │   │   │   │                   ├── annotation/
│   │   │   │   │                   │   ├── Authorize.java
│   │   │   │   │                   │   ├── CreateAction.java
│   │   │   │   │                   │   ├── DataAccess.java
│   │   │   │   │                   │   ├── DataAccessType.java
│   │   │   │   │                   │   ├── DeleteAction.java
│   │   │   │   │                   │   ├── Dimension.java
│   │   │   │   │                   │   ├── DimensionDataAccess.java
│   │   │   │   │                   │   ├── Dimensions.java
│   │   │   │   │                   │   ├── FieldDataAccess.java
│   │   │   │   │                   │   ├── Logical.java
│   │   │   │   │                   │   ├── QueryAction.java
│   │   │   │   │                   │   ├── RequiresRoles.java
│   │   │   │   │                   │   ├── Resource.java
│   │   │   │   │                   │   ├── ResourceAction.java
│   │   │   │   │                   │   ├── SaveAction.java
│   │   │   │   │                   │   ├── TwoFactor.java
│   │   │   │   │                   │   └── UserOwnData.java
│   │   │   │   │                   ├── builder/
│   │   │   │   │                   │   ├── AuthenticationBuilder.java
│   │   │   │   │                   │   ├── AuthenticationBuilderFactory.java
│   │   │   │   │                   │   ├── DataAccessConfigBuilder.java
│   │   │   │   │                   │   └── DataAccessConfigBuilderFactory.java
│   │   │   │   │                   ├── context/
│   │   │   │   │                   │   ├── AuthenticationThreadLocalAccessor.java
│   │   │   │   │                   │   └── ThreadLocalReactiveAuthenticationSupplier.java
│   │   │   │   │                   ├── define/
│   │   │   │   │                   │   ├── AopAuthorizeDefinition.java
│   │   │   │   │                   │   ├── AuthorizeDefinition.java
│   │   │   │   │                   │   ├── AuthorizeDefinitionContext.java
│   │   │   │   │                   │   ├── AuthorizeDefinitionCustomizer.java
│   │   │   │   │                   │   ├── AuthorizeDefinitionInitializedEvent.java
│   │   │   │   │                   │   ├── AuthorizingContext.java
│   │   │   │   │                   │   ├── CompositeAuthorizeDefinitionCustomizer.java
│   │   │   │   │                   │   ├── DataAccessDefinition.java
│   │   │   │   │                   │   ├── DataAccessTypeDefinition.java
│   │   │   │   │                   │   ├── DimensionDefinition.java
│   │   │   │   │                   │   ├── DimensionsDefinition.java
│   │   │   │   │                   │   ├── HandleType.java
│   │   │   │   │                   │   ├── MergedAuthorizeDefinition.java
│   │   │   │   │                   │   ├── Phased.java
│   │   │   │   │                   │   ├── ResourceActionDefinition.java
│   │   │   │   │                   │   ├── ResourceDefinition.java
│   │   │   │   │                   │   └── ResourcesDefinition.java
│   │   │   │   │                   ├── dimension/
│   │   │   │   │                   │   ├── DimensionManager.java
│   │   │   │   │                   │   ├── DimensionUserBind.java
│   │   │   │   │                   │   ├── DimensionUserBindProvider.java
│   │   │   │   │                   │   └── DimensionUserDetail.java
│   │   │   │   │                   ├── events/
│   │   │   │   │                   │   ├── AbstractAuthorizationEvent.java
│   │   │   │   │                   │   ├── AuthorizationBeforeEvent.java
│   │   │   │   │                   │   ├── AuthorizationDecodeEvent.java
│   │   │   │   │                   │   ├── AuthorizationEvent.java
│   │   │   │   │                   │   ├── AuthorizationExitEvent.java
│   │   │   │   │                   │   ├── AuthorizationFailedEvent.java
│   │   │   │   │                   │   ├── AuthorizationInitializeEvent.java
│   │   │   │   │                   │   ├── AuthorizationSuccessEvent.java
│   │   │   │   │                   │   └── AuthorizingHandleBeforeEvent.java
│   │   │   │   │                   ├── exception/
│   │   │   │   │                   │   ├── AccessDenyException.java
│   │   │   │   │                   │   ├── AuthenticationException.java
│   │   │   │   │                   │   ├── NeedTwoFactorException.java
│   │   │   │   │                   │   └── UnAuthorizedException.java
│   │   │   │   │                   ├── setting/
│   │   │   │   │                   │   ├── SettingNullValueHolder.java
│   │   │   │   │                   │   ├── SettingValueHolder.java
│   │   │   │   │                   │   ├── StringSourceSettingHolder.java
│   │   │   │   │                   │   ├── UserSettingManager.java
│   │   │   │   │                   │   └── UserSettingPermission.java
│   │   │   │   │                   ├── simple/
│   │   │   │   │                   │   ├── AbstractDataAccessConfig.java
│   │   │   │   │                   │   ├── CompositeReactiveAuthenticationManager.java
│   │   │   │   │                   │   ├── DefaultAuthorizationAutoConfiguration.java
│   │   │   │   │                   │   ├── DefaultDimensionManager.java
│   │   │   │   │                   │   ├── DimensionDataAccessConfig.java
│   │   │   │   │                   │   ├── PlainTextUsernamePasswordAuthenticationRequest.java
│   │   │   │   │                   │   ├── SimpleAuthentication.java
│   │   │   │   │                   │   ├── SimpleDimension.java
│   │   │   │   │                   │   ├── SimpleDimensionType.java
│   │   │   │   │                   │   ├── SimpleFieldFilterDataAccessConfig.java
│   │   │   │   │                   │   ├── SimpleOwnCreatedDataAccessConfig.java
│   │   │   │   │                   │   ├── SimplePermission.java
│   │   │   │   │                   │   ├── SimpleRole.java
│   │   │   │   │                   │   ├── SimpleUser.java
│   │   │   │   │                   │   └── builder/
│   │   │   │   │                   │       ├── DataAccessConfigConverter.java
│   │   │   │   │                   │       ├── SimpleAuthenticationBuilder.java
│   │   │   │   │                   │       ├── SimpleAuthenticationBuilderFactory.java
│   │   │   │   │                   │       ├── SimpleDataAccessConfigBuilder.java
│   │   │   │   │                   │       └── SimpleDataAccessConfigBuilderFactory.java
│   │   │   │   │                   ├── token/
│   │   │   │   │                   │   ├── AllopatricLoginMode.java
│   │   │   │   │                   │   ├── AuthenticationUserToken.java
│   │   │   │   │                   │   ├── DefaultUserTokenManager.java
│   │   │   │   │                   │   ├── LocalAuthenticationUserToken.java
│   │   │   │   │                   │   ├── LocalUserToken.java
│   │   │   │   │                   │   ├── ParsedToken.java
│   │   │   │   │                   │   ├── ReactiveTokenAuthenticationSupplier.java
│   │   │   │   │                   │   ├── SimpleParsedToken.java
│   │   │   │   │                   │   ├── ThirdPartAuthenticationManager.java
│   │   │   │   │                   │   ├── ThirdPartReactiveAuthenticationManager.java
│   │   │   │   │                   │   ├── TokenAuthenticationManager.java
│   │   │   │   │                   │   ├── TokenState.java
│   │   │   │   │                   │   ├── UserToken.java
│   │   │   │   │                   │   ├── UserTokenAuthenticationSupplier.java
│   │   │   │   │                   │   ├── UserTokenBeforeCreateEvent.java
│   │   │   │   │                   │   ├── UserTokenHolder.java
│   │   │   │   │                   │   ├── UserTokenManager.java
│   │   │   │   │                   │   ├── UserTokenReactiveAuthenticationSupplier.java
│   │   │   │   │                   │   ├── event/
│   │   │   │   │                   │   │   ├── UserTokenChangedEvent.java
│   │   │   │   │                   │   │   ├── UserTokenCreatedEvent.java
│   │   │   │   │                   │   │   └── UserTokenRemovedEvent.java
│   │   │   │   │                   │   └── redis/
│   │   │   │   │                   │       ├── RedisTokenAuthenticationManager.java
│   │   │   │   │                   │       ├── RedisUserTokenManager.java
│   │   │   │   │                   │       ├── SimpleAuthenticationUserToken.java
│   │   │   │   │                   │       └── SimpleUserToken.java
│   │   │   │   │                   └── twofactor/
│   │   │   │   │                       ├── TwoFactorToken.java
│   │   │   │   │                       ├── TwoFactorTokenManager.java
│   │   │   │   │                       ├── TwoFactorValidator.java
│   │   │   │   │                       ├── TwoFactorValidatorManager.java
│   │   │   │   │                       ├── TwoFactorValidatorProvider.java
│   │   │   │   │                       └── defaults/
│   │   │   │   │                           ├── DefaultTwoFactorValidator.java
│   │   │   │   │                           ├── DefaultTwoFactorValidatorManager.java
│   │   │   │   │                           ├── DefaultTwoFactorValidatorProvider.java
│   │   │   │   │                           ├── HashMapTwoFactorTokenManager.java
│   │   │   │   │                           └── UnsupportedTwoFactorValidator.java
│   │   │   │   ├── java9/
│   │   │   │   │   └── module-info.java
│   │   │   │   └── resources/
│   │   │   │       ├── META-INF/
│   │   │   │       │   ├── services/
│   │   │   │       │   │   └── io.micrometer.context.ThreadLocalAccessor
│   │   │   │       │   └── spring/
│   │   │   │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │   │   │       └── i18n/
│   │   │   │           └── authentication/
│   │   │   │               ├── messages_en.properties
│   │   │   │               └── messages_zh.properties
│   │   │   └── test/
│   │   │       └── java/
│   │   │           └── org/
│   │   │               └── hswebframework/
│   │   │                   └── web/
│   │   │                       └── authorization/
│   │   │                           ├── AuthenticationTests.java
│   │   │                           ├── UserTokenManagerTests.java
│   │   │                           ├── context/
│   │   │                           │   └── AuthenticationThreadLocalAccessorTest.java
│   │   │                           ├── define/
│   │   │                           │   └── MergedAuthorizeDefinitionTest.java
│   │   │                           ├── simple/
│   │   │                           │   ├── DefaultDimensionManagerTest.java
│   │   │                           │   └── SimpleAuthenticationTest.java
│   │   │                           ├── token/
│   │   │                           │   └── redis/
│   │   │                           │       └── RedisUserTokenManagerTest.java
│   │   │                           └── twofactor/
│   │   │                               └── defaults/
│   │   │                                   └── HashMapTwoFactorTokenManagerTest.java
│   │   └── token.md
│   ├── hsweb-authorization-basic/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── authorization/
│   │       │   │                   └── basic/
│   │       │   │                       ├── aop/
│   │       │   │                       │   ├── AopAuthorizingController.java
│   │       │   │                       │   ├── AopMethodAuthorizeDefinitionCustomizerParser.java
│   │       │   │                       │   ├── AopMethodAuthorizeDefinitionParser.java
│   │       │   │                       │   └── DefaultAopMethodAuthorizeDefinitionParser.java
│   │       │   │                       ├── configuration/
│   │       │   │                       │   ├── AopAuthorizeAutoConfiguration.java
│   │       │   │                       │   ├── AuthorizingHandlerAutoConfiguration.java
│   │       │   │                       │   ├── BasicAuthorizationTokenParser.java
│   │       │   │                       │   ├── EnableAopAuthorize.java
│   │       │   │                       │   └── WebMvcAuthorizingConfiguration.java
│   │       │   │                       ├── define/
│   │       │   │                       │   ├── AopAuthorizeDefinitionParser.java
│   │       │   │                       │   ├── DefaultBasicAuthorizeDefinition.java
│   │       │   │                       │   ├── EmptyAuthorizeDefinition.java
│   │       │   │                       │   └── MergedAuthorizeDefinition.java
│   │       │   │                       ├── embed/
│   │       │   │                       │   ├── EmbedAuthenticationInfo.java
│   │       │   │                       │   ├── EmbedAuthenticationManager.java
│   │       │   │                       │   ├── EmbedAuthenticationProperties.java
│   │       │   │                       │   └── EmbedReactiveAuthenticationManager.java
│   │       │   │                       ├── handler/
│   │       │   │                       │   ├── AuthorizationLoginLoggerInfoHandler.java
│   │       │   │                       │   ├── AuthorizingHandler.java
│   │       │   │                       │   ├── DefaultAuthorizingHandler.java
│   │       │   │                       │   ├── UserAllowPermissionHandler.java
│   │       │   │                       │   └── access/
│   │       │   │                       │       └── DimensionDataAccessHandler.java
│   │       │   │                       └── web/
│   │       │   │                           ├── AuthorizationController.java
│   │       │   │                           ├── AuthorizedToken.java
│   │       │   │                           ├── BearerTokenParser.java
│   │       │   │                           ├── DefaultUserTokenGenPar.java
│   │       │   │                           ├── GeneratedToken.java
│   │       │   │                           ├── ReactiveUserTokenController.java
│   │       │   │                           ├── ReactiveUserTokenGenerator.java
│   │       │   │                           ├── ReactiveUserTokenParser.java
│   │       │   │                           ├── ServletUserTokenGenPar.java
│   │       │   │                           ├── SessionIdUserTokenGenerator.java
│   │       │   │                           ├── SessionIdUserTokenParser.java
│   │       │   │                           ├── UserOnSignIn.java
│   │       │   │                           ├── UserOnSignOut.java
│   │       │   │                           ├── UserTokenForTypeParser.java
│   │       │   │                           ├── UserTokenGenerator.java
│   │       │   │                           ├── UserTokenParser.java
│   │       │   │                           ├── UserTokenWebFilter.java
│   │       │   │                           └── WebUserTokenInterceptor.java
│   │       │   ├── java9/
│   │       │   │   └── module-info.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           ├── additional-spring-configuration-metadata.json
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── authorization/
│   │           │                   └── basic/
│   │           │                       ├── aop/
│   │           │                       │   ├── AopAuthorizingControllerTest.java
│   │           │                       │   ├── FluxTestController.java
│   │           │                       │   ├── TestApplication.java
│   │           │                       │   ├── TestController.java
│   │           │                       │   ├── TestDataAccess.java
│   │           │                       │   └── TestEntity.java
│   │           │                       ├── define/
│   │           │                       │   └── DefaultBasicAuthorizeDefinitionTest.java
│   │           │                       └── web/
│   │           │                           └── CompositeReactiveAuthenticationManagerTest.java
│   │           └── resources/
│   │               └── application.yml
│   ├── hsweb-authorization-oauth2/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── oauth2/
│   │       │   │                   ├── ErrorType.java
│   │       │   │                   ├── GrantType.java
│   │       │   │                   ├── OAuth2Constants.java
│   │       │   │                   ├── OAuth2Exception.java
│   │       │   │                   ├── ResponseType.java
│   │       │   │                   └── server/
│   │       │   │                       ├── AccessToken.java
│   │       │   │                       ├── AccessTokenManager.java
│   │       │   │                       ├── OAuth2Client.java
│   │       │   │                       ├── OAuth2ClientManager.java
│   │       │   │                       ├── OAuth2GrantService.java
│   │       │   │                       ├── OAuth2Granter.java
│   │       │   │                       ├── OAuth2Properties.java
│   │       │   │                       ├── OAuth2Request.java
│   │       │   │                       ├── OAuth2Response.java
│   │       │   │                       ├── OAuth2ServerAutoConfiguration.java
│   │       │   │                       ├── ScopePredicate.java
│   │       │   │                       ├── auth/
│   │       │   │                       │   └── ReactiveOAuth2AccessTokenParser.java
│   │       │   │                       ├── code/
│   │       │   │                       │   ├── AuthorizationCodeCache.java
│   │       │   │                       │   ├── AuthorizationCodeGranter.java
│   │       │   │                       │   ├── AuthorizationCodeRequest.java
│   │       │   │                       │   ├── AuthorizationCodeResponse.java
│   │       │   │                       │   ├── AuthorizationCodeTokenRequest.java
│   │       │   │                       │   └── DefaultAuthorizationCodeGranter.java
│   │       │   │                       ├── credential/
│   │       │   │                       │   ├── ClientCredentialGranter.java
│   │       │   │                       │   ├── ClientCredentialRequest.java
│   │       │   │                       │   └── DefaultClientCredentialGranter.java
│   │       │   │                       ├── event/
│   │       │   │                       │   └── OAuth2GrantedEvent.java
│   │       │   │                       ├── impl/
│   │       │   │                       │   ├── CompositeOAuth2GrantService.java
│   │       │   │                       │   ├── RedisAccessToken.java
│   │       │   │                       │   └── RedisAccessTokenManager.java
│   │       │   │                       ├── refresh/
│   │       │   │                       │   ├── DefaultRefreshTokenGranter.java
│   │       │   │                       │   ├── RefreshTokenGranter.java
│   │       │   │                       │   └── RefreshTokenRequest.java
│   │       │   │                       ├── utils/
│   │       │   │                       │   └── OAuth2ScopeUtils.java
│   │       │   │                       └── web/
│   │       │   │                           └── OAuth2AuthorizeController.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── oauth2/
│   │           │                   └── server/
│   │           │                       ├── OAuth2ClientTest.java
│   │           │                       ├── RedisHelper.java
│   │           │                       ├── code/
│   │           │                       │   └── DefaultAuthorizationCodeGranterTest.java
│   │           │                       ├── impl/
│   │           │                       │   └── RedisAccessTokenManagerTest.java
│   │           │                       ├── utils/
│   │           │                       │   └── OAuth2ScopeUtilsTest.java
│   │           │                       └── web/
│   │           │                           └── OAuth2AuthorizeControllerTest.java
│   │           └── resources/
│   │               └── logback.xml
│   └── pom.xml
├── hsweb-commons/
│   ├── hsweb-commons-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── api/
│   │       │   │                   └── crud/
│   │       │   │                       └── entity/
│   │       │   │                           ├── Entity.java
│   │       │   │                           ├── EntityFactory.java
│   │       │   │                           ├── EntityFactoryHolder.java
│   │       │   │                           ├── EntityFactoryHolderConfiguration.java
│   │       │   │                           ├── ExtendableEntity.java
│   │       │   │                           ├── ExtendableTreeSortSupportEntity.java
│   │       │   │                           ├── GenericEntity.java
│   │       │   │                           ├── GenericI18nEntity.java
│   │       │   │                           ├── GenericTreeSortSupportEntity.java
│   │       │   │                           ├── ImplementFor.java
│   │       │   │                           ├── PagerResult.java
│   │       │   │                           ├── QueryNoPagingOperation.java
│   │       │   │                           ├── QueryOperation.java
│   │       │   │                           ├── QueryParamEntity.java
│   │       │   │                           ├── RecordCreationEntity.java
│   │       │   │                           ├── RecordModifierEntity.java
│   │       │   │                           ├── SortSupportEntity.java
│   │       │   │                           ├── TermExpressionParser.java
│   │       │   │                           ├── TransactionManagers.java
│   │       │   │                           ├── TreeSortSupportEntity.java
│   │       │   │                           ├── TreeSupportEntity.java
│   │       │   │                           └── TreeUtils.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── api/
│   │                               └── crud/
│   │                                   └── entity/
│   │                                       ├── ExtendableEntityTest.java
│   │                                       ├── TermExpressionParserTest.java
│   │                                       └── TreeUtilsTest.java
│   ├── hsweb-commons-crud/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── crud/
│   │       │   │                   ├── annotation/
│   │       │   │                   │   ├── DDL.java
│   │       │   │                   │   ├── EnableEasyormRepository.java
│   │       │   │                   │   ├── EnableEntityEvent.java
│   │       │   │                   │   └── Reactive.java
│   │       │   │                   ├── configuration/
│   │       │   │                   │   ├── AutoDDLProcessor.java
│   │       │   │                   │   ├── CompositeEntityTableMetadataResolver.java
│   │       │   │                   │   ├── DefaultEntityResultWrapperFactory.java
│   │       │   │                   │   ├── DetectEntityColumnMapping.java
│   │       │   │                   │   ├── DialectProvider.java
│   │       │   │                   │   ├── DialectProviders.java
│   │       │   │                   │   ├── EasyormConfiguration.java
│   │       │   │                   │   ├── EasyormProperties.java
│   │       │   │                   │   ├── EasyormRepositoryRegistrar.java
│   │       │   │                   │   ├── EntityFactoryConfiguration.java
│   │       │   │                   │   ├── EntityInfo.java
│   │       │   │                   │   ├── EntityResultWrapperFactory.java
│   │       │   │                   │   ├── EntityTableMetadataResolver.java
│   │       │   │                   │   ├── JdbcSqlExecutorConfiguration.java
│   │       │   │                   │   ├── R2dbcSqlExecutorConfiguration.java
│   │       │   │                   │   ├── ReactiveRepositoryFactoryBean.java
│   │       │   │                   │   ├── SyncRepositoryFactoryBean.java
│   │       │   │                   │   └── TableMetadataCustomizer.java
│   │       │   │                   ├── entity/
│   │       │   │                   │   └── factory/
│   │       │   │                   │       ├── DefaultMapperFactory.java
│   │       │   │                   │       ├── DefaultPropertyCopier.java
│   │       │   │                   │       ├── EntityMappingCustomizer.java
│   │       │   │                   │       ├── MapperEntityFactory.java
│   │       │   │                   │       └── PropertyCopier.java
│   │       │   │                   ├── events/
│   │       │   │                   │   ├── CompositeEventListener.java
│   │       │   │                   │   ├── CreatorEventListener.java
│   │       │   │                   │   ├── DefaultEntityEventListenerConfigure.java
│   │       │   │                   │   ├── EntityBeforeCreateEvent.java
│   │       │   │                   │   ├── EntityBeforeDeleteEvent.java
│   │       │   │                   │   ├── EntityBeforeModifyEvent.java
│   │       │   │                   │   ├── EntityBeforeQueryEvent.java
│   │       │   │                   │   ├── EntityBeforeSaveEvent.java
│   │       │   │                   │   ├── EntityCreatedEvent.java
│   │       │   │                   │   ├── EntityDDLEvent.java
│   │       │   │                   │   ├── EntityDeletedEvent.java
│   │       │   │                   │   ├── EntityEventHelper.java
│   │       │   │                   │   ├── EntityEventListener.java
│   │       │   │                   │   ├── EntityEventListenerConfigure.java
│   │       │   │                   │   ├── EntityEventListenerCustomizer.java
│   │       │   │                   │   ├── EntityEventPhase.java
│   │       │   │                   │   ├── EntityEventType.java
│   │       │   │                   │   ├── EntityModifyEvent.java
│   │       │   │                   │   ├── EntityPrepareCreateEvent.java
│   │       │   │                   │   ├── EntityPrepareModifyEvent.java
│   │       │   │                   │   ├── EntityPrepareSaveEvent.java
│   │       │   │                   │   ├── EntitySavedEvent.java
│   │       │   │                   │   ├── SqlExpressionInvoker.java
│   │       │   │                   │   ├── ValidateEventListener.java
│   │       │   │                   │   └── expr/
│   │       │   │                   │       ├── AbstractSqlExpressionInvoker.java
│   │       │   │                   │       └── SpelSqlExpressionInvoker.java
│   │       │   │                   ├── exception/
│   │       │   │                   │   └── DatabaseExceptionAnalyzerReporter.java
│   │       │   │                   ├── generator/
│   │       │   │                   │   ├── CurrentTimeGenerator.java
│   │       │   │                   │   ├── DefaultIdGenerator.java
│   │       │   │                   │   ├── Generators.java
│   │       │   │                   │   ├── MD5Generator.java
│   │       │   │                   │   ├── RandomIdGenerator.java
│   │       │   │                   │   └── SnowFlakeStringIdGenerator.java
│   │       │   │                   ├── query/
│   │       │   │                   │   ├── DefaultQueryHelper.java
│   │       │   │                   │   ├── JoinConditionalSpec.java
│   │       │   │                   │   ├── JoinNestConditionalSpec.java
│   │       │   │                   │   ├── JoinOnSpec.java
│   │       │   │                   │   ├── QueryAnalyzer.java
│   │       │   │                   │   ├── QueryAnalyzerImpl.java
│   │       │   │                   │   ├── QueryHelper.java
│   │       │   │                   │   ├── QueryHelperUtils.java
│   │       │   │                   │   └── ToHumpMap.java
│   │       │   │                   ├── service/
│   │       │   │                   │   ├── CrudService.java
│   │       │   │                   │   ├── EnableCacheReactiveCrudService.java
│   │       │   │                   │   ├── GenericCrudService.java
│   │       │   │                   │   ├── GenericReactiveCacheSupportCrudService.java
│   │       │   │                   │   ├── GenericReactiveCrudService.java
│   │       │   │                   │   ├── GenericReactiveTreeSupportCrudService.java
│   │       │   │                   │   ├── GenericTreeSupportCrudService.java
│   │       │   │                   │   ├── ReactiveCrudService.java
│   │       │   │                   │   ├── ReactiveTreeSortEntityService.java
│   │       │   │                   │   ├── ReactiveTreeSortServiceHelper.java
│   │       │   │                   │   ├── SyncTreeSortServiceHelper.java
│   │       │   │                   │   ├── TreeSortEntityService.java
│   │       │   │                   │   └── TreeSortServiceHelper.java
│   │       │   │                   ├── sql/
│   │       │   │                   │   ├── DefaultJdbcExecutor.java
│   │       │   │                   │   ├── DefaultJdbcReactiveExecutor.java
│   │       │   │                   │   ├── DefaultR2dbcExecutor.java
│   │       │   │                   │   └── terms/
│   │       │   │                   │       └── TreeChildTermBuilder.java
│   │       │   │                   ├── utils/
│   │       │   │                   │   └── TransactionUtils.java
│   │       │   │                   └── web/
│   │       │   │                       ├── CommonErrorControllerAdvice.java
│   │       │   │                       ├── CommonWebFluxConfiguration.java
│   │       │   │                       ├── CommonWebMvcConfiguration.java
│   │       │   │                       ├── CommonWebMvcErrorControllerAdvice.java
│   │       │   │                       ├── CrudController.java
│   │       │   │                       ├── DeleteController.java
│   │       │   │                       ├── QueryController.java
│   │       │   │                       ├── R2dbcErrorControllerAdvice.java
│   │       │   │                       ├── ResponseMessage.java
│   │       │   │                       ├── ResponseMessageWrapper.java
│   │       │   │                       ├── ResponseMessageWrapperAdvice.java
│   │       │   │                       ├── SaveController.java
│   │       │   │                       ├── ServiceCrudController.java
│   │       │   │                       ├── ServiceDeleteController.java
│   │       │   │                       ├── ServiceQueryController.java
│   │       │   │                       ├── ServiceSaveController.java
│   │       │   │                       ├── TreeServiceQueryController.java
│   │       │   │                       └── reactive/
│   │       │   │                           ├── ReactiveCrudController.java
│   │       │   │                           ├── ReactiveDeleteController.java
│   │       │   │                           ├── ReactiveQueryController.java
│   │       │   │                           ├── ReactiveSaveController.java
│   │       │   │                           ├── ReactiveServiceCrudController.java
│   │       │   │                           ├── ReactiveServiceDeleteController.java
│   │       │   │                           ├── ReactiveServiceQueryController.java
│   │       │   │                           ├── ReactiveServiceSaveController.java
│   │       │   │                           └── ReactiveTreeServiceQueryController.java
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   ├── services/
│   │       │       │   │   └── org.hswebframework.web.exception.analyzer.ExceptionAnalyzer
│   │       │       │   └── spring/
│   │       │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │       └── i18n/
│   │       │           └── commons/
│   │       │               ├── messages_en.properties
│   │       │               └── messages_zh.properties
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── crud/
│   │           │                   ├── CrudTests.java
│   │           │                   ├── TestApplication.java
│   │           │                   ├── entity/
│   │           │                   │   ├── CustomTestEntity.java
│   │           │                   │   ├── EventTestEntity.java
│   │           │                   │   ├── TestEntity.java
│   │           │                   │   └── TestTreeSortEntity.java
│   │           │                   ├── events/
│   │           │                   │   ├── DefaultEntityEventListenerConfigureTest.java
│   │           │                   │   ├── EntityEventListenerTest.java
│   │           │                   │   ├── TestEntityListener.java
│   │           │                   │   └── expr/
│   │           │                   │       └── SpelSqlExpressionInvokerTest.java
│   │           │                   ├── exception/
│   │           │                   │   └── DatabaseExceptionAnalyzerReporterTest.java
│   │           │                   ├── query/
│   │           │                   │   ├── DefaultQueryHelperTest.java
│   │           │                   │   ├── QueryAnalyzerImplTest.java
│   │           │                   │   └── QueryHelperUtilsTest.java
│   │           │                   └── service/
│   │           │                       ├── CustomTestCustom.java
│   │           │                       ├── GenericReactiveCacheSupportCrudServiceTest.java
│   │           │                       ├── ReactiveTreeSortEntityServiceTest.java
│   │           │                       ├── TestCacheEntityService.java
│   │           │                       ├── TestEntityService.java
│   │           │                       ├── TestTreeChildTermBuilder.java
│   │           │                       └── TestTreeSortEntityService.java
│   │           └── resources/
│   │               └── application.yml
│   └── pom.xml
├── hsweb-concurrent/
│   ├── hsweb-concurrent-cache/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── cache/
│   │       │   │                   ├── ReactiveCache.java
│   │       │   │                   ├── ReactiveCacheManager.java
│   │       │   │                   ├── ReactiveCacheResolver.java
│   │       │   │                   ├── configuration/
│   │       │   │                   │   ├── ReactiveCacheManagerConfiguration.java
│   │       │   │                   │   └── ReactiveCacheProperties.java
│   │       │   │                   └── supports/
│   │       │   │                       ├── AbstractReactiveCache.java
│   │       │   │                       ├── AbstractReactiveCacheManager.java
│   │       │   │                       ├── CaffeineReactiveCache.java
│   │       │   │                       ├── CaffeineReactiveCacheManager.java
│   │       │   │                       ├── GuavaReactiveCache.java
│   │       │   │                       ├── GuavaReactiveCacheManager.java
│   │       │   │                       ├── NullValue.java
│   │       │   │                       ├── RedisLocalReactiveCacheManager.java
│   │       │   │                       ├── RedisReactiveCache.java
│   │       │   │                       └── UnSupportedReactiveCache.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── cache/
│   │           │                   ├── CaffeineReactiveCacheManagerTest.java
│   │           │                   ├── GuavaReactiveCacheManagerTest.java
│   │           │                   ├── RedisReactiveCacheManagerTest.java
│   │           │                   └── TestApplication.java
│   │           └── resources/
│   │               └── application-redis.yml
│   └── pom.xml
├── hsweb-core/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── hswebframework/
│       │   │           └── web/
│       │   │               ├── CodeConstants.java
│       │   │               ├── aop/
│       │   │               │   ├── MethodInterceptorContext.java
│       │   │               │   └── MethodInterceptorHolder.java
│       │   │               ├── bean/
│       │   │               │   ├── BeanFactory.java
│       │   │               │   ├── ClassDescription.java
│       │   │               │   ├── ClassDescriptions.java
│       │   │               │   ├── CompareUtils.java
│       │   │               │   ├── Converter.java
│       │   │               │   ├── Copier.java
│       │   │               │   ├── DefaultToStringOperator.java
│       │   │               │   ├── Diff.java
│       │   │               │   ├── ExtendableToBeanCopier.java
│       │   │               │   ├── ExtendableToMapCopier.java
│       │   │               │   ├── ExtendableUtils.java
│       │   │               │   ├── FastBeanCopier.java
│       │   │               │   ├── MapToExtendableCopier.java
│       │   │               │   ├── SingleValueMap.java
│       │   │               │   ├── ToString.java
│       │   │               │   └── ToStringOperator.java
│       │   │               ├── context/
│       │   │               │   ├── Context.java
│       │   │               │   ├── ContextHolder.java
│       │   │               │   ├── ContextKey.java
│       │   │               │   ├── ContextUtils.java
│       │   │               │   ├── MapContext.java
│       │   │               │   └── ThreadLocalContextHolderSupport.java
│       │   │               ├── convert/
│       │   │               │   └── CustomMessageConverter.java
│       │   │               ├── dict/
│       │   │               │   ├── ClassDictDefine.java
│       │   │               │   ├── Dict.java
│       │   │               │   ├── DictDefine.java
│       │   │               │   ├── DictDefineRepository.java
│       │   │               │   ├── EnumDict.java
│       │   │               │   ├── I18nEnumDict.java
│       │   │               │   ├── ItemDefine.java
│       │   │               │   └── defaults/
│       │   │               │       ├── DefaultClassDictDefine.java
│       │   │               │       ├── DefaultDictDefine.java
│       │   │               │       ├── DefaultDictDefineRepository.java
│       │   │               │       └── DefaultItemDefine.java
│       │   │               ├── enums/
│       │   │               │   └── TrueOrFalse.java
│       │   │               ├── event/
│       │   │               │   ├── AsyncEvent.java
│       │   │               │   ├── AsyncEventHooks.java
│       │   │               │   ├── DefaultAsyncEvent.java
│       │   │               │   └── GenericsPayloadApplicationEvent.java
│       │   │               ├── exception/
│       │   │               │   ├── BusinessException.java
│       │   │               │   ├── I18nSupportException.java
│       │   │               │   ├── NotFoundException.java
│       │   │               │   ├── TraceSourceException.java
│       │   │               │   ├── ValidationException.java
│       │   │               │   └── analyzer/
│       │   │               │       ├── ExceptionAnalyzer.java
│       │   │               │       ├── ExceptionAnalyzerReporter.java
│       │   │               │       └── ExceptionAnalyzers.java
│       │   │               ├── i18n/
│       │   │               │   ├── ContextLocaleResolver.java
│       │   │               │   ├── I18nSupportEntity.java
│       │   │               │   ├── I18nSupportUtils.java
│       │   │               │   ├── LocaleThreadLocalAccessor.java
│       │   │               │   ├── LocaleUtils.java
│       │   │               │   ├── MessageSourceInitializer.java
│       │   │               │   ├── MultipleI18nSupportEntity.java
│       │   │               │   ├── SingleI18nSupportEntity.java
│       │   │               │   ├── UnsupportedMessageSource.java
│       │   │               │   └── WebFluxLocaleFilter.java
│       │   │               ├── id/
│       │   │               │   ├── IDGenerator.java
│       │   │               │   ├── RandomIdGenerator.java
│       │   │               │   └── SnowflakeIdGenerator.java
│       │   │               ├── logger/
│       │   │               │   └── ReactiveLogger.java
│       │   │               ├── proxy/
│       │   │               │   └── Proxy.java
│       │   │               ├── recycler/
│       │   │               │   ├── Recyclable.java
│       │   │               │   ├── Recycler.java
│       │   │               │   ├── RecyclerImpl.java
│       │   │               │   └── Recyclers.java
│       │   │               ├── utils/
│       │   │               │   ├── AnnotationUtils.java
│       │   │               │   ├── CollectionUtils.java
│       │   │               │   ├── DigestUtils.java
│       │   │               │   ├── DynamicArrayList.java
│       │   │               │   ├── ExpressionUtils.java
│       │   │               │   ├── FluxCache.java
│       │   │               │   ├── HttpParameterConverter.java
│       │   │               │   ├── ModuleUtils.java
│       │   │               │   ├── ReactiveWebUtils.java
│       │   │               │   ├── TemplateParser.java
│       │   │               │   └── WebUtils.java
│       │   │               ├── validator/
│       │   │               │   ├── CreateGroup.java
│       │   │               │   ├── UpdateGroup.java
│       │   │               │   └── ValidatorUtils.java
│       │   │               └── warn/
│       │   │                   └── Warning.java
│       │   ├── java9/
│       │   │   └── module-info.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       └── io.micrometer.context.ThreadLocalAccessor
│       │       └── i18n/
│       │           └── core/
│       │               ├── messages_en.properties
│       │               └── messages_zh.properties
│       └── test/
│           └── java/
│               └── org/
│                   └── hswebframework/
│                       └── web/
│                           ├── bean/
│                           │   ├── Color.java
│                           │   ├── CompareUtilsTest.java
│                           │   ├── DiffTest.java
│                           │   ├── FastBeanCopierTest.java
│                           │   ├── NestObject.java
│                           │   ├── Source.java
│                           │   └── Target.java
│                           ├── dict/
│                           │   ├── EnumDictTest.java
│                           │   ├── TestEnum.java
│                           │   └── TestEnumInteger.java
│                           ├── event/
│                           │   └── EventTest.java
│                           ├── exception/
│                           │   └── TraceSourceExceptionTest.java
│                           ├── i18n/
│                           │   ├── I18nSupportUtilsTest.java
│                           │   ├── LocaleThreadLocalAccessorTest.java
│                           │   ├── LocaleUtilsTest.java
│                           │   └── MultipleI18nSupportEntityTest.java
│                           ├── id/
│                           │   ├── IDGeneratorTests.java
│                           │   ├── RandomIdGeneratorTest.java
│                           │   └── SnowflakeIdGeneratorTest.java
│                           ├── logger/
│                           │   └── ReactiveLoggerTest.java
│                           ├── recycler/
│                           │   └── RecyclerImplTest.java
│                           ├── utils/
│                           │   ├── CollectionUtilsTest.java
│                           │   ├── DigestUtilsTest.java
│                           │   └── TemplateParserTest.java
│                           └── validator/
│                               └── ValidatorUtilsTest.java
├── hsweb-datasource/
│   ├── README.md
│   ├── hsweb-datasource-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── datasource/
│   │       │   │                   ├── AopDataSourceSwitcherAutoConfiguration.java
│   │       │   │                   ├── DataSourceHolder.java
│   │       │   │                   ├── DatabaseType.java
│   │       │   │                   ├── DynamicDataSource.java
│   │       │   │                   ├── DynamicDataSourceAutoConfiguration.java
│   │       │   │                   ├── DynamicDataSourceProxy.java
│   │       │   │                   ├── DynamicDataSourceService.java
│   │       │   │                   ├── HswebDataSourceProperties.java
│   │       │   │                   ├── JdbcDataSource.java
│   │       │   │                   ├── R2dbcDataSource.java
│   │       │   │                   ├── annotation/
│   │       │   │                   │   ├── UseDataSource.java
│   │       │   │                   │   └── UseDefaultDataSource.java
│   │       │   │                   ├── config/
│   │       │   │                   │   ├── DynamicDataSourceConfig.java
│   │       │   │                   │   ├── DynamicDataSourceConfigRepository.java
│   │       │   │                   │   └── InSpringDynamicDataSourceConfig.java
│   │       │   │                   ├── exception/
│   │       │   │                   │   ├── DataSourceClosedException.java
│   │       │   │                   │   └── DataSourceNotFoundException.java
│   │       │   │                   ├── strategy/
│   │       │   │                   │   ├── AnnotationDataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   ├── CachedDataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   ├── CachedTableSwitchStrategyMatcher.java
│   │       │   │                   │   ├── DataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   ├── ExpressionDataSourceSwitchStrategyMatcher.java
│   │       │   │                   │   └── TableSwitchStrategyMatcher.java
│   │       │   │                   └── switcher/
│   │       │   │                       ├── DataSourceSwitcher.java
│   │       │   │                       ├── DefaultJdbcSwitcher.java
│   │       │   │                       ├── DefaultR2dbcSwicher.java
│   │       │   │                       ├── DefaultReactiveSwitcher.java
│   │       │   │                       ├── DefaultSwitcher.java
│   │       │   │                       ├── JdbcSwitcher.java
│   │       │   │                       ├── R2dbcSwitcher.java
│   │       │   │                       ├── ReactiveSwitcher.java
│   │       │   │                       ├── SchemaSwitcher.java
│   │       │   │                       ├── Switcher.java
│   │       │   │                       └── TableSwitcher.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── datasource/
│   │                               └── switcher/
│   │                                   ├── DefaultReactiveSwitcherTest.java
│   │                                   └── DefaultSwitcherTest.java
│   └── pom.xml
├── hsweb-logging/
│   ├── README.md
│   ├── hsweb-access-logging-aop/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── logging/
│   │                               └── aop/
│   │                                   ├── AccessLoggerParser.java
│   │                                   ├── AopAccessLoggerSupport.java
│   │                                   ├── AopAccessLoggerSupportAutoConfiguration.java
│   │                                   ├── DefaultAccessLoggerParser.java
│   │                                   ├── EnableAccessLogger.java
│   │                                   ├── ReactiveAopAccessLoggerSupport.java
│   │                                   ├── ResourceAccessLoggerParser.java
│   │                                   ├── Swagger3AccessLoggerParser.java
│   │                                   └── SwaggerAccessLoggerParser.java
│   ├── hsweb-access-logging-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── logging/
│   │                               ├── AccessLogger.java
│   │                               ├── AccessLoggerHolder.java
│   │                               ├── AccessLoggerInfo.java
│   │                               ├── AccessLoggerListener.java
│   │                               ├── LoggerDefine.java
│   │                               ├── RequestInfo.java
│   │                               └── events/
│   │                                   ├── AccessLoggerAfterEvent.java
│   │                                   └── AccessLoggerBeforeEvent.java
│   └── pom.xml
├── hsweb-starter/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── hswebframework/
│       │   │           └── web/
│       │   │               └── starter/
│       │   │                   ├── CorsAutoConfiguration.java
│       │   │                   ├── CorsProperties.java
│       │   │                   ├── i18n/
│       │   │                   │   ├── CompositeMessageSource.java
│       │   │                   │   └── I18nConfiguration.java
│       │   │                   ├── jackson/
│       │   │                   │   ├── CustomCodecsAutoConfiguration.java
│       │   │                   │   ├── CustomDeserializers.java
│       │   │                   │   ├── CustomJackson2JsonDecoder.java
│       │   │                   │   ├── CustomJackson2jsonEncoder.java
│       │   │                   │   ├── CustomMappingJackson2HttpMessageConverter.java
│       │   │                   │   ├── CustomTypeFactory.java
│       │   │                   │   └── Jackson2Tokenizer.java
│       │   │                   └── reporter/
│       │   │                       └── GenericExceptionReport.java
│       │   └── resources/
│       │       └── META-INF/
│       │           ├── spring/
│       │           │   └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│       │           └── spring.factories
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── hswebframework/
│           │           └── web/
│           │               └── starter/
│           │                   ├── initialize/
│           │                   │   ├── SystemInitializeTest.java
│           │                   │   └── TestApplication.java
│           │                   ├── jackson/
│           │                   │   ├── CustomJackson2JsonDecoderTest.java
│           │                   │   ├── CustomJackson2jsonEncoderTest.java
│           │                   │   └── CustomTypeFactoryTest.java
│           │                   └── reporter/
│           │                       └── GenericExceptionReportTest.java
│           └── resources/
│               ├── hsweb-starter.js
│               └── i18n/
│                   ├── messages_en_US.properties
│                   └── messages_zh_CN.properties
├── hsweb-system/
│   ├── README.md
│   ├── hsweb-system-authorization/
│   │   ├── README.md
│   │   ├── hsweb-system-authorization-api/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   └── java/
│   │   │       │       └── org/
│   │   │       │           └── hswebframework/
│   │   │       │               └── web/
│   │   │       │                   └── system/
│   │   │       │                       └── authorization/
│   │   │       │                           └── api/
│   │   │       │                               ├── PasswordEncoder.java
│   │   │       │                               ├── PasswordValidator.java
│   │   │       │                               ├── UserDimensionProvider.java
│   │   │       │                               ├── UsernameValidator.java
│   │   │       │                               ├── entity/
│   │   │       │                               │   ├── ActionEntity.java
│   │   │       │                               │   ├── AuthorizationSettingEntity.java
│   │   │       │                               │   ├── DataAccessEntity.java
│   │   │       │                               │   ├── DimensionEntity.java
│   │   │       │                               │   ├── DimensionTypeEntity.java
│   │   │       │                               │   ├── DimensionUserEntity.java
│   │   │       │                               │   ├── OptionalField.java
│   │   │       │                               │   ├── ParentPermission.java
│   │   │       │                               │   ├── PermissionEntity.java
│   │   │       │                               │   └── UserEntity.java
│   │   │       │                               ├── enums/
│   │   │       │                               │   └── DimensionUserFeature.java
│   │   │       │                               ├── event/
│   │   │       │                               │   ├── ClearUserAuthorizationCacheEvent.java
│   │   │       │                               │   ├── DimensionBindEvent.java
│   │   │       │                               │   ├── DimensionDeletedEvent.java
│   │   │       │                               │   ├── DimensionUnbindEvent.java
│   │   │       │                               │   ├── UserBeforeCreateEvent.java
│   │   │       │                               │   ├── UserCreatedEvent.java
│   │   │       │                               │   ├── UserDeletedEvent.java
│   │   │       │                               │   ├── UserModifiedEvent.java
│   │   │       │                               │   └── UserStateChangedEvent.java
│   │   │       │                               ├── request/
│   │   │       │                               │   └── SaveUserRequest.java
│   │   │       │                               └── service/
│   │   │       │                                   ├── UserService.java
│   │   │       │                                   └── reactive/
│   │   │       │                                       └── ReactiveUserService.java
│   │   │       └── test/
│   │   │           └── java/
│   │   │               └── org/
│   │   │                   └── hswebframework/
│   │   │                       └── web/
│   │   │                           └── system/
│   │   │                               └── authorization/
│   │   │                                   └── api/
│   │   │                                       └── UsernameValidatorTest.java
│   │   ├── hsweb-system-authorization-default/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── java/
│   │   │       │   │   └── org/
│   │   │       │   │       └── hswebframework/
│   │   │       │   │           └── web/
│   │   │       │   │               └── system/
│   │   │       │   │                   └── authorization/
│   │   │       │   │                       └── defaults/
│   │   │       │   │                           ├── configuration/
│   │   │       │   │                           │   ├── AuthorizationServiceAutoConfiguration.java
│   │   │       │   │                           │   ├── AuthorizationWebAutoConfiguration.java
│   │   │       │   │                           │   └── PermissionProperties.java
│   │   │       │   │                           ├── service/
│   │   │       │   │                           │   ├── AuthenticationInitializeCustomizer.java
│   │   │       │   │                           │   ├── AuthenticationInitializeProperties.java
│   │   │       │   │                           │   ├── DefaultAuthorizationSettingService.java
│   │   │       │   │                           │   ├── DefaultDimensionService.java
│   │   │       │   │                           │   ├── DefaultDimensionUserService.java
│   │   │       │   │                           │   ├── DefaultPermissionService.java
│   │   │       │   │                           │   ├── DefaultReactiveAuthenticationInitializeService.java
│   │   │       │   │                           │   ├── DefaultReactiveAuthenticationManager.java
│   │   │       │   │                           │   ├── DefaultReactiveUserService.java
│   │   │       │   │                           │   ├── DynamicDimension.java
│   │   │       │   │                           │   ├── PermissionSynchronization.java
│   │   │       │   │                           │   ├── RemoveUserTokenWhenUserDisabled.java
│   │   │       │   │                           │   └── terms/
│   │   │       │   │                           │       ├── DimensionTerm.java
│   │   │       │   │                           │       └── UserDimensionTerm.java
│   │   │       │   │                           └── webflux/
│   │   │       │   │                               ├── DimensionTypeResponse.java
│   │   │       │   │                               ├── WebFluxAuthorizationSettingController.java
│   │   │       │   │                               ├── WebFluxDimensionController.java
│   │   │       │   │                               ├── WebFluxDimensionTypeController.java
│   │   │       │   │                               ├── WebFluxDimensionUserController.java
│   │   │       │   │                               ├── WebFluxPermissionController.java
│   │   │       │   │                               └── WebFluxUserController.java
│   │   │       │   └── resources/
│   │   │       │       ├── META-INF/
│   │   │       │       │   └── spring/
│   │   │       │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │   │       │       └── i18n/
│   │   │       │           └── authentication-default/
│   │   │       │               ├── messages_en.properties
│   │   │       │               └── messages_zh.properties
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── hswebframework/
│   │   │           │           └── web/
│   │   │           │               └── system/
│   │   │           │                   └── authorization/
│   │   │           │                       └── defaults/
│   │   │           │                           └── service/
│   │   │           │                               ├── DefaultDimensionUserServiceTest.java
│   │   │           │                               └── reactive/
│   │   │           │                                   ├── DefaultReactiveAuthenticationManagerTest.java
│   │   │           │                                   ├── DefaultReactiveUserServiceTest.java
│   │   │           │                                   ├── ReactiveTestApplication.java
│   │   │           │                                   └── WebFluxPermissionControllerTest.java
│   │   │           └── resources/
│   │   │               └── application.yml
│   │   ├── hsweb-system-authorization-oauth2/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   ├── java/
│   │   │       │   │   └── org/
│   │   │       │   │       └── hswebframework/
│   │   │       │   │           └── web/
│   │   │       │   │               └── oauth2/
│   │   │       │   │                   ├── configuration/
│   │   │       │   │                   │   └── OAuth2ClientManagerAutoConfiguration.java
│   │   │       │   │                   ├── entity/
│   │   │       │   │                   │   └── OAuth2ClientEntity.java
│   │   │       │   │                   ├── enums/
│   │   │       │   │                   │   └── OAuth2ClientState.java
│   │   │       │   │                   ├── service/
│   │   │       │   │                   │   ├── InDBOAuth2ClientManager.java
│   │   │       │   │                   │   └── OAuth2ClientService.java
│   │   │       │   │                   └── web/
│   │   │       │   │                       └── WebFluxOAuth2ClientController.java
│   │   │       │   └── resources/
│   │   │       │       └── META-INF/
│   │   │       │           └── spring/
│   │   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   └── org/
│   │   │           │       └── hswebframework/
│   │   │           │           └── web/
│   │   │           │               └── oauth2/
│   │   │           │                   ├── ReactiveTestApplication.java
│   │   │           │                   ├── configuration/
│   │   │           │                   │   └── OAuth2ClientManagerAutoConfigurationTest.java
│   │   │           │                   └── service/
│   │   │           │                       └── OAuth2ClientServiceTest.java
│   │   │           └── resources/
│   │   │               └── application.yml
│   │   └── pom.xml
│   ├── hsweb-system-dictionary/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── dictionary/
│   │       │   │                   ├── configuration/
│   │       │   │                   │   ├── DictionaryAutoConfiguration.java
│   │       │   │                   │   └── DictionaryProperties.java
│   │       │   │                   ├── entity/
│   │       │   │                   │   ├── DictionaryEntity.java
│   │       │   │                   │   └── DictionaryItemEntity.java
│   │       │   │                   ├── event/
│   │       │   │                   │   └── ClearDictionaryCacheEvent.java
│   │       │   │                   ├── service/
│   │       │   │                   │   ├── CompositeDictDefineRepository.java
│   │       │   │                   │   ├── DefaultDictionaryItemService.java
│   │       │   │                   │   └── DefaultDictionaryService.java
│   │       │   │                   └── webflux/
│   │       │   │                       ├── WebfluxDictionaryController.java
│   │       │   │                       └── WebfluxDictionaryItemController.java
│   │       │   └── resources/
│   │       │       ├── META-INF/
│   │       │       │   └── spring/
│   │       │       │       └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       │       └── i18n/
│   │       │           └── dictionary/
│   │       │               ├── messages_en.properties
│   │       │               └── messages_zh.properties
│   │       └── test/
│   │           └── java/
│   │               └── org/
│   │                   └── hswebframework/
│   │                       └── web/
│   │                           └── dictionary/
│   │                               ├── ReactiveTestApplication.java
│   │                               ├── configuration/
│   │                               │   └── DictionaryAutoConfigurationTest.java
│   │                               └── service/
│   │                                   └── DefaultDictionaryItemServiceTest.java
│   ├── hsweb-system-file/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── org/
│   │       │   │       └── hswebframework/
│   │       │   │           └── web/
│   │       │   │               └── file/
│   │       │   │                   ├── FileServiceConfiguration.java
│   │       │   │                   ├── FileUploadProperties.java
│   │       │   │                   ├── service/
│   │       │   │                   │   ├── FileStorageService.java
│   │       │   │                   │   └── LocalFileStorageService.java
│   │       │   │                   └── web/
│   │       │   │                       └── ReactiveFileController.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── spring/
│   │       │               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│   │       └── test/
│   │           ├── java/
│   │           │   └── org/
│   │           │       └── hswebframework/
│   │           │           └── web/
│   │           │               └── file/
│   │           │                   ├── FileUploadPropertiesTest.java
│   │           │                   ├── service/
│   │           │                   │   └── LocalFileStorageServiceTest.java
│   │           │                   └── web/
│   │           │                       ├── ReactiveFileControllerTest.java
│   │           │                       └── TestApplication.java
│   │           └── resources/
│   │               └── test.json
│   └── pom.xml
├── mvnw
├── mvnw.cmd
└── pom.xml
Download .txt
Showing preview only (363K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3974 symbols across 659 files)

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java
  type Authentication (line 43) | public interface Authentication extends Serializable {
    method currentReactive (line 59) | static Mono<Authentication> currentReactive() {
    method current (line 77) | static Optional<Authentication> current() {
    method getUser (line 84) | User getUser();
    method getDimensions (line 90) | List<Dimension> getDimensions();
    method getPermissions (line 95) | List<Permission> getPermissions();
    method hasDimension (line 97) | default boolean hasDimension(String type, String... id) {
    method hasAllDimension (line 101) | default boolean hasAllDimension(String type, Collection<String> id) {
    method hasAnyDimension (line 110) | default boolean hasAnyDimension(String type, Collection<String> id) {
    method hasDimension (line 119) | @Deprecated
    method hasDimension (line 129) | default boolean hasDimension(DimensionType type, String id) {
    method getDimension (line 133) | default Optional<Dimension> getDimension(String type, String id) {
    method getDimension (line 143) | default Optional<Dimension> getDimension(DimensionType type, String id) {
    method getDimensions (line 154) | default List<Dimension> getDimensions(String type) {
    method getDimensions (line 164) | default List<Dimension> getDimensions(DimensionType type) {
    method getPermission (line 181) | default Optional<Permission> getPermission(String id) {
    method hasPermission (line 198) | default boolean hasPermission(String permissionId, String... actions) {
    method hasPermission (line 205) | default boolean hasPermission(String permissionId, Collection<String> ...
    method getAttribute (line 225) | <T extends Serializable> Optional<T> getAttribute(String name);
    method getAttributes (line 230) | Map<String, Serializable> getAttributes();
    method setAttribute (line 238) | default void setAttribute(String key, Serializable value) {
    method merge (line 248) | Authentication merge(Authentication source);
    method copy (line 257) | Authentication copy(BiPredicate<Permission, String> permissionFilter,

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationHolder.java
  class AuthenticationHolder (line 52) | public final class AuthenticationHolder {
    method get (line 60) | private static Optional<Authentication> get(Function<AuthenticationSup...
    method get (line 80) | public static Optional<Authentication> get() {
    method get (line 94) | public static Optional<Authentication> get(String userId) {
    method addSupplier (line 103) | public static void addSupplier(AuthenticationSupplier supplier) {
    method resetCurrent (line 112) | public static void resetCurrent() {
    method makeCurrent (line 116) | public static void makeCurrent(Authentication authentication) {
    method executeWith (line 132) | @SneakyThrows

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationManager.java
  type AuthenticationManager (line 29) | public interface AuthenticationManager {
    method authenticate (line 37) | Authentication authenticate(AuthenticationRequest request);
    method getByUserId (line 45) | Optional<Authentication> getByUserId(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationPredicate.java
  type AuthenticationPredicate (line 13) | @FunctionalInterface
    method has (line 16) | static AuthenticationPredicate has(String permissionString) {
    method dimension (line 20) | static AuthenticationPredicate dimension(String dimension, String... i...
    method permission (line 24) | static AuthenticationPredicate permission(String permissionId, String....
    method and (line 28) | default AuthenticationPredicate and(String permissionString) {
    method or (line 32) | default AuthenticationPredicate or(String permissionString) {
    method and (line 36) | @Override
    method or (line 42) | @Override
    method assertHas (line 49) | default void assertHas(Authentication authentication) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationRequest.java
  type AuthenticationRequest (line 9) | public interface AuthenticationRequest extends Serializable {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationSupplier.java
  type AuthenticationSupplier (line 30) | public interface AuthenticationSupplier extends Supplier<Optional<Authen...
    method get (line 32) | Optional<Authentication> get(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationUtils.java
  class AuthenticationUtils (line 13) | public class AuthenticationUtils {
    method merge (line 16) | public static Mono<Authentication> merge(Flux<Authentication> authenti...
    class AuthenticationMerging (line 22) | static class AuthenticationMerging {
      method merge (line 27) | public synchronized void merge(Authentication auth) {
      method get (line 40) | Authentication get() {
    method createPredicate (line 46) | public static AuthenticationPredicate createPredicate(String expressio...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DefaultDimensionType.java
  type DefaultDimensionType (line 6) | @Getter
    method getId (line 14) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Dimension.java
  type Dimension (line 9) | public interface Dimension extends Serializable {
    method getId (line 10) | String getId();
    method getName (line 12) | String getName();
    method getType (line 14) | DimensionType getType();
    method getOptions (line 16) | Map<String, Object> getOptions();
    method getOption (line 18) | default <T> Optional<T> getOption(String key) {
    method typeIs (line 24) | default boolean typeIs(DimensionType type) {
    method typeIs (line 28) | default boolean typeIs(String type) {
    method of (line 32) | static Dimension of(String id, String name, DimensionType type) {
    method of (line 36) | static Dimension of(String id, String name, DimensionType type, Map<St...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionProvider.java
  type DimensionProvider (line 14) | public interface DimensionProvider {
    method getAllType (line 21) | Flux<? extends DimensionType> getAllType();
    method getDimensionByUserId (line 29) | Flux<? extends Dimension> getDimensionByUserId(String userId);
    method getDimensionById (line 38) | Mono<? extends Dimension> getDimensionById(DimensionType type, String ...
    method getDimensionsById (line 46) | default Flux<? extends Dimension> getDimensionsById(DimensionType type...
    method getUserIdByDimensionId (line 58) | Flux<String> getUserIdByDimensionId(String dimensionId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionType.java
  type DimensionType (line 3) | public interface DimensionType {
    method getId (line 4) | String getId();
    method getName (line 6) | String getName();
    method isSameType (line 8) | default boolean isSameType(DimensionType another) {
    method isSameType (line 12) | default boolean isSameType(String anotherId) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Permission.java
  type Permission (line 39) | public interface Permission extends Serializable {
    method getId (line 87) | String getId();
    method getName (line 92) | String getName();
    method getOptions (line 97) | Map<String, Object> getOptions();
    method getOption (line 99) | default Optional<Object> getOption(String key) {
    method getActions (line 111) | Set<String> getActions();
    method getDataAccesses (line 122) | @Deprecated
    method getDataAccesses (line 126) | default Set<DataAccessConfig> getDataAccesses(String action) {
    method findDataAccess (line 141) | @SuppressWarnings("all")
    method findFieldFilter (line 156) | default Optional<FieldFilterDataAccessConfig> findFieldFilter(String a...
    method findDenyFields (line 166) | default Set<String> findDenyFields(String action) {
    method findScope (line 182) | default Set<Object> findScope(String action, String type, String scope...
    method findScope (line 186) | default Set<Object> findScope(Permission.DataAccessPredicate<ScopeData...
    method scope (line 200) | static Permission.DataAccessPredicate<ScopeDataAccessConfig> scope(Str...
    method copy (line 212) | Permission copy();
    method copy (line 214) | Permission copy(Predicate<String> actionFilter,Predicate<DataAccessCon...
    type DataAccessPredicate (line 221) | interface DataAccessPredicate<T extends DataAccessConfig> extends Pred...
      method test (line 222) | boolean test(DataAccessConfig config);
      method and (line 225) | @Override
      method or (line 230) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationHolder.java
  class ReactiveAuthenticationHolder (line 45) | public final class ReactiveAuthenticationHolder {
    method get (line 53) | private static Mono<Authentication> get(Function<ReactiveAuthenticatio...
    method get (line 61) | public static Mono<Authentication> get() {
    method get (line 77) | public static Mono<Authentication> get(String userId) {
    method addSupplier (line 86) | public static void addSupplier(ReactiveAuthenticationSupplier supplier) {
    method setSupplier (line 90) | public static void setSupplier(ReactiveAuthenticationSupplier supplier) {
    method ignoreContext (line 95) | public static Context ignoreContext(boolean ignore) {
    method ignoreIfAbsent (line 99) | public static Function<Context, Context> ignoreIfAbsent(boolean ignore) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationInitializeService.java
  type ReactiveAuthenticationInitializeService (line 30) | public interface ReactiveAuthenticationInitializeService {
    method initUserAuthorization (line 38) | Mono<Authentication> initUserAuthorization(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationManager.java
  type ReactiveAuthenticationManager (line 29) | public interface ReactiveAuthenticationManager {
    method authenticate (line 37) | Mono<Authentication> authenticate(Mono<AuthenticationRequest> request);
    method getByUserId (line 45) | Mono<Authentication> getByUserId(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationManagerProvider.java
  type ReactiveAuthenticationManagerProvider (line 5) | public interface ReactiveAuthenticationManagerProvider {
    method authenticate (line 12) | Mono<Authentication> authenticate(Mono<AuthenticationRequest> request);
    method getByUserId (line 20) | Mono<Authentication> getByUserId(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationSupplier.java
  type ReactiveAuthenticationSupplier (line 31) | public interface ReactiveAuthenticationSupplier extends Supplier<Mono<Au...
    method get (line 32) | Mono<Authentication> get(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Role.java
  type Role (line 29) | public interface Role extends Dimension {
    method getId (line 34) | String getId();
    method getName (line 39) | String getName();
    method getType (line 41) | @Override
    method fromDimension (line 46) | static Role fromDimension(Dimension dimension){

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/User.java
  type User (line 26) | public interface User extends Dimension {
    method getId (line 30) | String getId();
    method getUsername (line 35) | String getUsername();
    method getName (line 40) | String getName();
    method getUserType (line 45) | String getUserType();
    method getType (line 47) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessConfig.java
  type DataAccessConfig (line 33) | public interface DataAccessConfig extends Serializable {
    method getAction (line 45) | String getAction();
    method getType (line 53) | DataAccessType getType();
    type DefaultType (line 58) | interface DefaultType {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessConfiguration.java
  type DataAccessConfiguration (line 3) | public interface DataAccessConfiguration {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessController.java
  type DataAccessController (line 12) | @Deprecated
    method doAccess (line 20) | boolean doAccess(DataAccessConfig access, AuthorizingContext context);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessHandler.java
  type DataAccessHandler (line 10) | public interface DataAccessHandler {
    method isSupport (line 18) | boolean isSupport(DataAccessConfig access);
    method handle (line 27) | boolean handle(DataAccessConfig access, AuthorizingContext context);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessType.java
  type DataAccessType (line 3) | public interface DataAccessType {
    method getId (line 5) | String getId();
    method getName (line 7) | String getName();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DefaultDataAccessType.java
  type DefaultDataAccessType (line 8) | @Getter
    method getText (line 17) | @Override
    method getValue (line 22) | @Override
    method getId (line 27) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DimensionHelper.java
  class DimensionHelper (line 16) | @NoArgsConstructor(access = AccessLevel.PRIVATE)
    method getDimensionDataAccessScope (line 20) | public static Set<Object> getDimensionDataAccessScope(Authentication atz,
    method getDimensionDataAccessScope (line 40) | public static Set<Object> getDimensionDataAccessScope(Authentication atz,
    method getDimensionDataAccessScope (line 48) | public static Set<Object> getDimensionDataAccessScope(Authentication atz,
    method getDimensionDataAccessScope (line 57) | public static Set<Object> getDimensionDataAccessScope(Authentication atz,

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/FieldFilterDataAccessConfig.java
  type FieldFilterDataAccessConfig (line 12) | public interface FieldFilterDataAccessConfig extends DataAccessConfig {
    method getFields (line 13) | Set<String> getFields();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/OwnCreatedDataAccessConfig.java
  type OwnCreatedDataAccessConfig (line 8) | public interface OwnCreatedDataAccessConfig extends DataAccessConfig {
    method getType (line 9) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/ScopeDataAccessConfig.java
  type ScopeDataAccessConfig (line 12) | public interface ScopeDataAccessConfig extends DataAccessConfig {
    method getScopeType (line 17) | String getScopeType();
    method getScope (line 22) | Set<Object> getScope();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/UserAttachEntity.java
  type UserAttachEntity (line 10) | public interface UserAttachEntity {
    method getUserId (line 13) | String getUserId();
    method setUserId (line 15) | void setUserId(String userId);
    method getUserIdProperty (line 17) | default String getUserIdProperty() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Logical.java
  type Logical (line 20) | public enum Logical {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/AuthenticationBuilder.java
  type AuthenticationBuilder (line 29) | public interface AuthenticationBuilder extends Serializable {
    method user (line 31) | AuthenticationBuilder user(User user);
    method user (line 33) | AuthenticationBuilder user(String user);
    method user (line 35) | AuthenticationBuilder user(Map<String, String> user);
    method role (line 38) | AuthenticationBuilder role(List<Role> role);
    method role (line 40) | AuthenticationBuilder role(String role);
    method permission (line 43) | AuthenticationBuilder permission(List<Permission> permission);
    method permission (line 45) | AuthenticationBuilder permission(String permission);
    method attributes (line 47) | AuthenticationBuilder attributes(String attributes);
    method attributes (line 49) | AuthenticationBuilder attributes(Map<String, Serializable> permission);
    method json (line 51) | AuthenticationBuilder json(String json);
    method build (line 53) | Authentication build();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/AuthenticationBuilderFactory.java
  type AuthenticationBuilderFactory (line 8) | public interface AuthenticationBuilderFactory {
    method create (line 12) | AuthenticationBuilder create();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/DataAccessConfigBuilder.java
  type DataAccessConfigBuilder (line 11) | public interface DataAccessConfigBuilder {
    method fromJson (line 12) | DataAccessConfigBuilder fromJson(String json);
    method fromMap (line 14) | DataAccessConfigBuilder fromMap(Map<String,Object> json);
    method build (line 16) | DataAccessConfig build();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/DataAccessConfigBuilderFactory.java
  type DataAccessConfigBuilderFactory (line 8) | public interface DataAccessConfigBuilderFactory {
    method create (line 12) | DataAccessConfigBuilder create();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java
  class AuthenticationThreadLocalAccessor (line 10) | public class AuthenticationThreadLocalAccessor
    method key (line 21) | @Override
    method getValue (line 27) | @Override
    method setValue (line 32) | @Override
    method setValue (line 37) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/ThreadLocalReactiveAuthenticationSupplier.java
  class ThreadLocalReactiveAuthenticationSupplier (line 8) | class ThreadLocalReactiveAuthenticationSupplier implements ReactiveAuthe...
    method get (line 9) | @Override
    method get (line 14) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AopAuthorizeDefinition.java
  type AopAuthorizeDefinition (line 9) | public interface AopAuthorizeDefinition extends AuthorizeDefinition {
    method getTargetClass (line 10) | Class<?> getTargetClass();
    method getTargetMethod (line 12) | Method getTargetMethod();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinition.java
  type AuthorizeDefinition (line 12) | public interface AuthorizeDefinition {
    method getResources (line 14) | ResourcesDefinition getResources();
    method getDimensions (line 16) | DimensionsDefinition getDimensions();
    method getMessage (line 18) | String getMessage();
    method getPhased (line 20) | Phased getPhased();
    method isEmpty (line 22) | boolean isEmpty();
    method allowAnonymous (line 24) | default boolean allowAnonymous() {
    method getDescription (line 28) | default String getDescription() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionContext.java
  type AuthorizeDefinitionContext (line 3) | public interface AuthorizeDefinitionContext {
    method addResource (line 5) | void addResource(ResourceDefinition def);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionCustomizer.java
  type AuthorizeDefinitionCustomizer (line 3) | public interface AuthorizeDefinitionCustomizer {
    method custom (line 5) | void custom(AuthorizeDefinitionContext context);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionInitializedEvent.java
  class AuthorizeDefinitionInitializedEvent (line 8) | public class AuthorizeDefinitionInitializedEvent extends ApplicationEven...
    method AuthorizeDefinitionInitializedEvent (line 11) | public AuthorizeDefinitionInitializedEvent(List<AuthorizeDefinition> a...
    method getAllDefinition (line 15) | @SuppressWarnings("unchecked")

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizingContext.java
  class AuthorizingContext (line 13) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/CompositeAuthorizeDefinitionCustomizer.java
  class CompositeAuthorizeDefinitionCustomizer (line 9) | @AllArgsConstructor
    method CompositeAuthorizeDefinitionCustomizer (line 14) | public CompositeAuthorizeDefinitionCustomizer(Iterable<AuthorizeDefini...
    method custom (line 18) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessDefinition.java
  class DataAccessDefinition (line 8) | @Getter
    method getType (line 14) | public Optional<DataAccessTypeDefinition> getType(String typeId) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessTypeDefinition.java
  class DataAccessTypeDefinition (line 11) | @Getter
    method copy (line 25) | public DataAccessTypeDefinition copy(){

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DimensionDefinition.java
  class DimensionDefinition (line 18) | @Getter
    method hasDimension (line 31) | public boolean hasDimension(Predicate3<String,Logical, Set<String>> fi...
    method hasDimension (line 35) | public boolean hasDimension(Set<String> dimensionIdPredicate) {
    method hasDimension (line 44) | public boolean hasDimension(String id) {
    method addDimensionI (line 48) | public void addDimensionI(Set<String> id) {
    method copy (line 52) | public DimensionDefinition copy() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DimensionsDefinition.java
  class DimensionsDefinition (line 17) | @Getter
    method getDimensions (line 27) | public Set<DimensionDefinition> getDimensions() {
    method clear (line 31) | public void clear() {
    method addDimension (line 35) | public void addDimension(DimensionDefinition definition) {
    method isEmpty (line 42) | public boolean isEmpty() {
    method hasDimension (line 46) | public boolean hasDimension(Dimension dimension) {
    method hasDimension (line 51) | public boolean hasDimension(Predicate3<String,Logical, Set<String>> fi...
    method hasDimension (line 66) | public boolean hasDimension(List<Dimension> dimensions) {
    method toString (line 75) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/HandleType.java
  type HandleType (line 3) | public enum HandleType{

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/MergedAuthorizeDefinition.java
  class MergedAuthorizeDefinition (line 7) | public class MergedAuthorizeDefinition implements AuthorizeDefinitionCon...
    method getResources (line 13) | public Set<ResourceDefinition> getResources() {
    method getDimensions (line 17) | public Set<DimensionDefinition> getDimensions() {
    method addResource (line 21) | public void addResource(ResourceDefinition resource) {
    method addDimension (line 25) | public void addDimension(DimensionDefinition resource) {
    method merge (line 29) | public void merge(List<AuthorizeDefinition> definitions) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/Phased.java
  type Phased (line 3) | public enum Phased {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java
  class ResourceActionDefinition (line 17) | @Getter
    method copy (line 35) | public ResourceActionDefinition copy() {
    method getI18nMessages (line 39) | public Map<String, Map<String, String>> getI18nMessages() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceDefinition.java
  class ResourceDefinition (line 17) | @Getter
    method of (line 51) | public static ResourceDefinition of(String id, String name) {
    method getI18nMessages (line 58) | public Map<String, Map<String, String>> getI18nMessages() {
    method copy (line 68) | public ResourceDefinition copy() {
    method addAction (line 74) | public ResourceDefinition addAction(String id, String name) {
    method addAction (line 81) | public synchronized ResourceDefinition addAction(ResourceActionDefinit...
    method getAction (line 87) | public Optional<ResourceActionDefinition> getAction(String action) {
    method getActionIds (line 93) | public Set<String> getActionIds() {
    method getDataAccessAction (line 103) | @JsonIgnore
    method hasDataAccessAction (line 110) | public boolean hasDataAccessAction() {
    method hasAction (line 115) | public boolean hasAction(Collection<String> actions) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourcesDefinition.java
  class ResourcesDefinition (line 15) | @Getter
    method clear (line 25) | public void clear() {
    method addResource (line 29) | public void addResource(ResourceDefinition resource, boolean merge) {
    method getResource (line 46) | public Optional<ResourceDefinition> getResource(String id) {
    method getDataAccessResources (line 53) | @JsonIgnore
    method hasPermission (line 61) | public boolean hasPermission(Permission permission) {
    method isEmpty (line 70) | public boolean isEmpty() {
    method hasPermission (line 74) | public boolean hasPermission(Authentication authentication) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionManager.java
  type DimensionManager (line 13) | public interface DimensionManager {
    method getUserDimension (line 21) | Flux<DimensionUserDetail> getUserDimension(Collection<String> userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserBind.java
  class DimensionUserBind (line 13) | @Getter
    method writeExternal (line 26) | @Override
    method readExternal (line 33) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserBindProvider.java
  type DimensionUserBindProvider (line 7) | public interface DimensionUserBindProvider {
    method getDimensionBindInfo (line 9) | Flux<DimensionUserBind> getDimensionBindInfo(Collection<String> userId...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserDetail.java
  class DimensionUserDetail (line 13) | @Getter
    method merge (line 25) | public DimensionUserDetail merge(DimensionUserDetail detail) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java
  class AbstractAuthorizationEvent (line 33) | public abstract class AbstractAuthorizationEvent extends DefaultAsyncEve...
    method AbstractAuthorizationEvent (line 49) | public AbstractAuthorizationEvent(String username, String password, Fu...
    method getParameter (line 58) | @SuppressWarnings("unchecked")
    method getUsername (line 63) | public String getUsername() {
    method getPassword (line 67) | public String getPassword() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationBeforeEvent.java
  class AuthorizationBeforeEvent (line 32) | @Getter
    method AuthorizationBeforeEvent (line 41) | public AuthorizationBeforeEvent(String username, String password, Func...
    method setAuthorized (line 45) | public void setAuthorized(String userId) {
    method setAuthorized (line 49) | public void setAuthorized(Authentication authentication) {
    method isAuthorized (line 53) | public boolean isAuthorized() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationDecodeEvent.java
  class AuthorizationDecodeEvent (line 29) | public class AuthorizationDecodeEvent extends AbstractAuthorizationEvent {
    method AuthorizationDecodeEvent (line 33) | public AuthorizationDecodeEvent(String username, String password, Func...
    method setUsername (line 37) | public void setUsername(String username) {
    method setPassword (line 41) | public void setPassword(String password) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationEvent.java
  type AuthorizationEvent (line 33) | public interface AuthorizationEvent {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationExitEvent.java
  class AuthorizationExitEvent (line 30) | public class AuthorizationExitEvent extends DefaultAsyncEvent implements...
    method AuthorizationExitEvent (line 36) | public AuthorizationExitEvent(Authentication authentication) {
    method getAuthentication (line 40) | public Authentication getAuthentication() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationFailedEvent.java
  class AuthorizationFailedEvent (line 28) | public class AuthorizationFailedEvent extends AbstractAuthorizationEvent {
    method AuthorizationFailedEvent (line 37) | public AuthorizationFailedEvent(String username,
    method getException (line 43) | public Throwable getException() {
    method setException (line 47) | public void setException(Throwable exception) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java
  class AuthorizationInitializeEvent (line 9) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java
  class AuthorizationSuccessEvent (line 36) | public class AuthorizationSuccessEvent extends DefaultAsyncEvent impleme...
    method AuthorizationSuccessEvent (line 44) | public AuthorizationSuccessEvent(Authentication authentication, Functi...
    method getAuthentication (line 49) | public Authentication getAuthentication() {
    method getParameter (line 53) | @SuppressWarnings("unchecked")
    method getResult (line 58) | public Map<String, Object> getResult() {
    method setResult (line 62) | public void setResult(Map<String, Object> result) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizingHandleBeforeEvent.java
  class AuthorizingHandleBeforeEvent (line 23) | public class AuthorizingHandleBeforeEvent extends DefaultAsyncEvent impl...
    method AuthorizingHandleBeforeEvent (line 39) | public AuthorizingHandleBeforeEvent(AuthorizingContext context, Handle...
    method getContext (line 44) | public AuthorizingContext getContext() {
    method isExecute (line 48) | public boolean isExecute() {
    method isAllow (line 52) | public boolean isAllow() {
    method setAllow (line 61) | public void setAllow(boolean allow) {
    method getMessage (line 66) | public String getMessage() {
    method setMessage (line 75) | public void setMessage(String message) {
    method getHandleType (line 82) | public HandleType getHandleType() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/AccessDenyException.java
  class AccessDenyException (line 16) | @ResponseStatus(HttpStatus.FORBIDDEN)
    method AccessDenyException (line 24) | public AccessDenyException() {
    method AccessDenyException (line 28) | public AccessDenyException(String message) {
    method AccessDenyException (line 32) | public AccessDenyException(String permission, Set<String> actions) {
    method AccessDenyException (line 36) | public AccessDenyException(String message, String code) {
    method AccessDenyException (line 40) | public AccessDenyException(String message, Throwable cause) {
    method AccessDenyException (line 44) | public AccessDenyException(String message, String code, Throwable caus...
    class NoStackTrace (line 52) | public static class NoStackTrace extends AccessDenyException {
      method NoStackTrace (line 53) | public NoStackTrace() {
      method NoStackTrace (line 57) | public NoStackTrace(String message) {
      method NoStackTrace (line 61) | public NoStackTrace(String permission, Set<String> actions) {
      method NoStackTrace (line 65) | public NoStackTrace(String message, String code) {
      method NoStackTrace (line 69) | public NoStackTrace(String message, Throwable cause) {
      method NoStackTrace (line 73) | public NoStackTrace(String message, String code, Throwable cause) {
      method fillInStackTrace (line 77) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/AuthenticationException.java
  class AuthenticationException (line 6) | @Getter
    method AuthenticationException (line 17) | public AuthenticationException(String code) {
    method AuthenticationException (line 21) | public AuthenticationException(String code, String message) {
    method AuthenticationException (line 26) | public AuthenticationException(String code, String message, Throwable ...
    class NoStackTrace (line 34) | public static class NoStackTrace extends AuthenticationException {
      method NoStackTrace (line 35) | public NoStackTrace(String code) {
      method NoStackTrace (line 39) | public NoStackTrace(String code, String message) {
      method NoStackTrace (line 43) | public NoStackTrace(String code, String message, Throwable cause) {
      method fillInStackTrace (line 47) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/NeedTwoFactorException.java
  class NeedTwoFactorException (line 9) | @Getter
    method NeedTwoFactorException (line 14) | public NeedTwoFactorException(String message, String provider) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/UnAuthorizedException.java
  class UnAuthorizedException (line 33) | @Getter
    method UnAuthorizedException (line 40) | public UnAuthorizedException() {
    method UnAuthorizedException (line 44) | public UnAuthorizedException(TokenState state) {
    method UnAuthorizedException (line 48) | public UnAuthorizedException(String message, TokenState state) {
    method UnAuthorizedException (line 53) | public UnAuthorizedException(String message, TokenState state, Throwab...
    class NoStackTrace (line 61) | public static class NoStackTrace extends UnAuthorizedException {
      method NoStackTrace (line 62) | public NoStackTrace() {
      method NoStackTrace (line 66) | public NoStackTrace(TokenState state) {
      method NoStackTrace (line 70) | public NoStackTrace(String message, TokenState state) {
      method NoStackTrace (line 74) | public NoStackTrace(String message, TokenState state, Throwable caus...
      method fillInStackTrace (line 78) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/SettingNullValueHolder.java
  class SettingNullValueHolder (line 10) | public class SettingNullValueHolder implements SettingValueHolder {
    method SettingNullValueHolder (line 14) | private SettingNullValueHolder() {
    method asList (line 17) | @Override
    method as (line 22) | @Override
    method asString (line 27) | @Override
    method asLong (line 32) | @Override
    method asInt (line 37) | @Override
    method asDouble (line 42) | @Override
    method getValue (line 47) | @Override
    method getPermission (line 52) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/SettingValueHolder.java
  type SettingValueHolder (line 6) | public interface SettingValueHolder {
    method asList (line 10) | <T> Optional<List<T>> asList(Class<T> t);
    method as (line 12) | <T> Optional<T> as(Class<T> t);
    method asString (line 14) | Optional<String> asString();
    method asLong (line 16) | Optional<Long> asLong();
    method asInt (line 18) | Optional<Integer> asInt();
    method asDouble (line 20) | Optional<Double> asDouble();
    method getValue (line 22) | Optional<Object> getValue();
    method getPermission (line 24) | UserSettingPermission getPermission();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/StringSourceSettingHolder.java
  class StringSourceSettingHolder (line 17) | @AllArgsConstructor
    method of (line 25) | public static SettingValueHolder of(String value, UserSettingPermissio...
    method asList (line 32) | @Override
    method convert (line 38) | protected <T> T convert(String value, Class<T> t) {
    method as (line 55) | @Override
    method asString (line 70) | @Override
    method asLong (line 75) | @Override
    method asInt (line 80) | @Override
    method asDouble (line 85) | @Override
    method getNativeValue (line 90) | private Optional<String> getNativeValue() {
    method getValue (line 94) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/UserSettingManager.java
  type UserSettingManager (line 7) | public interface UserSettingManager {
    method getSetting (line 9) | SettingValueHolder getSetting(String userId, String key);
    method saveSetting (line 11) | void saveSetting(String userId, String key, String value, UserSettingP...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/UserSettingPermission.java
  type UserSettingPermission (line 12) | @AllArgsConstructor
    method getValue (line 22) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/AbstractDataAccessConfig.java
  class AbstractDataAccessConfig (line 10) | public abstract class AbstractDataAccessConfig implements DataAccessConf...
    method getAction (line 16) | @Override
    method setAction (line 21) | public void setAction(String action) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/CompositeReactiveAuthenticationManager.java
  class CompositeReactiveAuthenticationManager (line 13) | @AllArgsConstructor
    method authenticate (line 19) | @Override
    method getByUserId (line 36) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java
  class DefaultAuthorizationAutoConfiguration (line 29) | @AutoConfiguration
    method userTokenManager (line 32) | @Bean
    method reactiveAuthenticationManager (line 39) | @Bean
    method userTokenReactiveAuthenticationSupplier (line 46) | @Bean
    method userTokenAuthenticationSupplier (line 55) | @Bean
    method dataAccessConfigBuilderFactory (line 64) | @Bean
    method authenticationBuilderFactory (line 71) | @Bean
    method authenticationCustomMessageConverter (line 77) | @Bean
    method defaultDimensionManager (line 94) | @Bean

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultDimensionManager.java
  class DefaultDimensionManager (line 19) | public class DefaultDimensionManager implements DimensionManager {
    method DefaultDimensionManager (line 31) | public DefaultDimensionManager() {
    method addProvider (line 35) | public void addProvider(DimensionProvider provider) {
    method addBindProvider (line 39) | public void addBindProvider(DimensionUserBindProvider bindProvider) {
    method providerMapping (line 43) | private Mono<Map<String, DimensionProvider>> providerMapping() {
    method getUserDimension (line 47) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DimensionDataAccessConfig.java
  class DimensionDataAccessConfig (line 14) | @Getter
    method getType (line 28) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/PlainTextUsernamePasswordAuthenticationRequest.java
  class PlainTextUsernamePasswordAuthenticationRequest (line 13) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java
  class SimpleAuthentication (line 33) | public class SimpleAuthentication implements Authentication {
    method of (line 52) | public static Authentication of() {
    method getAttribute (line 56) | @Override
    method getDimensions (line 62) | public List<Dimension> getDimensions() {
    method getPermissions (line 66) | public List<Permission> getPermissions() {
    method getAttributes (line 70) | @Override
    method merge (line 75) | public SimpleAuthentication merge(Authentication authentication) {
    method newInstance (line 104) | protected SimpleAuthentication newInstance() {
    method copy (line 108) | @Override
    method setUser (line 129) | public void setUser(User user) {
    method setUser0 (line 134) | protected void setUser0(User user) {
    method setDimensions (line 138) | public void setDimensions(List<Dimension> dimensions) {
    method setDimensions (line 142) | public void setDimensions(Collection<Dimension> dimensions) {
    method addDimension (line 146) | public void addDimension(Dimension dimension) {
    method fastPath (line 154) | protected boolean fastPath() {
    method hasPermission (line 181) | @Override
    method getDimension (line 199) | @Override
    method getDimension (line 212) | @Override
    method getDimensions (line 217) | @Override
    method getDimensions (line 222) | @Override
    method getPermission (line 235) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleDimension.java
  class SimpleDimension (line 9) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleDimensionType.java
  class SimpleDimensionType (line 8) | @Getter
    method of (line 20) | public static SimpleDimensionType of(String id) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleFieldFilterDataAccessConfig.java
  class SimpleFieldFilterDataAccessConfig (line 20) | public class SimpleFieldFilterDataAccessConfig extends AbstractDataAcces...
    method SimpleFieldFilterDataAccessConfig (line 25) | public SimpleFieldFilterDataAccessConfig() {
    method SimpleFieldFilterDataAccessConfig (line 28) | public SimpleFieldFilterDataAccessConfig(String... fields) {
    method getFields (line 32) | @Override
    method setFields (line 37) | public void setFields(Set<String> fields) {
    method getType (line 41) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleOwnCreatedDataAccessConfig.java
  class SimpleOwnCreatedDataAccessConfig (line 9) | public class SimpleOwnCreatedDataAccessConfig extends AbstractDataAccess...
    method SimpleOwnCreatedDataAccessConfig (line 13) | public SimpleOwnCreatedDataAccessConfig() {
    method SimpleOwnCreatedDataAccessConfig (line 16) | public SimpleOwnCreatedDataAccessConfig(String action) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimplePermission.java
  class SimplePermission (line 15) | @Getter
    method getActions (line 35) | public Set<String> getActions() {
    method getDataAccesses (line 42) | public Set<DataAccessConfig> getDataAccesses() {
    method copy (line 49) | @Override
    method copy (line 64) | public Permission copy() {
    method toString (line 68) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleRole.java
  class SimpleRole (line 13) | @Getter
    method of (line 29) | public static Role of(Dimension dimension) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleUser.java
  class SimpleUser (line 13) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/DataAccessConfigConverter.java
  type DataAccessConfigConverter (line 8) | public interface DataAccessConfigConverter {
    method isSupport (line 10) | boolean isSupport(String type, String action, String config);
    method convert (line 12) | DataAccessConfig convert(String type, String action, String config);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilder.java
  class SimpleAuthenticationBuilder (line 19) | public class SimpleAuthenticationBuilder implements AuthenticationBuilder {
    method SimpleAuthenticationBuilder (line 24) | public SimpleAuthenticationBuilder(DataAccessConfigBuilderFactory data...
    method setDataBuilderFactory (line 28) | public void setDataBuilderFactory(DataAccessConfigBuilderFactory dataB...
    method user (line 32) | @Override
    method user (line 39) | @Override
    method user (line 44) | @Override
    method role (line 56) | @Override
    method role (line 62) | @Override
    method permission (line 68) | @Override
    method permission (line 74) | public AuthenticationBuilder permission(JSONArray jsonArray) {
    method permission (line 102) | @Override
    method attributes (line 107) | @Override
    method attributes (line 113) | @Override
    method dimension (line 119) | public AuthenticationBuilder dimension(JSONArray json) {
    method json (line 146) | @Override
    method build (line 165) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilderFactory.java
  class SimpleAuthenticationBuilderFactory (line 12) | public class SimpleAuthenticationBuilderFactory implements Authenticatio...
    method SimpleAuthenticationBuilderFactory (line 16) | public SimpleAuthenticationBuilderFactory(DataAccessConfigBuilderFacto...
    method create (line 20) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilder.java
  class SimpleDataAccessConfigBuilder (line 16) | public class SimpleDataAccessConfigBuilder implements DataAccessConfigBu...
    method SimpleDataAccessConfigBuilder (line 23) | public SimpleDataAccessConfigBuilder(List<DataAccessConfigConverter> c...
    method fromJson (line 28) | @Override
    method fromMap (line 34) | @Override
    method build (line 40) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilderFactory.java
  class SimpleDataAccessConfigBuilderFactory (line 22) | public class SimpleDataAccessConfigBuilderFactory implements DataAccessC...
    method addConvert (line 31) | public SimpleDataAccessConfigBuilderFactory addConvert(DataAccessConfi...
    method setDefaultSupportConvert (line 37) | public void setDefaultSupportConvert(List<String> defaultSupportConver...
    method getDefaultSupportConvert (line 41) | public List<String> getDefaultSupportConvert() {
    method createJsonConfig (line 45) | protected DataAccessConfigConverter createJsonConfig(String supportTyp...
    method createConfig (line 50) | protected DataAccessConfigConverter createConfig(String supportType, B...
    method init (line 68) | @PostConstruct
    method create (line 86) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/AllopatricLoginMode.java
  type AllopatricLoginMode (line 6) | public enum AllopatricLoginMode {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/AuthenticationUserToken.java
  type AuthenticationUserToken (line 11) | public interface AuthenticationUserToken extends UserToken {
    method getAuthentication (line 19) | Authentication getAuthentication();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/DefaultUserTokenManager.java
  class DefaultUserTokenManager (line 44) | public class DefaultUserTokenManager implements UserTokenManager {
    method DefaultUserTokenManager (line 56) | public DefaultUserTokenManager() {
    method DefaultUserTokenManager (line 61) | public DefaultUserTokenManager(ConcurrentMap<String, LocalUserToken> t...
    method DefaultUserTokenManager (line 65) | public DefaultUserTokenManager(ConcurrentMap<String, LocalUserToken> t...
    method setEventPublisher (line 76) | @Autowired(required = false)
    method setAllopatricLoginMode (line 81) | public void setAllopatricLoginMode(AllopatricLoginMode allopatricLogin...
    method getAllopatricLoginMode (line 85) | public AllopatricLoginMode getAllopatricLoginMode() {
    method getUserToken (line 89) | protected Set<String> getUserToken(String userId) {
    method checkTimeout (line 93) | private Mono<UserToken> checkTimeout(UserToken detail) {
    method getByToken (line 107) | @Override
    method getByUserId (line 115) | @Override
    method userIsLoggedIn (line 131) | @Override
    method tokenIsLoggedIn (line 140) | @Override
    method totalUser (line 150) | @Override
    method totalToken (line 155) | @Override
    method allLoggedUser (line 160) | @Override
    method signOutByUserId (line 165) | @Override
    method signOutByToken (line 182) | private Mono<Void> signOutByToken(String token, boolean removeUserToke...
    method signOutByToken (line 202) | @Override
    method changeTokenState (line 207) | public Mono<Void> changeTokenState(UserToken userToken, TokenState sta...
    method changeTokenState (line 220) | @Override
    method changeUserState (line 226) | @Override
    method signIn (line 232) | @Override
    method doSignIn (line 240) | private <T extends LocalUserToken> Mono<T> doSignIn(String token, Stri...
    method signIn (line 281) | @Override
    method touch (line 288) | @Override
    method checkExpiredToken (line 298) | @Override
    method syncToken (line 315) | protected void syncToken(UserToken userToken) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/LocalAuthenticationUserToken.java
  class LocalAuthenticationUserToken (line 13) | @AllArgsConstructor
    method getAuthentication (line 18) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/LocalUserToken.java
  class LocalUserToken (line 11) | public class LocalUserToken implements UserToken {
    method getMaxInactiveInterval (line 33) | @Override
    method setMaxInactiveInterval (line 38) | public void setMaxInactiveInterval(long maxInactiveInterval) {
    method LocalUserToken (line 42) | public LocalUserToken(String userId, String token) {
    method LocalUserToken (line 47) | public LocalUserToken() {
    method getUserId (line 50) | @Override
    method getRequestTimes (line 55) | @Override
    method getLastRequestTime (line 60) | @Override
    method getSignInTime (line 65) | @Override
    method getToken (line 70) | @Override
    method getState (line 75) | @Override
    method checkExpired (line 83) | @Override
    method setState (line 92) | public void setState(TokenState state) {
    method setUserId (line 96) | public void setUserId(String userId) {
    method setToken (line 100) | public void setToken(String token) {
    method setFirstRequestTime (line 104) | public void setFirstRequestTime(long firstRequestTime) {
    method setLastRequestTime (line 108) | public void setLastRequestTime(long lastRequestTime) {
    method setRequestTimes (line 112) | public void setRequestTimes(long requestTimes) {
    method touch (line 117) | public void touch() {
    method getType (line 122) | public String getType() {
    method setType (line 126) | public void setType(String type) {
    method copy (line 130) | public LocalUserToken copy() {
    method hashCode (line 143) | @Override
    method equals (line 148) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ParsedToken.java
  type ParsedToken (line 12) | public interface ParsedToken {
    method getToken (line 16) | String getToken();
    method getType (line 21) | String getType();
    method apply (line 29) | default void apply(HttpHeaders headers) {
    method ofBearer (line 33) | static ParsedToken ofBearer(String token) {
    method of (line 37) | static ParsedToken of(String type, String token) {
    method of (line 41) | static ParsedToken of(String type, String token, BiConsumer<HttpHeader...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ReactiveTokenAuthenticationSupplier.java
  class ReactiveTokenAuthenticationSupplier (line 8) | @AllArgsConstructor
    method get (line 13) | @Override
    method get (line 18) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/SimpleParsedToken.java
  class SimpleParsedToken (line 10) | @Getter
    method apply (line 21) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ThirdPartAuthenticationManager.java
  type ThirdPartAuthenticationManager (line 12) | public interface ThirdPartAuthenticationManager {
    method getTokenType (line 17) | String getTokenType();
    method getByUserId (line 25) | Optional<Authentication> getByUserId(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ThirdPartReactiveAuthenticationManager.java
  type ThirdPartReactiveAuthenticationManager (line 10) | public interface ThirdPartReactiveAuthenticationManager {
    method getTokenType (line 15) | String getTokenType();
    method getByUserId (line 23) | Mono<Authentication> getByUserId(String userId);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/TokenAuthenticationManager.java
  type TokenAuthenticationManager (line 14) | public interface TokenAuthenticationManager {
    method getByToken (line 22) | Mono<Authentication> getByToken(String token);
    method putAuthentication (line 32) | Mono<Void> putAuthentication(String token, Authentication auth, Durati...
    method removeToken (line 39) | Mono<Void> removeToken(String token);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/TokenState.java
  type TokenState (line 10) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserToken.java
  type UserToken (line 15) | public interface UserToken extends Serializable, Comparable<UserToken> {
    method getUserId (line 20) | String getUserId();
    method getToken (line 25) | String getToken();
    method getRequestTimes (line 30) | long getRequestTimes();
    method getLastRequestTime (line 35) | long getLastRequestTime();
    method getSignInTime (line 40) | long getSignInTime();
    method getState (line 45) | TokenState getState();
    method getType (line 50) | String getType();
    method getMaxInactiveInterval (line 55) | long getMaxInactiveInterval();
    method checkExpired (line 63) | default boolean checkExpired() {
    method isNormal (line 71) | default boolean isNormal() {
    method isExpired (line 78) | default boolean isExpired() {
    method isOffline (line 85) | default boolean isOffline() {
    method isLock (line 89) | default boolean isLock() {
    method isDeny (line 93) | default boolean isDeny() {
    method validate (line 97) | default boolean validate() {
    method compareTo (line 105) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenAuthenticationSupplier.java
  class UserTokenAuthenticationSupplier (line 15) | public class UserTokenAuthenticationSupplier implements AuthenticationSu...
    method UserTokenAuthenticationSupplier (line 23) | public UserTokenAuthenticationSupplier(UserTokenManager userTokenManag...
    method setThirdPartAuthenticationManager (line 28) | @Autowired(required = false)
    method get (line 35) | @Override
    method get (line 43) | protected Optional<Authentication> get(ThirdPartAuthenticationManager ...
    method get (line 53) | protected Optional<Authentication> get(AuthenticationManager authentic...
    method get (line 63) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenBeforeCreateEvent.java
  class UserTokenBeforeCreateEvent (line 8) | @Getter

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenHolder.java
  class UserTokenHolder (line 12) | public final class UserTokenHolder {
    method UserTokenHolder (line 14) | private UserTokenHolder() {
    method currentToken (line 17) | public static UserToken currentToken() {
    method makeCurrent (line 23) | public static Closeable makeCurrent(UserToken token) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenManager.java
  type UserTokenManager (line 35) | public interface UserTokenManager {
    method getByToken (line 43) | Mono<UserToken> getByToken(String token);
    method getByUserId (line 51) | Flux<UserToken> getByUserId(String userId);
    method userIsLoggedIn (line 57) | Mono<Boolean> userIsLoggedIn(String userId);
    method tokenIsLoggedIn (line 63) | Mono<Boolean> tokenIsLoggedIn(String token);
    method totalUser (line 68) | Mono<Integer> totalUser();
    method totalToken (line 73) | Mono<Integer> totalToken();
    method allLoggedUser (line 78) | Flux<UserToken> allLoggedUser();
    method signOutByUserId (line 85) | Mono<Void> signOutByUserId(String userId);
    method signOutByToken (line 93) | Mono<Void> signOutByToken(String token);
    method changeUserState (line 103) | Mono<Void> changeUserState(String userId, TokenState state);
    method changeTokenState (line 112) | Mono<Void> changeTokenState(String token, TokenState state);
    method signIn (line 123) | Mono<UserToken> signIn(String token, String type, String userId, long ...
    method signIn (line 135) | default Mono<AuthenticationUserToken> signIn(String token,
    method touch (line 148) | Mono<Void> touch(String token);
    method checkExpiredToken (line 155) | Mono<Void> checkExpiredToken();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenReactiveAuthenticationSupplier.java
  class UserTokenReactiveAuthenticationSupplier (line 16) | public class UserTokenReactiveAuthenticationSupplier implements Reactive...
    method UserTokenReactiveAuthenticationSupplier (line 24) | public UserTokenReactiveAuthenticationSupplier(UserTokenManager userTo...
    method setThirdPartAuthenticationManager (line 30) | @Autowired(required = false)
    method get (line 37) | @Override
    method get (line 45) | protected Mono<Authentication> get(ThirdPartReactiveAuthenticationMana...
    method get (line 55) | protected Mono<Authentication> get(ReactiveAuthenticationManager authe...
    method get (line 65) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/event/UserTokenChangedEvent.java
  class UserTokenChangedEvent (line 7) | public class UserTokenChangedEvent extends DefaultAsyncEvent implements ...
    method UserTokenChangedEvent (line 10) | public UserTokenChangedEvent(UserToken before, UserToken after) {
    method getBefore (line 15) | public UserToken getBefore() {
    method getAfter (line 19) | public UserToken getAfter() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/event/UserTokenCreatedEvent.java
  class UserTokenCreatedEvent (line 7) | public class UserTokenCreatedEvent extends DefaultAsyncEvent implements ...
    method UserTokenCreatedEvent (line 10) | public UserTokenCreatedEvent(UserToken detail) {
    method getDetail (line 14) | public UserToken getDetail() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/event/UserTokenRemovedEvent.java
  class UserTokenRemovedEvent (line 7) | public class UserTokenRemovedEvent extends DefaultAsyncEvent implements ...
    method UserTokenRemovedEvent (line 13) | public UserTokenRemovedEvent(UserToken token) {
    method getDetail (line 17) | public UserToken getDetail() {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/RedisTokenAuthenticationManager.java
  class RedisTokenAuthenticationManager (line 14) | public class RedisTokenAuthenticationManager implements TokenAuthenticat...
    method RedisTokenAuthenticationManager (line 18) | @SuppressWarnings("all")
    method RedisTokenAuthenticationManager (line 30) | public RedisTokenAuthenticationManager(ReactiveRedisOperations<String,...
    method getByToken (line 34) | @Override
    method removeToken (line 41) | @Override
    method putAuthentication (line 48) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/RedisUserTokenManager.java
  class RedisUserTokenManager (line 30) | public class RedisUserTokenManager implements UserTokenManager {
    method RedisUserTokenManager (line 43) | public RedisUserTokenManager(ReactiveRedisOperations<Object, Object> o...
    method RedisUserTokenManager (line 67) | @SuppressWarnings("all")
    method getTokenRedisKey (line 96) | private String getTokenRedisKey(String key) {
    method getUserRedisKey (line 100) | private String getUserRedisKey(String key) {
    method getByToken (line 104) | @Override
    method getByUserId (line 119) | @Override
    method userIsLoggedIn (line 131) | @Override
    method tokenIsLoggedIn (line 137) | @Override
    method totalUser (line 144) | @Override
    method totalToken (line 156) | @Override
    method allLoggedUser (line 167) | @Override
    method signOutByUserId (line 178) | @Override
    method signOutByToken (line 189) | @Override
    method changeUserState (line 202) | @Override
    method changeTokenState (line 210) | @Override
    method sign0 (line 223) | protected Mono<SimpleUserToken> sign0(String token,
    method signIn (line 261) | private Mono<UserToken> signIn(String token,
    method signIn (line 309) | @Override
    method signIn (line 315) | @Override
    method touch (line 328) | @Override
    method checkExpiredToken (line 348) | @Override
    method notifyTokenRemoved (line 368) | private Mono<Void> notifyTokenRemoved(String token) {
    method onTokenRemoved (line 372) | private Mono<Void> onTokenRemoved(UserToken token) {
    method onTokenChanged (line 383) | private Mono<Void> onTokenChanged(UserToken old, SimpleUserToken newTo...
    method publishEvent (line 393) | private Mono<Void> publishEvent(AsyncEvent event) {
    method onUserTokenCreated (line 400) | private Mono<UserToken> onUserTokenCreated(SimpleUserToken token) {

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/SimpleAuthenticationUserToken.java
  class SimpleAuthenticationUserToken (line 7) | @AllArgsConstructor
    method getAuthentication (line 11) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/SimpleUserToken.java
  class SimpleUserToken (line 14) | @Getter
    method of (line 36) | public static SimpleUserToken of(Map<String, Object> map) {
    method getState (line 44) | public TokenState getState() {
    method checkExpired (line 51) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorToken.java
  type TwoFactorToken (line 9) | public interface TwoFactorToken extends Serializable {
    method generate (line 10) | void generate(long timeout);
    method expired (line 12) | boolean expired();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorTokenManager.java
  type TwoFactorTokenManager (line 7) | public interface TwoFactorTokenManager {
    method getToken (line 8) | TwoFactorToken getToken(String userId, String operation);

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorValidator.java
  type TwoFactorValidator (line 9) | public interface TwoFactorValidator {
    method getProvider (line 11) | String getProvider();
    method verify (line 20) | boolean verify(String code, long timeout);
    method expired (line 27) | boolean expired();

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorValidatorManager.java
  type TwoFactorValidatorManager (line 8) | public interface TwoFactorValidatorManager {
    method getValidator (line 16) | TwoFactorValidator getValidator(String userId,String operation, String...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorValidatorProvider.java
  type TwoFactorValidatorProvider (line 7) | public interface TwoFactorValidatorProvider {
    method getProvider (line 9) | String getProvider();
    method createTwoFactorValidator (line 11) | TwoFactorValidator createTwoFactorValidator(String userId,String opera...

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/DefaultTwoFactorValidator.java
  class DefaultTwoFactorValidator (line 15) | @AllArgsConstructor
    method verify (line 25) | @Override
    method expired (line 34) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/DefaultTwoFactorValidatorManager.java
  class DefaultTwoFactorValidatorManager (line 18) | public class DefaultTwoFactorValidatorManager implements TwoFactorValida...
    method getValidator (line 26) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/DefaultTwoFactorValidatorProvider.java
  class DefaultTwoFactorValidatorProvider (line 12) | @Getter
    method DefaultTwoFactorValidatorProvider (line 19) | public DefaultTwoFactorValidatorProvider(String provider, TwoFactorTok...
    method validate (line 24) | protected abstract boolean validate(String userId, String code);
    method createTwoFactorValidator (line 26) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/HashMapTwoFactorTokenManager.java
  class HashMapTwoFactorTokenManager (line 16) | public class HashMapTwoFactorTokenManager implements TwoFactorTokenManag...
    class TwoFactorTokenInfo (line 20) | private class TwoFactorTokenInfo implements Serializable {
      method isExpire (line 26) | private boolean isExpire() {
    method createTokenInfoKey (line 32) | private String createTokenInfoKey(String userId, String operation) {
    method getTokenInfo (line 36) | private TwoFactorTokenInfo getTokenInfo(String userId, String operatio...
    method getToken (line 42) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/UnsupportedTwoFactorValidator.java
  class UnsupportedTwoFactorValidator (line 11) | @AllArgsConstructor
    method verify (line 17) | @Override
    method expired (line 22) | @Override

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/AuthenticationTests.java
  class AuthenticationTests (line 18) | public class AuthenticationTests {
    method setup (line 22) | @Before
    method testInitUserRoleAndPermission (line 34) | @Test
    method testGetSetCurrentUser (line 91) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/UserTokenManagerTests.java
  class UserTokenManagerTests (line 11) | public class UserTokenManagerTests {
    method createUserTokenManager (line 13) | private DefaultUserTokenManager createUserTokenManager(){
    method testDefaultSetting (line 27) | @Test
    method testDeny (line 91) | @Test
    method testOffline (line 113) | @Test
    method testAuth (line 129) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessorTest.java
  class AuthenticationThreadLocalAccessorTest (line 13) | class AuthenticationThreadLocalAccessorTest {
    method testReadFromReactive (line 19) | @Test
    method testReadInReactive (line 35) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/define/MergedAuthorizeDefinitionTest.java
  class MergedAuthorizeDefinitionTest (line 11) | public class MergedAuthorizeDefinitionTest {
    method test (line 13) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/simple/DefaultDimensionManagerTest.java
  class DefaultDimensionManagerTest (line 18) | public class DefaultDimensionManagerTest {
    method test (line 20) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/simple/SimpleAuthenticationTest.java
  class SimpleAuthenticationTest (line 13) | class SimpleAuthenticationTest {
    method setUp (line 22) | @BeforeEach
    method testOf (line 55) | @Test
    method testSetUser (line 62) | @Test
    method testSetUser0 (line 75) | @Test
    method testSetPermissions (line 85) | @Test
    method testSetDimensions (line 95) | @Test
    method testSetDimensionsCollection (line 105) | @Test
    method testAddDimension (line 113) | @Test
    method testSetAttributes (line 123) | @Test
    method testGetAttribute (line 135) | @Test
    method testGetAttributes (line 147) | @Test
    method testHasPermission (line 158) | @Test
    method testHasPermissionWithWildcard (line 175) | @Test
    method testHasPermissionWithActionWildcard (line 189) | @Test
    method testGetPermission (line 204) | @Test
    method testGetDimension (line 220) | @Test
    method testGetDimensionWithDimensionType (line 236) | @Test
    method testGetDimensions (line 246) | @Test
    method testGetDimensionsWithDimensionType (line 262) | @Test
    method testHasDimension (line 272) | @Test
    method testMerge (line 282) | @Test
    method testMergeWithDuplicatePermissions (line 320) | @Test
    method testMergeWithDuplicateDimensions (line 348) | @Test
    method testMergeWithNullUser (line 364) | @Test
    method testCopy (line 377) | @Test
    method testCopyWithPermissionFilter (line 398) | @Test
    method testCopyWithActionFilter (line 412) | @Test
    method testCopyWithDimensionFilter (line 430) | @Test
    method testCopyFiltersEmptyActions (line 444) | @Test
    method testFastPathOptimization (line 463) | @Test
    method testNewInstance (line 482) | @Test
    method testEmptyPermissions (line 494) | @Test
    method testEmptyDimensions (line 502) | @Test
    method testNullAttributes (line 511) | @Test
    method testGetAttributeWithType (line 518) | @Test
    method testMultipleDimensionsSameType (line 527) | @Test
    method testUserAsDimension (line 538) | @Test
    method testPerformanceBeforeFastPath (line 555) | @Test
    method testPerformanceAfterFastPath (line 614) | @Test
    method testPerformanceComparison (line 671) | @Test
    method testPerformanceWithDifferentDataSizes (line 763) | @Test
    method testFastPathInitializationThreshold (line 824) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/token/redis/RedisUserTokenManagerTest.java
  class RedisUserTokenManagerTest (line 23) | @Ignore
    method init (line 28) | @Before
    method testSign (line 48) | @Test
    method testOfflineOther (line 80) | @Test
    method testDeny (line 102) | @Test
    method testSignTimeout (line 118) | @Test
    method testAuth (line 146) | @Test

FILE: hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/twofactor/defaults/HashMapTwoFactorTokenManagerTest.java
  class HashMapTwoFactorTokenManagerTest (line 14) | public class HashMapTwoFactorTokenManagerTest {
    method test (line 18) | @Test

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/AopAuthorizingController.java
  class AopAuthorizingController (line 37) | @Slf4j
    method setAutoParse (line 57) | public void setAutoParse(boolean autoParse) {
    method handleReactive0 (line 62) | protected Publisher<?> handleReactive0(AuthorizeDefinition definition,
    method invokeReactive (line 84) | private Publisher<?> invokeReactive(Mono<?> before, Publisher<?> sourc...
    method invokeReactive (line 91) | private <T> T invokeReactive(MethodInvocation invocation) {
    method doProceed (line 101) | @SneakyThrows
    method invoke (line 107) | @Override
    method AopAuthorizingController (line 161) | public AopAuthorizingController(AuthorizingHandler authorizingHandler,...
    method matches (line 167) | @Override
    method run (line 182) | @Override
    method getOrder (line 197) | @Override
    method afterSingletonsInstantiated (line 202) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/AopMethodAuthorizeDefinitionCustomizerParser.java
  type AopMethodAuthorizeDefinitionCustomizerParser (line 13) | public interface AopMethodAuthorizeDefinitionCustomizerParser {
    method parse (line 14) | AuthorizeDefinition parse(Class<?> target, Method method, MethodInterc...

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/AopMethodAuthorizeDefinitionParser.java
  type AopMethodAuthorizeDefinitionParser (line 15) | public interface AopMethodAuthorizeDefinitionParser {
    method parse (line 24) | AuthorizeDefinition parse(Class<?> target, Method method, MethodInterc...
    method parse (line 26) | default AuthorizeDefinition parse(Class<?> target, Method method) {
    method getAllParsed (line 30) | List<AuthorizeDefinition> getAllParsed();

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/DefaultAopMethodAuthorizeDefinitionParser.java
  class DefaultAopMethodAuthorizeDefinitionParser (line 33) | @Slf4j
    method setParserCustomizers (line 42) | @Autowired(required = false)
    method getAllParsed (line 47) | @Override
    method parse (line 52) | @Override
    method buildCacheKey (line 95) | CacheKey buildCacheKey(Class<?> target, Method method) {
    class CacheKey (line 99) | @EqualsAndHashCode
      method CacheKey (line 104) | public CacheKey(Class<?> type, Method method) {
    method destroy (line 110) | public void destroy() {
    method isIgnoreMethod (line 114) | static boolean isIgnoreMethod(Method method) {

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/AopAuthorizeAutoConfiguration.java
  class AopAuthorizeAutoConfiguration (line 18) | @Configuration(proxyBeanMethods = false)
    method defaultAopMethodAuthorizeDefinitionParser (line 23) | @Bean
    method aopAuthorizingController (line 31) | @Bean

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/AuthorizingHandlerAutoConfiguration.java
  class AuthorizingHandlerAutoConfiguration (line 30) | @AutoConfiguration
    method authorizingHandler (line 36) | @Bean
    method userTokenWebFilter (line 43) | @Bean
    method embedAuthenticationManager (line 56) | @Bean
    method userAllowPermissionHandler (line 61) | @Bean
    method defaultUserTokenGenPar (line 66) | @Bean
    method authorizationController (line 73) | @Bean
    method userTokenController (line 78) | @Bean
    method bearerTokenParser (line 84) | @Bean
    class BasicAuthorizationConfiguration (line 91) | @Configuration
      method basicAuthorizationTokenParser (line 96) | @Bean
    method authorizationLoginLoggerInfoHandler (line 105) | @Bean

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/BasicAuthorizationTokenParser.java
  class BasicAuthorizationTokenParser (line 16) | public class BasicAuthorizationTokenParser implements UserTokenForTypePa...
    method getTokenType (line 22) | @Override
    method BasicAuthorizationTokenParser (line 27) | public BasicAuthorizationTokenParser(AuthenticationManager authenticat...
    method parseToken (line 32) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/WebMvcAuthorizingConfiguration.java
  class WebMvcAuthorizingConfiguration (line 20) | @AutoConfiguration
    method webUserTokenInterceptorConfigurer (line 24) | @Bean
    method userOnSignIn (line 39) | @Bean
    method userOnSignOut (line 44) | @Bean
    method servletUserTokenGenPar (line 49) | @SuppressWarnings("all")
    method userTokenParser (line 55) | @Bean
    method sessionIdUserTokenGenerator (line 61) | @Bean

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/AopAuthorizeDefinitionParser.java
  class AopAuthorizeDefinitionParser (line 19) | public class AopAuthorizeDefinitionParser {
    method AopAuthorizeDefinitionParser (line 39) | AopAuthorizeDefinitionParser(Class<?> targetClass, Method method) {
    method loadAnnotations (line 55) | private Set<Annotation> loadAnnotations(AnnotatedElement element) {
    method initClassAnnotation (line 72) | private void initClassAnnotation() {
    method initMethodAnnotation (line 83) | private void initMethodAnnotation() {
    method parse (line 109) | AopAuthorizeDefinition parse() {
    method getAnnotationByType (line 121) | private <T extends Annotation> Stream<T> getAnnotationByType(Class<T> ...

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java
  class DefaultBasicAuthorizeDefinition (line 26) | @Getter
    method isEmpty (line 48) | @Override
    method allowAnonymous (line 53) | @Override
    method from (line 58) | public static AopAuthorizeDefinition from(Class<?> targetClass, Method...
    method putAnnotation (line 64) | public void putAnnotation(Dimensions ann) {
    method putAnnotation (line 71) | public void putAnnotation(Authorize ann) {
    method putAnnotation (line 89) | public void putAnnotation(Dimension ann) {
    method putAnnotation (line 101) | public void putAnnotation(Resource ann) {
    method putAnnotation (line 117) | public ResourceActionDefinition putAnnotation(ResourceDefinition defin...
    method putAnnotation (line 128) | public void putAnnotation(ResourceActionDefinition definition, DataAcc...

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/EmptyAuthorizeDefinition.java
  class EmptyAuthorizeDefinition (line 12) | @NoArgsConstructor(access = AccessLevel.PRIVATE)
    method getResources (line 18) | @Override
    method getDimensions (line 23) | @Override
    method getMessage (line 29) | @Override
    method getPhased (line 35) | @Override
    method isEmpty (line 41) | @Override
    method getTargetClass (line 46) | @Override
    method getTargetMethod (line 51) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/MergedAuthorizeDefinition.java
  class MergedAuthorizeDefinition (line 12) | @Getter

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationInfo.java
  class EmbedAuthenticationInfo (line 41) | @Getter
    class PermissionInfo (line 61) | @Getter
    method toAuthentication (line 73) | public Authentication toAuthentication(DataAccessConfigBuilderFactory ...

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationManager.java
  class EmbedAuthenticationManager (line 19) | @Order(Ordered.HIGHEST_PRECEDENCE)
    method authenticate (line 25) | @Override
    method getByUserId (line 31) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationProperties.java
  class EmbedAuthenticationProperties (line 42) | @Getter
    method afterPropertiesSet (line 56) | @Override
    method authenticate (line 66) | public Authentication authenticate(AuthenticationRequest request) {
    method getAuthentication (line 86) | public Optional<Authentication> getAuthentication(String userId) {

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedReactiveAuthenticationManager.java
  class EmbedReactiveAuthenticationManager (line 19) | @Order(10)
    method authenticate (line 25) | @Override
    method getByUserId (line 40) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/handler/AuthorizationLoginLoggerInfoHandler.java
  class AuthorizationLoginLoggerInfoHandler (line 13) | public class AuthorizationLoginLoggerInfoHandler {
    method fillLoggerInfoAuth (line 15) | @EventListener

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/handler/AuthorizingHandler.java
  type AuthorizingHandler (line 11) | public interface AuthorizingHandler {
    method handRBAC (line 13) | void handRBAC(AuthorizingContext context);
    method handRBACAsync (line 15) | default Mono<Void> handRBACAsync(AuthorizingContext context) {
    method handleDataAccess (line 19) | @Deprecated
    method handle (line 22) | @Deprecated

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/handler/DefaultAuthorizingHandler.java
  class DefaultAuthorizingHandler (line 24) | @Slf4j
    method DefaultAuthorizingHandler (line 31) | public DefaultAuthorizingHandler(DataAccessController dataAccessContro...
    method DefaultAuthorizingHandler (line 35) | public DefaultAuthorizingHandler() {
    method setDataAccessController (line 38) | public void setDataAccessController(DataAccessController dataAccessCon...
    method setEventPublisher (line 42) | @Autowired
    method handRBAC (line 47) | @Override
    method handRBACAsync (line 57) | @Override
    method handleEventAsync (line 70) | private Mono<Boolean> handleEventAsync(AuthorizingContext context, Han...
    method handleEvent (line 89) | @SneakyThrows
    method handleDataAccess (line 108) | @Deprecated
    method handleRBAC (line 115) | protected void handleRBAC(Authentication authentication, AuthorizeDefi...
    method hasDimensions (line 137) | private boolean hasDimensions(Authentication auth, String type, Logica...

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/handler/UserAllowPermissionHandler.java
  class UserAllowPermissionHandler (line 33) | @ConfigurationProperties("hsweb.authorize")
    method handEvent (line 42) | @EventListener

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/AuthorizationController.java
  class AuthorizationController (line 51) | @RestController
    method me (line 63) | @GetMapping("/me")
    method authorizeByJson (line 71) | @PostMapping(value = "/login", consumes = MediaType.APPLICATION_JSON_V...
    method doLogin (line 83) | @SneakyThrows
    method doAuthorize (line 126) | private Mono<Authentication> doAuthorize(AuthorizationBeforeEvent even...

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/AuthorizedToken.java
  type AuthorizedToken (line 11) | public interface AuthorizedToken extends ParsedToken {
    method getUserId (line 16) | String getUserId();
    method getAuthentication (line 24) | default Authentication getAuthentication() {
    method getMaxInactiveInterval (line 31) | default long getMaxInactiveInterval() {

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/BearerTokenParser.java
  class BearerTokenParser (line 8) | public class BearerTokenParser implements ReactiveUserTokenParser {
    method parseToken (line 9) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/DefaultUserTokenGenPar.java
  class DefaultUserTokenGenPar (line 16) | @Getter
    method getTokenType (line 27) | @Override
    method generate (line 32) | @Override
    method parseToken (line 59) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/GeneratedToken.java
  type GeneratedToken (line 11) | public interface GeneratedToken extends Serializable {
    method getResponse (line 17) | Map<String, Object> getResponse();
    method getToken (line 22) | String getToken();
    method getType (line 27) | String getType();
    method getTimeout (line 32) | long getTimeout();

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/ReactiveUserTokenController.java
  class ReactiveUserTokenController (line 21) | @RestController
    method setUserTokenManager (line 31) | @Autowired
    method setAuthenticationManager (line 37) | @Autowired
    method resetToken (line 43) | @GetMapping("/user-token/reset")
    method checkExpiredToken (line 53) | @PutMapping("/user-token/check")
    method getByToken (line 62) | @GetMapping("/user-token/token/{token}")
    method getByUserId (line 69) | @GetMapping("/user-token/user/{userId}")
    method userIsLoggedIn (line 76) | @GetMapping("/user-token/user/{userId}/logged")
    method tokenIsLoggedIn (line 83) | @GetMapping("/user-token/token/{token}/logged")
    method totalUser (line 90) | @GetMapping("/user-token/user/total")
    method totalToken (line 97) | @GetMapping("/user-token/token/total")
    method allLoggedUser (line 104) | @GetMapping("/user-token")
    method signOutByUserId (line 111) | @DeleteMapping("/user-token/user/{userId}")
    method signOutByToken (line 118) | @DeleteMapping("/user-token/token/{token}")
    method changeUserState (line 126) | @SaveAction
    method changeTokenState (line 134) | @PutMapping("/user-token/token/{token}/{state}")
    method touch (line 148) | @GetMapping("/user-token/{token}/touch")
    method userAuthInfo (line 155) | @GetMapping("/user-auth/{userId}")

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/ReactiveUserTokenGenerator.java
  type ReactiveUserTokenGenerator (line 5) | public interface ReactiveUserTokenGenerator {
    method getTokenType (line 7) | String getTokenType();
    method generate (line 9) | GeneratedToken generate(Authentication authentication);

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/ReactiveUserTokenParser.java
  type ReactiveUserTokenParser (line 7) | public interface ReactiveUserTokenParser {
    method parseToken (line 8) | Mono<ParsedToken> parseToken(ServerWebExchange exchange);

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/ServletUserTokenGenPar.java
  class ServletUserTokenGenPar (line 16) | @Getter
    method getSupportTokenType (line 23) | @Override
    method generate (line 29) | @Override
    method parseToken (line 56) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/SessionIdUserTokenGenerator.java
  class SessionIdUserTokenGenerator (line 14) | public class SessionIdUserTokenGenerator implements UserTokenGenerator, ...
    method getSupportTokenType (line 18) | @Override
    method generate (line 23) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/SessionIdUserTokenParser.java
  class SessionIdUserTokenParser (line 16) | public class SessionIdUserTokenParser implements UserTokenParser {
    method setUserTokenManager (line 21) | @Autowired
    method parseToken (line 26) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserOnSignIn.java
  class UserOnSignIn (line 25) | public class UserOnSignIn {
    method UserOnSignIn (line 42) | public UserOnSignIn(UserTokenManager userTokenManager) {
    method setDefaultTokenType (line 46) | public void setDefaultTokenType(String defaultTokenType) {
    method setUserTokenGenerators (line 50) | @Autowired(required = false)
    method onApplicationEvent (line 55) | @EventListener

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserOnSignOut.java
  class UserOnSignOut (line 13) | public class UserOnSignOut {
    method UserOnSignOut (line 16) | public UserOnSignOut(UserTokenManager userTokenManager) {
    method geToken (line 20) | private String geToken() {
    method onApplicationEvent (line 25) | @EventListener

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenForTypeParser.java
  type UserTokenForTypeParser (line 3) | public interface UserTokenForTypeParser extends UserTokenParser {
    method getTokenType (line 4) | String getTokenType();

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenGenerator.java
  type UserTokenGenerator (line 11) | public interface UserTokenGenerator {
    method getSupportTokenType (line 16) | String getSupportTokenType();
    method generate (line 18) | GeneratedToken generate(Authentication authentication);

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenParser.java
  type UserTokenParser (line 14) | public interface UserTokenParser {
    method parseToken (line 15) | ParsedToken parseToken(HttpServletRequest request);

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/UserTokenWebFilter.java
  class UserTokenWebFilter (line 26) | @Slf4j
    method filter (line 37) | @Override
    method handleUserSign (line 54) | @EventListener
    method register (line 87) | public void register(ReactiveUserTokenGenerator generator) {
    method register (line 91) | public void register(ReactiveUserTokenParser parser) {

FILE: hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/web/WebUserTokenInterceptor.java
  class WebUserTokenInterceptor (line 26) | public class WebUserTokenInterceptor implements HandlerInterceptor {
    method WebUserTokenInterceptor (line 38) | public WebUserTokenInterceptor(UserTokenManager userTokenManager,
    method preHandle (line 51) | @Override
    method afterCompletion (line 99) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/aop/AopAuthorizingControllerTest.java
  class AopAuthorizingControllerTest (line 22) | @RunWith(SpringJUnit4ClassRunner.class)
    method testAccessDeny (line 29) | @Test

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/aop/FluxTestController.java
  class FluxTestController (line 10) | @RestController
    method getUser (line 14) | @GetMapping

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/aop/TestApplication.java
  class TestApplication (line 9) | @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
    method main (line 14) | public static void main(String[] args) {

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/aop/TestController.java
  class TestController (line 16) | @RestController
    method getUser (line 20) | @QueryAction
    method getUserAfter (line 27) | @QueryAction
    method queryUser (line 34) | @QueryAction
    method queryUser (line 41) | @QueryAction
    method queryUserByDimension (line 47) | @QueryAction
    method save (line 53) | @SaveAction
    method update (line 59) | @Override
    method getRepository (line 68) | @Override

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/aop/TestEntity.java
  class TestEntity (line 11) | @Getter

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinitionTest.java
  class DefaultBasicAuthorizeDefinitionTest (line 12) | public class DefaultBasicAuthorizeDefinitionTest {
    method testCustomAnn (line 15) | @Test
    method testNoMerge (line 35) | @Test
    class TestController (line 44) | @Resource(id = "test", name = "测试")
      method noMerge (line 47) | @Authorize(merge = false)
    type GenericController (line 55) | public interface GenericController {
      method test (line 57) | @CreateAction

FILE: hsweb-authorization/hsweb-authorization-basic/src/test/java/org/hswebframework/web/authorization/basic/web/CompositeReactiveAuthenticationManagerTest.java
  class CompositeReactiveAuthenticationManagerTest (line 15) | public class CompositeReactiveAuthenticationManagerTest {
    method test (line 17) | @Test

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/ErrorType.java
  type ErrorType (line 28) | public enum ErrorType {
    method ErrorType (line 75) | ErrorType(int code) {
    method ErrorType (line 80) | ErrorType(int code, String message) {
    method message (line 85) | public String message() {
    method code (line 92) | public int code() {
    method throwThis (line 96) | public <T> T throwThis(Function<ErrorType, ? extends RuntimeException>...
    method throwThis (line 100) | public <T> T throwThis(BiFunction<ErrorType, String, ? extends Runtime...
    method fromCode (line 104) | public static Optional<ErrorType> fromCode(int code) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/GrantType.java
  type GrantType (line 25) | public interface GrantType {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/OAuth2Constants.java
  type OAuth2Constants (line 24) | public interface OAuth2Constants {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/OAuth2Exception.java
  class OAuth2Exception (line 7) | @Getter
    method OAuth2Exception (line 11) | public OAuth2Exception(ErrorType type) {
    method OAuth2Exception (line 16) | public OAuth2Exception(String message, Throwable cause, ErrorType type) {
    class NoStackTrace (line 24) | public static class NoStackTrace extends OAuth2Exception {
      method NoStackTrace (line 25) | public NoStackTrace(ErrorType type) {
      method NoStackTrace (line 29) | public NoStackTrace(String message, Throwable cause, ErrorType type) {
      method fillInStackTrace (line 33) | @Override

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/ResponseType.java
  type ResponseType (line 26) | public interface ResponseType {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/AccessToken.java
  class AccessToken (line 7) | @Getter

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/AccessTokenManager.java
  type AccessTokenManager (line 12) | public interface AccessTokenManager {
    method getAuthenticationByToken (line 20) | Mono<Authentication> getAuthenticationByToken(String accessToken);
    method createAccessToken (line 30) | Mono<AccessToken> createAccessToken(String clientId,
    method refreshAccessToken (line 41) | Mono<AccessToken> refreshAccessToken(String clientId, String refreshTo...
    method removeToken (line 50) | Mono<Void> removeToken(String clientId, String token);
    method cancelGrant (line 59) | Mono<Void> cancelGrant(String clientId, String userId);

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2Client.java
  class OAuth2Client (line 12) | @Getter
    method validateRedirectUri (line 33) | public void validateRedirectUri(String redirectUri) {
    method validateSecret (line 39) | public void validateSecret(String secret) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2ClientManager.java
  type OAuth2ClientManager (line 5) | public interface OAuth2ClientManager {
    method getClient (line 7) | Mono<OAuth2Client> getClient(String clientId);

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2GrantService.java
  type OAuth2GrantService (line 8) | public interface OAuth2GrantService {
    method authorizationCode (line 10) | AuthorizationCodeGranter authorizationCode();
    method clientCredential (line 12) | ClientCredentialGranter clientCredential();
    method refreshToken (line 14) | RefreshTokenGranter refreshToken();

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2Granter.java
  type OAuth2Granter (line 3) | public interface OAuth2Granter {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2Properties.java
  class OAuth2Properties (line 9) | @ConfigurationProperties(prefix = "hsweb.oauth2")

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2Request.java
  class OAuth2Request (line 11) | @Getter
    method getParameter (line 19) | public Optional<String> getParameter(String key) {
    method with (line 24) | public OAuth2Request with(String parameter, String key) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2Response.java
  class OAuth2Response (line 12) | @Getter
    method with (line 18) | public OAuth2Response with(String parameter, Object key) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/OAuth2ServerAutoConfiguration.java
  class OAuth2ServerAutoConfiguration (line 28) | @AutoConfiguration
    class ReactiveOAuth2AccessTokenParserConfiguration (line 33) | @Configuration(proxyBeanMethods = false)
    class ReactiveOAuth2ServerAutoConfiguration (line 46) | @Configuration(proxyBeanMethods = false)
      method accessTokenManager (line 51) | @Bean
      method clientCredentialGranter (line 63) | @Bean
      method authorizationCodeGranter (line 71) | @Bean
      method refreshTokenGranter (line 79) | @Bean
      method oAuth2GrantService (line 85) | @Bean
      method oAuth2AuthorizeController (line 98) | @Bean

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/ScopePredicate.java
  type ScopePredicate (line 5) | @FunctionalInterface
    method test (line 8) | boolean test(String permission, String... actions);

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/auth/ReactiveOAuth2AccessTokenParser.java
  class ReactiveOAuth2AccessTokenParser (line 15) | @AllArgsConstructor
    method parseToken (line 20) | @Override
    method get (line 41) | @Override
    method get (line 46) | @Override

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/code/AuthorizationCodeCache.java
  class AuthorizationCodeCache (line 11) | @Getter

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/code/AuthorizationCodeGranter.java
  type AuthorizationCodeGranter (line 13) | public interface AuthorizationCodeGranter extends OAuth2Granter {
    method requestCode (line 21) | Mono<AuthorizationCodeResponse> requestCode(AuthorizationCodeRequest r...
    method requestToken (line 29) | Mono<AccessToken> requestToken(AuthorizationCodeTokenRequest request);

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/code/AuthorizationCodeRequest.java
  class AuthorizationCodeRequest (line 12) | @Getter
    method AuthorizationCodeRequest (line 20) | public AuthorizationCodeRequest(OAuth2Client client,

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/code/AuthorizationCodeResponse.java
  class AuthorizationCodeResponse (line 14) | @Getter
    method AuthorizationCodeResponse (line 20) | public AuthorizationCodeResponse(String code) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/code/AuthorizationCodeTokenRequest.java
  class AuthorizationCodeTokenRequest (line 13) | @Getter
    method AuthorizationCodeTokenRequest (line 19) | public AuthorizationCodeTokenRequest(OAuth2Client client, Map<String, ...
    method code (line 24) | public Optional<String> code() {
    method scope (line 28) | public Optional<String> scope() {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/code/DefaultAuthorizationCodeGranter.java
  class DefaultAuthorizationCodeGranter (line 26) | @AllArgsConstructor
    method DefaultAuthorizationCodeGranter (line 35) | @SuppressWarnings("all")
    method requestCode (line 49) | @Override
    method getRedisKey (line 77) | private String getRedisKey(String code) {
    method requestToken (line 81) | @Override

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/credential/ClientCredentialGranter.java
  type ClientCredentialGranter (line 7) | public interface ClientCredentialGranter extends OAuth2Granter {
    method requestToken (line 15) | Mono<AccessToken> requestToken(ClientCredentialRequest request);

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/credential/ClientCredentialRequest.java
  class ClientCredentialRequest (line 9) | @Getter
    method ClientCredentialRequest (line 14) | public ClientCredentialRequest(OAuth2Client client, Map<String, String...

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/credential/DefaultClientCredentialGranter.java
  class DefaultClientCredentialGranter (line 13) | @AllArgsConstructor
    method requestToken (line 22) | @Override

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/event/OAuth2GrantedEvent.java
  class OAuth2GrantedEvent (line 18) | @Getter

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/impl/CompositeOAuth2GrantService.java
  class CompositeOAuth2GrantService (line 10) | @Getter
    method authorizationCode (line 20) | @Override
    method clientCredential (line 25) | @Override
    method refreshToken (line 30) | @Override

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/impl/RedisAccessToken.java
  class RedisAccessToken (line 12) | @Getter
    method storeAuth (line 30) | public boolean storeAuth() {
    method toAccessToken (line 40) | public AccessToken toAccessToken(int expiresIn) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/impl/RedisAccessTokenManager.java
  class RedisAccessTokenManager (line 25) | public class RedisAccessTokenManager implements AccessTokenManager {
    method RedisAccessTokenManager (line 39) | public RedisAccessTokenManager(ReactiveRedisOperations<String, RedisAc...
    method RedisAccessTokenManager (line 45) | @SuppressWarnings("all")
    method getAuthenticationByToken (line 59) | @Override
    method createTokenRedisKey (line 67) | private String createTokenRedisKey(String clientId, String token) {
    method createUserTokenRedisKey (line 71) | private String createUserTokenRedisKey(RedisAccessToken token) {
    method createUserTokenRedisKey (line 75) | private String createUserTokenRedisKey(String clientId, String userId) {
    method createRefreshTokenRedisKey (line 80) | private String createRefreshTokenRedisKey(String clientId, String toke...
    method createSingletonTokenRedisKey (line 84) | private String createSingletonTokenRedisKey(String clientId) {
    method doCreateAccessToken (line 88) | private Mono<RedisAccessToken> doCreateAccessToken(String clientId, Au...
    method storeAuthToken (line 96) | private Mono<Void> storeAuthToken(RedisAccessToken token) {
    method storeToken (line 117) | private Mono<Void> storeToken(RedisAccessToken token) {
    method doCreateSingletonAccessToken (line 135) | private Mono<AccessToken> doCreateSingletonAccessToken(String clientId...
    method createAccessToken (line 152) | @Override
    method refreshAccessToken (line 161) | @Override
    method removeToken (line 198) | @Override
    method cancelGrant (line 208) | @Override
    method createTokenType (line 248) | private String createTokenType(String clientId) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/refresh/DefaultRefreshTokenGranter.java
  class DefaultRefreshTokenGranter (line 10) | @AllArgsConstructor
    method requestToken (line 15) | @Override

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/refresh/RefreshTokenGranter.java
  type RefreshTokenGranter (line 7) | public interface RefreshTokenGranter {
    method requestToken (line 15) | Mono<AccessToken> requestToken(RefreshTokenRequest request);

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/refresh/RefreshTokenRequest.java
  class RefreshTokenRequest (line 11) | @Getter
    method RefreshTokenRequest (line 15) | public RefreshTokenRequest(OAuth2Client client, Map<String, String> pa...
    method refreshToken (line 20) | public Optional<String> refreshToken(){

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/utils/OAuth2ScopeUtils.java
  class OAuth2ScopeUtils (line 17) | public class OAuth2ScopeUtils {
    method createScopePredicate (line 19) | public static ScopePredicate createScopePredicate(String scopeStr) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/main/java/org/hswebframework/web/oauth2/server/web/OAuth2AuthorizeController.java
  class OAuth2AuthorizeController (line 42) | @RestController
    method authorizeByCode (line 52) | @GetMapping(value = "/authorize", params = "response_type=code")
    method requestTokenByCode (line 82) | @GetMapping(value = "/token")
    method requestTokenByCode (line 103) | @PostMapping(value = "/token", consumes = MediaType.APPLICATION_FORM_U...
    method getClientIdAndClientSecret (line 126) | private Tuple2<String, String> getClientIdAndClientSecret(Map<String, ...
    type GrantType (line 138) | public enum GrantType {
      method requestToken (line 140) | @Override
      method requestToken (line 148) | @Override
      method requestToken (line 156) | @Override
      method requestToken (line 164) | abstract Mono<AccessToken> requestToken(OAuth2GrantService service, ...
      method of (line 166) | static GrantType of(String name) {
    method urlEncode (line 175) | @SneakyThrows
    method buildRedirect (line 180) | static String buildRedirect(String redirectUri, Map<String, Object> pa...
    method getOAuth2Client (line 191) | private Mono<OAuth2Client> getOAuth2Client(String id) {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/test/java/org/hswebframework/web/oauth2/server/OAuth2ClientTest.java
  class OAuth2ClientTest (line 7) | public class OAuth2ClientTest {
    method test (line 9) | @Test

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/test/java/org/hswebframework/web/oauth2/server/RedisHelper.java
  class RedisHelper (line 7) | public class RedisHelper {

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/test/java/org/hswebframework/web/oauth2/server/code/DefaultAuthorizationCodeGranterTest.java
  class DefaultAuthorizationCodeGranterTest (line 15) | @Ignore
    method testRequestToken (line 18) | @Test

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/test/java/org/hswebframework/web/oauth2/server/impl/RedisAccessTokenManagerTest.java
  class RedisAccessTokenManagerTest (line 14) | @Ignore
    method testCreateAccessToken (line 17) | @Test
    method testRefreshToken (line 33) | @Test
    method testCreateSingletonAccessToken (line 50) | @Test

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/test/java/org/hswebframework/web/oauth2/server/utils/OAuth2ScopeUtilsTest.java
  class OAuth2ScopeUtilsTest (line 9) | public class OAuth2ScopeUtilsTest {
    method testEmpty (line 12) | @Test
    method testScope (line 18) | @Test

FILE: hsweb-authorization/hsweb-authorization-oauth2/src/test/java/org/hswebframework/web/oauth2/server/web/OAuth2AuthorizeControllerTest.java
  class OAuth2AuthorizeControllerTest (line 9) | public class OAuth2AuthorizeControllerTest {
    method testBuildRedirect (line 11) | @Test
    method testBuildRedirectParam (line 18) | @Test

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/Entity.java
  type Entity (line 34) | public interface Entity extends Serializable {
    method tryValidate (line 42) | default void tryValidate(Class<?>... groups) {
    method tryValidate (line 52) | default void tryValidate(String property, Class<?>... groups) {
    method tryValidate (line 62) | default <T> void tryValidate(StaticMethodReferenceColumn<T> property, ...
    method copyTo (line 74) | default <T> T copyTo(Class<T> target, String... ignoreProperties) {
    method copyTo (line 86) | default <T> T copyTo(T target, String... ignoreProperties) {
    method copyFrom (line 98) | @SuppressWarnings("all")

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/EntityFactory.java
  type EntityFactory (line 30) | public interface EntityFactory {
    method newInstance (line 43) | <T> T newInstance(Class<T> entityClass);
    method newInstance (line 59) | <T> T newInstance(Class<T> entityClass, Class<? extends T> defaultClass);
    method newInstance (line 74) | <T> T newInstance(Class<T> entityClass, Supplier<? extends T> defaultF...
    method newInstance (line 86) | @Deprecated
    method newInstance (line 102) | @Deprecated
    method getInstanceType (line 119) | default <T> Class<T> getInstanceType(Class<T> entityClass) {
    method getInstanceType (line 123) | <T> Class<T> getInstanceType(Class<T> entityClass, boolean autoRegister);
    method copyProperties (line 134) | @Deprecated

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/EntityFactoryHolder.java
  class EntityFactoryHolder (line 9) | @Component
    method get (line 15) | public static EntityFactory get() {
    method getMappedType (line 23) | public static <T> Class<T> getMappedType(Class<T> type) {
    method newInstance (line 30) | public static <T> T newInstance(Class<T> type,

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/EntityFactoryHolderConfiguration.java
  class EntityFactoryHolderConfiguration (line 9) | @AutoConfiguration
    method entityFactoryHolder (line 13) | @Bean

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/ExtendableEntity.java
  class ExtendableEntity (line 33) | @Getter
    method getExtensions (line 44) | @JsonIgnore
    method setExtensions (line 49) | public void setExtensions(Map<String, Object> extensions) {
    method extensions (line 53) | @Override
    method getExtension (line 59) | @Override
    method setExtension (line 65) | @Override

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/ExtendableTreeSortSupportEntity.java
  class ExtendableTreeSortSupportEntity (line 33) | @Getter

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/GenericEntity.java
  class GenericEntity (line 36) | @Getter
    method toString (line 46) | public String toString(String... ignoreProperty) {
    method toString (line 50) | @Override

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/GenericI18nEntity.java
  class GenericI18nEntity (line 16) | @Getter
    method getI18nMessages (line 36) | @Override

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/GenericTreeSortSupportEntity.java
  class GenericTreeSortSupportEntity (line 33) | @Getter

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/PagerResult.java
  class PagerResult (line 45) | @Getter
    method empty (line 56) | public static <E> PagerResult<E> empty() {
    method of (line 68) | @SuppressWarnings("all")
    method of (line 86) | public static <E> PagerResult<E> of(int total, List<E> list, QueryPara...
    method PagerResult (line 105) | public PagerResult() {
    method PagerResult (line 108) | public PagerResult(int total, List<E> data) {

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/QueryParamEntity.java
  class QueryParamEntity (line 48) | @Getter
    method isForUpdate (line 77) | @Override
    method getThinkPageIndex (line 83) | @Override
    method getPageIndexTmp (line 89) | @Override
    method getIncludes (line 95) | @Override
    method getExcludes (line 102) | @Override
    method of (line 116) | public static QueryParamEntity of(Param param) {
    method of (line 128) | public static QueryParamEntity of() {
    method of (line 136) | public static QueryParamEntity of(String field, Object value) {
    method newQuery (line 143) | public static <T> Query<T, QueryParamEntity> newQuery() {
    method toQuery (line 150) | public <T> Query<T, QueryParamEntity> toQuery() {
    method toNestQuery (line 167) | public <T> Query<T, QueryParamEntity> toNestQuery() {
    method toNestQuery (line 184) | public <T> Query<T, QueryParamEntity> toNestQuery(Consumer<Query<T, Qu...
    method setOrderBy (line 207) | public void setOrderBy(String orderBy) {
    method setWhere (line 221) | public void setWhere(String where) {
    method setFilter (line 236) | public void setFilter(Map<String, Object> filter) {
    method getTerms (line 243) | @Override
    method noPaging (line 256) | @SuppressWarnings("unchecked")
    method doNotSort (line 262) | public QueryParamEntity doNotSort() {
    method clone (line 267) | @Override

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/RecordCreationEntity.java
  type RecordCreationEntity (line 13) | public interface RecordCreationEntity extends Entity {
    method getCreatorId (line 18) | String getCreatorId();
    method setCreatorId (line 25) | void setCreatorId(String creatorId);
    method getCreateTime (line 33) | Long getCreateTime();
    method setCreateTime (line 41) | void setCreateTime(Long createTime);
    method setCreatorName (line 48) | default void setCreatorName(String name) {
    method setCreateTimeNow (line 55) | default void setCreateTimeNow() {
    method getCreatorIdProperty (line 62) | @JsonIgnore

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/RecordModifierEntity.java
  type RecordModifierEntity (line 13) | public interface RecordModifierEntity extends Entity {
    method getModifierId (line 23) | String getModifierId();
    method setModifierId (line 30) | void setModifierId(String modifierId);
    method setModifierName (line 37) | default void setModifierName(String modifierName) {
    method getModifyTime (line 44) | Long getModifyTime();
    method setModifyTime (line 52) | void setModifyTime(Long modifyTime);
    method setModifyTimeNow (line 57) | default void setModifyTimeNow() {
    method getModifierIdProperty (line 64) | @JsonIgnore
    method markDoNotUpdate (line 75) | static Context markDoNotUpdate(Context ctx) {
    method isDoNotUpdate (line 85) | static boolean isDoNotUpdate(ContextView ctx) {

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/SortSupportEntity.java
  type SortSupportEntity (line 29) | public interface SortSupportEntity extends Comparable<SortSupportEntity>...
    method getSortIndex (line 34) | Long getSortIndex();
    method setSortIndex (line 41) | void setSortIndex(Long sortIndex);
    method compareTo (line 43) | @Override

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/TermExpressionParser.java
  class TermExpressionParser (line 24) | public class TermExpressionParser {
    method parse (line 44) | public static List<Term> parse(Map<String, Object> map) {
    method parse (line 83) | @SneakyThrows
    method parseOrder (line 244) | public static List<Sort> parseOrder(String expression) {
    method convertTermType (line 257) | private static String convertTermType(String termType) {

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/TransactionManagers.java
  type TransactionManagers (line 3) | public interface TransactionManagers {

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/TreeSortSupportEntity.java
  type TreeSortSupportEntity (line 23) | public interface TreeSortSupportEntity<PK> extends TreeSupportEntity<PK>...

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/TreeSupportEntity.java
  type TreeSupportEntity (line 39) | @SuppressWarnings("all")
    method getId (line 47) | PK getId();
    method setId (line 54) | void setId(PK id);
    method getPath (line 63) | String getPath();
    method setPath (line 71) | void setPath(String path);
    method getParentId (line 78) | PK getParentId();
    method setParentId (line 85) | void setParentId(PK parentId);
    method getLevel (line 92) | Integer getLevel();
    method setLevel (line 99) | void setLevel(Integer level);
    method getChildren (line 108) | <T extends TreeSupportEntity<PK>> List<T> getChildren();
    method tryValidate (line 110) | @Override
    method getParentPath (line 124) | static String getParentPath(String path) {
    method forEach (line 131) | static <T extends TreeSupportEntity> void forEach(Collection<T> list, ...
    method expandTree2List (line 147) | static <T extends TreeSupportEntity<PK>, PK> List<T> expandTree2List(T...
    method expandTree2List (line 154) | static <T extends TreeSupportEntity<PK>, PK> void expandTree2List(T pa...
    method expandTree2List (line 170) | static <T extends TreeSupportEntity<PK>, PK> void expandTree2List(T ro...
    method list2tree (line 248) | static <N extends TreeSupportEntity<PK>, PK> List<N> list2tree(Collect...
    method list2tree (line 253) | static <N extends TreeSupportEntity<PK>, PK> List<N> list2tree(Collect...
    method list2tree (line 269) | static <N extends TreeSupportEntity<PK>, PK> List<N> list2tree(final C...
    type TreeHelper (line 285) | interface TreeHelper<T, PK> {
      method getChildren (line 292) | List<T> getChildren(PK parentId);
      method getNode (line 300) | T getNode(PK id);

FILE: hsweb-commons/hsweb-commons-api/src/main/java/org/hswebframework/web/api/crud/entity/TreeUtils.java
  class TreeUtils (line 11) | public class TreeUtils {
    method treeToList (line 21) | public static <N> List<N> treeToList(Collection<N> nodeList,
    method flatTree (line 36) | public static <N> void flatTree(Collection<N> nodeList,
    method list2tree (line 70) | public static <N, PK> List<N> list2tree(Collection<N> dataList,
    method list2tree (line 95) | public static <N, PK> List<N> list2tree(Collection<N> dataList,

FILE: hsweb-commons/hsweb-commons-api/src/test/java/org/hswebframework/web/api/crud/entity/ExtendableEntityTest.java
  class ExtendableEntityTest (line 9) | public class ExtendableEntityTest {
    method testJson (line 12) | @Test

FILE: hsweb-commons/hsweb-commons-api/src/test/java/org/hswebframework/web/api/crud/entity/TermExpressionParserTest.java
  class TermExpressionParserTest (line 13) | public class TermExpressionParserTest {
    method testUrl (line 15) | @Test
    method testChinese (line 29) | @Test
    method testMap (line 47) | @Test
    method test (line 75) | @Test
    method testLessThan (line 118) | @Test
    method testLessThanOrEqual (line 128) | @Test
    method testNotEqual (line 138) | @Test
    method testInOperator (line 148) | @Test
    method testNotInOperator (line 157) | @Test
    method testBetweenOperator (line 166) | @Test
    method testIsNull (line 175) | @Test
    method testNotNull (line 184) | @Test
    method testIsEmpty (line 193) | @Test
    method testNotEmpty (line 202) | @Test
    method testMultipleAndConditions (line 211) | @Test
    method testMultipleOrConditions (line 224) | @Test
    method testNestedMultipleLevels (line 233) | @Test
    method testSpecialCharactersInValue (line 243) | @Test
    method testNumericValues (line 252) | @Test
    method testEmptyStringValue (line 264) | @Test
    method testWhitespaceHandling (line 272) | @Test
    method testMapWithComplexNestedConditions (line 283) | @Test
    method testMapWithMultipleTermTypes (line 295) | @Test
    method testMixedAndOrWithoutParentheses (line 312) | @Test

FILE: hsweb-commons/hsweb-commons-api/src/test/java/org/hswebframework/web/api/crud/entity/TreeUtilsTest.java
  class TreeUtilsTest (line 17) | public class TreeUtilsTest {
    method testTreeToList (line 20) | @Test
    method testListToTree (line 35) | @Test
    class Node (line 71) | @Getter

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/AutoDDLProcessor.java
  class AutoDDLProcessor (line 29) | @Getter
    method afterPropertiesSet (line 53) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/CompositeEntityTableMetadataResolver.java
  class CompositeEntityTableMetadataResolver (line 14) | public class CompositeEntityTableMetadataResolver implements EntityTable...
    method addParser (line 20) | public void addParser(EntityTableMetadataParser resolver) {
    method resolve (line 24) | @Override
    method doResolve (line 30) | private RDBTableMetadata doResolve(Class<?> entityClass) {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/DefaultEntityResultWrapperFactory.java
  class DefaultEntityResultWrapperFactory (line 10) | @AllArgsConstructor
    method getWrapper (line 15) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/DetectEntityColumnMapping.java
  class DetectEntityColumnMapping (line 12) | class DetectEntityColumnMapping implements EntityColumnMapping {
    method DetectEntityColumnMapping (line 18) | public DetectEntityColumnMapping(Class<?> type,
    method getEntityType (line 27) | @Override
    method getColumnByProperty (line 32) | @Override
    method getPropertyByColumnName (line 37) | @Override
    method getColumnByName (line 42) | @Override
    method getColumnPropertyMapping (line 47) | @Override
    method getTable (line 52) | @Override
    method reload (line 57) | @Override
    method newInstance (line 62) | @Override
    method getId (line 67) | @Override
    method getName (line 72) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/DialectProvider.java
  type DialectProvider (line 18) | public interface DialectProvider {
    method name (line 25) | String name();
    method getDialect (line 32) | Dialect getDialect();
    method getBindSymbol (line 39) | String getBindSymbol();
    method createSchema (line 47) | RDBSchemaMetadata createSchema(String name);
    method getValidationSql (line 54) | default String getValidationSql() {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/DialectProviders.java
  class DialectProviders (line 7) | public class DialectProviders {
    method all (line 20) | public static List<DialectProvider> all(){
    method lookup (line 24) | @SneakyThrows

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormConfiguration.java
  class EasyormConfiguration (line 51) | @AutoConfiguration
    method easyormEventListener (line 61) | @Bean
    method databaseMetadata (line 69) | @Bean
    method databaseOperator (line 90) | @Bean
    method queryHelper (line 97) | @Bean
    method creatorEventListener (line 122) | @Bean
    method validateEventListener (line 128) | @Bean
    method entityEventListener (line 133) | @Bean
    method defaultIdGenerator (line 145) | @Bean
    method md5Generator (line 152) | @Bean
    method snowFlakeStringIdGenerator (line 157) | @Bean
    method randomIdGenerator (line 162) | @Bean
    method currentTimeGenerator (line 167) | @Bean
    class EntityTableMetadataParserConfiguration (line 172) | @Configuration
      method defaultEntityResultWrapperFactory (line 175) | @Bean
      method entityManager (line 180) | @Bean
      method entityTableMappingResolver (line 201) | @Bean
      method jpaEntityTableMetadataParser (line 209) | @Bean

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormProperties.java
  class EasyormProperties (line 19) | @ConfigurationProperties(prefix = "easyorm")
    method setDialect (line 44) | @SneakyThrows
    method createDatabaseMetadata (line 49) | public RDBDatabaseMetadata createDatabaseMetadata() {
    method createSchema (line 66) | @SneakyThrows
    method createDialect (line 71) | @SneakyThrows
    type DialectEnum (line 76) | @Getter
      method createSchema (line 80) | @Override
      method createSchema (line 86) | @Override
      method createSchema (line 92) | @Override
      method getValidationSql (line 97) | @Override
      method createSchema (line 103) | @Override
      method createSchema (line 109) | @Override
      method createSchema (line 115) | @Override
      method createSchema (line 121) | @Override
      method createSchema (line 131) | public abstract RDBSchemaMetadata createSchema(String name);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormRepositoryRegistrar.java
  class EasyormRepositoryRegistrar (line 36) | @Slf4j
    method getResourceClassName (line 56) | private String getResourceClassName(Resource resource) {
    method doGetResources (line 67) | @SneakyThrows
    method scanEntities (line 83) | protected Set<String> scanEntities(String[] packageStr) {
    method findIdType (line 92) | private Class<?> findIdType(Class<?> entityType) {
    method registerBeanDefinitions (line 120) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EntityFactoryConfiguration.java
  class EntityFactoryConfiguration (line 11) | @AutoConfiguration
    method entityFactory (line 14) | @Bean

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EntityInfo.java
  class EntityInfo (line 8) | @Getter

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EntityResultWrapperFactory.java
  type EntityResultWrapperFactory (line 5) | public interface EntityResultWrapperFactory {
    method getWrapper (line 7) | <T> ResultWrapper<T, ?> getWrapper(Class<T> tClass);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EntityTableMetadataResolver.java
  type EntityTableMetadataResolver (line 5) | public interface EntityTableMetadataResolver {
    method resolve (line 7) | RDBTableMetadata resolve(Class<?> entityClass);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/JdbcSqlExecutorConfiguration.java
  class JdbcSqlExecutorConfiguration (line 23) | @AutoConfiguration(after = DataSourceAutoConfiguration.class,
    method transactionManager (line 29) | @Bean
    method connectionFactoryTransactionManager (line 38) | @Bean
    method createTransactionManager (line 46) | private DataSourceTransactionManager createTransactionManager(Environm...
    method syncSqlExecutor (line 52) | @Bean
    method reactiveSqlExecutor (line 58) | @Bean

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/R2dbcSqlExecutorConfiguration.java
  class R2dbcSqlExecutorConfiguration (line 17) | @AutoConfiguration
    method reactiveSqlExecutor (line 21) | @Bean
    method syncSqlExecutor (line 30) | @Bean
    method transactionUtilsSetup (line 36) | @Bean

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/ReactiveRepositoryFactoryBean.java
  class ReactiveRepositoryFactoryBean (line 13) | @Getter
    method getObject (line 29) | @Override
    method getObjectType (line 39) | @Override
    method isSingleton (line 44) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/SyncRepositoryFactoryBean.java
  class SyncRepositoryFactoryBean (line 11) | @Getter
    method getObject (line 27) | @Override
    method getObjectType (line 36) | @Override
    method isSingleton (line 41) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/TableMetadataCustomizer.java
  type TableMetadataCustomizer (line 17) | public interface TableMetadataCustomizer {
    method customColumn (line 28) | void customColumn(Class<?> entityType,
    method customTable (line 40) | void customTable(Class<?> entityType, RDBTableMetadata table);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/DefaultMapperFactory.java
  type DefaultMapperFactory (line 10) | @FunctionalInterface

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/DefaultPropertyCopier.java
  type DefaultPropertyCopier (line 8) | @FunctionalInterface

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/EntityMappingCustomizer.java
  type EntityMappingCustomizer (line 3) | public interface EntityMappingCustomizer {
    method custom (line 5) | void custom(MapperEntityFactory factory);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/MapperEntityFactory.java
  class MapperEntityFactory (line 40) | @SuppressWarnings("unchecked")
    method MapperEntityFactory (line 68) | public MapperEntityFactory() {
    method MapperEntityFactory (line 71) | public MapperEntityFactory(Map<Class<?>, Mapper<?>> realTypeMapper) {
    method addMapping (line 75) | public <T> MapperEntityFactory addMapping(Class<T> target, Supplier<? ...
    method addMappingIfAbsent (line 80) | public <T> MapperEntityFactory addMappingIfAbsent(Class<T> target, Sup...
    method addMapping (line 85) | public <T> MapperEntityFactory addMapping(Class<T> target, Mapper<? ex...
    method addMappingIfAbsent (line 90) | public <T> MapperEntityFactory addMappingIfAbsent(Class<T> target, Map...
    method addCopier (line 95) | public <S, T> MapperEntityFactory addCopier(PropertyCopier<S, T> copie...
    method addCopier (line 108) | public <S, T> MapperEntityFactory addCopier(Class<S> source, Class<T> ...
    method getCopierCacheKey (line 113) | private String getCopierCacheKey(Class<?> source, Class<?> target) {
    method copyProperties (line 117) | @Override
    method createMapper (line 136) | protected <T> Mapper<T> createMapper(Class<T> beanClass) {
    method newInstance (line 163) | @Override
    method newInstance (line 168) | @Override
    method newInstance (line 180) | @Override
    method getInstanceType (line 205) | @Override
    method setDefaultMapperFactory (line 226) | public void setDefaultMapperFactory(DefaultMapperFactory defaultMapper...
    method setDefaultPropertyCopier (line 231) | public void setDefaultPropertyCopier(DefaultPropertyCopier defaultProp...
    class Mapper (line 235) | public static class Mapper<T> {
      method Mapper (line 239) | public Mapper(Class<T> target, Supplier<T> instanceGetter) {
      method getTarget (line 244) | public Class<T> getTarget() {
      method getInstanceGetter (line 248) | public Supplier<T> getInstanceGetter() {
    method defaultMapper (line 253) | public static <T> Mapper<T> defaultMapper(Class<T> target) {
    method defaultInstanceGetter (line 257) | public static <T> Supplier<T> defaultInstanceGetter(Class<T> clazz) {
    class DefaultInstanceGetter (line 261) | static class DefaultInstanceGetter<T> implements Supplier<T> {
      method DefaultInstanceGetter (line 264) | @SneakyThrows
      method get (line 269) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/PropertyCopier.java
  type PropertyCopier (line 9) | public interface PropertyCopier<S, T> {
    method copyProperties (line 10) | T copyProperties(S source, T target);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/CompositeEventListener.java
  class CompositeEventListener (line 14) | @Getter
    method onEvent (line 20) | @Override
    method addListener (line 27) | public void addListener(EventListener eventListener) {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/CreatorEventListener.java
  class CreatorEventListener (line 33) | public class CreatorEventListener implements EventListener, Ordered {
    method getId (line 35) | @Override
    method getName (line 40) | @Override
    method onEvent (line 45) | @Override
    method doApplyCreator (line 69) | protected void doApplyCreator(ContextView ctx, EventType type, EventCo...
    method applyCreator (line 88) | public void applyCreator(Authentication auth,
    method applyCreator (line 136) | public void applyCreator(Authentication auth, EventContext context, Co...
    method getOrder (line 143) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/DefaultEntityEventListenerConfigure.java
  class DefaultEntityEventListenerConfigure (line 11) | public class DefaultEntityEventListenerConfigure implements EntityEventL...
    method enable (line 16) | @Override
    method disable (line 21) | @Override
    method enable (line 27) | @Override
    method disable (line 40) | @Override
    method getOrCreateTypeMap (line 52) | protected Map<EntityEventType, Set<EntityEventPhase>> getOrCreateTypeM...
    method getOrCreatePhaseSet (line 57) | protected Set<EntityEventPhase> getOrCreatePhaseSet(EntityEventType type,
    method initByEntity (line 62) | protected void initByEntity(Class<? extends Entity> type,
    method isEnabled (line 74) | @Override
    method isEnabled (line 80) | @Override
    method initByEntityType (line 101) | private Map<EntityEventType, Set<EntityEventPhase>> initByEntityType(C...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityBeforeCreateEvent.java
  class EntityBeforeCreateEvent (line 14) | @AllArgsConstructor
    method toString (line 22) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityBeforeDeleteEvent.java
  class EntityBeforeDeleteEvent (line 14) | @AllArgsConstructor
    method toString (line 24) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityBeforeModifyEvent.java
  class EntityBeforeModifyEvent (line 14) | @AllArgsConstructor
    method toString (line 26) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityBeforeQueryEvent.java
  class EntityBeforeQueryEvent (line 16) | @AllArgsConstructor
    method toString (line 24) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityBeforeSaveEvent.java
  class EntityBeforeSaveEvent (line 14) | @AllArgsConstructor
    method toString (line 22) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityCreatedEvent.java
  class EntityCreatedEvent (line 14) | @AllArgsConstructor
    method toString (line 22) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityDDLEvent.java
  class EntityDDLEvent (line 7) | @Getter
    method EntityDDLEvent (line 13) | public EntityDDLEvent(Object source,Class<E> type,RDBTableMetadata tab...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityDeletedEvent.java
  class EntityDeletedEvent (line 15) | @AllArgsConstructor
    method toString (line 25) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventHelper.java
  class EntityEventHelper (line 22) | public class EntityEventHelper {
    method isDoFireEvent (line 32) | public static Mono<Boolean> isDoFireEvent(boolean defaultIfEmpty) {
    method tryFireEvent (line 38) | public static Mono<Void> tryFireEvent(Supplier<Mono<Void>> task) {
    method setDoNotFireEvent (line 60) | public static <T> Mono<T> setDoNotFireEvent(Mono<T> stream) {
    method setDoNotFireEvent (line 75) | public static <T> Flux<T> setDoNotFireEvent(Flux<T> stream) {
    method publishSavedEvent (line 79) | public static <T> Mono<Void> publishSavedEvent(Object source,
    method publishModifyEvent (line 86) | public static <T extends Entity> Mono<Void> publishModifyEvent(Object ...
    method publishModifyEvent (line 103) | public static <T> Mono<Void> publishModifyEvent(Object source,
    method publishDeletedEvent (line 115) | public static <T> Mono<Void> publishDeletedEvent(Object source,
    method publishCreatedEvent (line 122) | public static <T> Mono<Void> publishCreatedEvent(Object source,
    method publishEvent (line 129) | public static <T, E extends AsyncEvent> Mono<Void> publishEvent(Object...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventListener.java
  class EntityEventListener (line 37) | @SuppressWarnings("all")
    method getId (line 54) | @Override
    method getName (line 59) | @Override
    method onEvent (line 64) | @Override
    method handleQueryBefore (line 173) | protected void handleQueryBefore(EntityColumnMapping mapping, EventCon...
    method createAfterData (line 188) | protected List<Object> createAfterData(List<Object> olds,
    method createFullMapping (line 237) | protected Map<String, Object> createFullMapping(Object old, EntityColu...
    method sendUpdateEvent (line 249) | protected Mono<Void> sendUpdateEvent(List<Object> before,
    method sendDeleteEvent (line 260) | protected Mono<Void> sendDeleteEvent(List<Object> olds,
    method prepareUpdateInstance (line 271) | protected void prepareUpdateInstance(List<Object> before, List<Object>...
    method handleUpdateAfter (line 337) | protected void handleUpdateAfter(EventContext context) {
    method handleDeleteAfter (line 356) | protected void handleDeleteAfter(EventContext context) {
    method handleUpdateBefore (line 374) | protected void handleUpdateBefore(DSLUpdate<?, ?> update, EventContext...
    method handleUpdateBefore (line 485) | protected void handleUpdateBefore(EventContext context) {
    method handleDeleteBefore (line 493) | protected void handleDeleteBefore(Class<Entity> entityType, EventConte...
    method handleSingleOperationAfter (line 548) | protected void handleSingleOperationAfter(Class clazz,
    method handleBatchOperationAfter (line 572) | protected void handleBatchOperationAfter(Class clazz,
    method handleBatchOperation (line 595) | protected void handleBatchOperation(Class clazz,
    method isEnabled (line 669) | boolean isEnabled(Class clazz, EntityEventType entityEventType, Entity...
    method handleSingleOperation (line 678) | protected void handleSingleOperation(Class clazz,
    method doAsyncEvent (line 758) | protected Mono<Void> doAsyncEvent(Supplier<Mono<Void>> eventSupplier) {
    method block (line 762) | private void block(Mono<?> mono) {
    method getOrder (line 766) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventListenerConfigure.java
  type EntityEventListenerConfigure (line 16) | public interface EntityEventListenerConfigure {
    method enable (line 24) | void enable(Class<? extends Entity> entityType);
    method disable (line 31) | void disable(Class<? extends Entity> entityType);
    method enable (line 40) | void enable(Class<? extends Entity> entityType,
    method disable (line 51) | void disable(Class<? extends Entity> entityType,
    method isEnabled (line 61) | boolean isEnabled(Class<? extends Entity> entityType);
    method isEnabled (line 71) | boolean isEnabled(Class<? extends Entity> entityType, EntityEventType ...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventListenerCustomizer.java
  type EntityEventListenerCustomizer (line 10) | public interface EntityEventListenerCustomizer {
    method customize (line 16) | void customize(EntityEventListenerConfigure configure);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventPhase.java
  type EntityEventPhase (line 3) | public enum EntityEventPhase {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventType.java
  type EntityEventType (line 3) | public enum EntityEventType {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityModifyEvent.java
  class EntityModifyEvent (line 14) | @AllArgsConstructor
    method toString (line 26) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityPrepareCreateEvent.java
  class EntityPrepareCreateEvent (line 14) | @AllArgsConstructor
    method toString (line 22) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityPrepareModifyEvent.java
  class EntityPrepareModifyEvent (line 14) | @AllArgsConstructor
    method toString (line 26) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityPrepareSaveEvent.java
  class EntityPrepareSaveEvent (line 14) | @AllArgsConstructor
    method toString (line 22) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntitySavedEvent.java
  class EntitySavedEvent (line 14) | @AllArgsConstructor
    method toString (line 22) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/SqlExpressionInvoker.java
  type SqlExpressionInvoker (line 8) | public interface SqlExpressionInvoker {
    method invoke (line 10) | Object invoke(NativeSql sql, EntityColumnMapping mapping, Map<String,O...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/ValidateEventListener.java
  class ValidateEventListener (line 18) | public class ValidateEventListener implements EventListener, Ordered {
    method getId (line 20) | @Override
    method getName (line 25) | @Override
    method onEvent (line 30) | @Override
    method tryValidate (line 49) | @SuppressWarnings("all")
    method getOrder (line 80) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/expr/AbstractSqlExpressionInvoker.java
  class AbstractSqlExpressionInvoker (line 12) | public abstract class AbstractSqlExpressionInvoker implements SqlExpress...
    method invoke (line 17) | @Override
    method compile (line 24) | protected abstract Function3<EntityColumnMapping,Object[], Map<String,...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/expr/SpelSqlExpressionInvoker.java
  class SpelSqlExpressionInvoker (line 20) | @Slf4j
    class SqlFunctions (line 25) | protected static class SqlFunctions extends HashMap<String, Object> {
      method SqlFunctions (line 29) | public SqlFunctions(EntityColumnMapping mapping, Map<String, Object>...
      method get (line 34) | @Override
      method lower (line 49) | public String lower(Object str) {
      method upper (line 53) | public String upper(Object str) {
      method ifnull (line 57) | public Object ifnull(Object nullable, Object val) {
      method substring (line 61) | public String substring(Object str, int start, int length) {
      method trim (line 65) | public String trim(Object str) {
      method concat (line 69) | public String concat(Object... args) {
      method coalesce (line 77) | public Object coalesce(Object... args) {
    method resolve (line 91) | @Override
    method overridesOperation (line 100) | @Override
    method operate (line 108) | @Override
    method compile (line 117) | @Override
    method createArguments (line 172) | protected SqlFunctions createArguments(EntityColumnMapping mapping, Ma...
    method spelError (line 176) | protected Function3<EntityColumnMapping, Object[], Map<String, Object>...
    class ExtMapAccessor (line 181) | static class ExtMapAccessor extends MapAccessor {
      method canRead (line 182) | @Override
      method read (line 187) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/exception/DatabaseExceptionAnalyzerReporter.java
  class DatabaseExceptionAnalyzerReporter (line 11) | @Slf4j
    method DatabaseExceptionAnalyzerReporter (line 14) | public DatabaseExceptionAnalyzerReporter() {
    method init (line 18) | void init() {
    method initRedis (line 46) | void initRedis(){
    method initForPgsql (line 53) | void initForPgsql() {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/CurrentTimeGenerator.java
  class CurrentTimeGenerator (line 11) | public class CurrentTimeGenerator implements DefaultValueGenerator<RDBCo...
    method getSortId (line 12) | @Override
    method generate (line 17) | @Override
    method generic (line 22) | protected Object generic(Class type) {
    method getName (line 35) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/DefaultIdGenerator.java
  class DefaultIdGenerator (line 17) | @Slf4j
    method getSortId (line 28) | @Override
    method generate (line 33) | @Override
    method getName (line 42) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/Generators.java
  type Generators (line 3) | public interface Generators {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/MD5Generator.java
  class MD5Generator (line 8) | public class MD5Generator implements DefaultValueGenerator<RDBColumnMeta...
    method getSortId (line 9) | @Override
    method generate (line 14) | @Override
    method getName (line 19) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/RandomIdGenerator.java
  class RandomIdGenerator (line 8) | public class RandomIdGenerator implements DefaultValueGenerator<RDBColum...
    method getSortId (line 9) | @Override
    method generate (line 14) | @Override
    method getName (line 19) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/SnowFlakeStringIdGenerator.java
  class SnowFlakeStringIdGenerator (line 8) | public class SnowFlakeStringIdGenerator implements DefaultValueGenerator...
    method getSortId (line 9) | @Override
    method generate (line 14) | @Override
    method getName (line 19) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/DefaultQueryHelper.java
  class DefaultQueryHelper (line 60) | @AllArgsConstructor
    method analysis (line 72) | @Override
    method select (line 77) | @Override
    method select (line 82) | @Override
    method select (line 92) | @Override
    method select (line 97) | @Override
    method getTable (line 106) | TableOrViewMetadata getTable(Class<?> type) {
    method getColumn (line 122) | static RDBColumnMetadata getColumn(TableOrViewMetadata table, String c...
    method parseTableName (line 128) | Table parseTableName(Class<?> type) {
    method toArray (line 136) | @SafeVarargs
    class NativeQuerySpecImpl (line 141) | static class NativeQuerySpecImpl<R> extends MapResultWrapper implement...
      method NativeQuerySpecImpl (line 155) | NativeQuerySpecImpl(DefaultQueryHelper parent,
      method wrapColumn (line 167) | @Override
      method logger (line 184) | @Override
      method count (line 190) | @Override
      method where (line 204) | @Override
      method fetch (line 210) | @Override
      method fetch (line 226) | @Override
      method fetchPaged (line 235) | @Override
      method createPagingSql (line 243) | private SqlRequest createPagingSql(SqlRequest request, int pageIndex...
      method fetchPaged (line 255) | @Override
      method fetchPaged (line 262) | public Mono<PagerResult<R>> fetchPaged(QueryParamEntity param) {
    class ColumnMapping (line 310) | static abstract class ColumnMapping<R> {
      method ColumnMapping (line 313) | public ColumnMapping(QuerySpec<R> parent) {
      method forSelect (line 317) | abstract SelectColumnSupplier[] forSelect();
      method match (line 319) | abstract boolean match(String[] column);
      method applyValue (line 321) | abstract void applyValue(R result, String[] column, Object sqlValue);
      class All (line 323) | static class All<R, V> extends ColumnMapping<R> {
        method All (line 334) | @SneakyThrows
        method propertyTypeIsCollection (line 357) | boolean propertyTypeIsCollection() {
        method match (line 361) | @Override
        method applyValue (line 366) | @Override
        method toColumns (line 385) | SelectColumnSupplier[] toColumns(TableOrViewMetadata table,
        method getJoin (line 397) | JoinConditionalSpecImpl getJoin() {
        method forSelect (line 405) | @Override
      class Default (line 424) | static class Default<R, S, V> extends ColumnMapping<R> {
        method Default (line 431) | public Default(QuerySpec<R> parent,
        method match (line 443) | @Override
        method applyValue (line 448) | @Override
        method forSelect (line 457) | @Override
    class QuerySpec (line 492) | @Slf4j
      method QuerySpec (line 515) | public QuerySpec(Class<R> clazz, DefaultQueryHelper parent) {
      method joins (line 521) | private List<JoinConditionalSpecImpl> joins() {
      method getJoinByClass (line 525) | private JoinConditionalSpecImpl getJoinByClass(Class<?> clazz) {
      method getJoinByAlias (line 538) | private JoinConditionalSpecImpl getJoinByAlias(String alias) {
      method from (line 550) | @Override
      method createQuery (line 559) | private QueryOperator createQuery() {
      method count (line 568) | public Mono<Integer> count(QueryOperator query) {
      method count0 (line 575) | public Mono<Integer> count0(BuildParameterQueryOperator operator) {
      method count (line 587) | @Override
      method fetch (line 592) | @Override
      method fetch (line 602) | @Override
      method fetchPaged (line 612) | @Override
      method fetchPaged (line 620) | @Override
      method fetchPaged (line 627) | private Mono<PagerResult<R>> fetchPaged(QueryParamEntity param) {
      method where (line 673) | @Override
      method refactorParam (line 679) | private QueryParamEntity refactorParam(QueryParamEntity param) {
      method refactorTerm (line 688) | private void refactorTerm(Term term) {
      method where (line 692) | @Override
      method createJoinAlias (line 701) | private String createJoinAlias() {
      method join (line 705) | public <T> JoinSpec<R> join(Class<T> type,
      class Joiner (line 756) | class Joiner {
        method Joiner (line 761) | public Joiner(List<Term> terms) {
        method prepare (line 766) | public void prepare(List<Term> terms) {
        method buildHandler (line 779) | private Function<Flux<R>, Flux<R>> buildHandler(JoinConditionalSpe...
        method refactorTerms (line 799) | private List<Term> refactorTerms(R main) {
        method refactorTerms (line 803) | private List<Term> refactorTerms(List<Term> terms, R main) {
        method refactorTerms (line 813) | private void refactorTerms(R main, Term term) {
        method buildBatchHandler (line 828) | private Function<Flux<R>, Flux<R>> buildBatchHandler(JoinCondition...
      method buildOnToMany (line 861) | private void buildOnToMany(QueryParamEntity param, JoinConditionalSp...
      method fullJoin (line 866) | @Override
      method leftJoin (line 871) | @Override
      method innerJoin (line 876) | @Override
      method rightJoin (line 881) | @Override
      method newRowInstance0 (line 886) | @SneakyThrows
      method newRowInstance (line 891) | @Override
      method wrapColumn (line 897) | @Override
      method completedWrapRow (line 912) | @Override
      method getResult (line 917) | @Override
      method getMappingByColumn (line 922) | public ColumnMapping<R> getMappingByColumn(String[] column) {
      method all (line 932) | @Override
      method all (line 938) | @Override
      method all (line 944) | @Override
      method all (line 950) | @Override
      method as (line 956) | @Override
      method as (line 963) | @Override
      method as (line 969) | @Override
      method as (line 975) | @Override
      method orderBy (line 982) | @Override
      method orderBy (line 991) | @Override
      method refactorColumn (line 1003) | public String refactorColumn(String column) {
    class JoinConditionalSpecImpl (line 1024) | @AllArgsConstructor
      method mainClassSafe (line 1032) | @SuppressWarnings("all")
      method applyColumn (line 1037) | @Override
      method applyColumn (line 1059) | @Override
      method applyColumn (line 1066) | public JoinConditionalSpecImpl applyColumn(String mainColumn,
      class ColumnRef (line 1081) | @AllArgsConstructor
        method getSql (line 1087) | @Override
      method nest (line 1093) | @Override
      method orNest (line 1102) | @Override
      method and (line 1111) | @Override
      method or (line 1117) | @Override
      method and (line 1123) | @Override
      method or (line 1129) | @Override
      method getAccepter (line 1135) | @Override
      method accept (line 1143) | @Override
      method alias (line 1149) | @Override
    class JoinNestConditionalSpecImpl (line 1158) | static class JoinNestConditionalSpecImpl<T extends TermTypeConditional...
      method JoinNestConditionalSpecImpl (line 1164) | public JoinNestConditionalSpecImpl(QuerySpec<?> parent, T target, Te...
      method accept (line 1170) | @Override
      method nest (line 1175) | @Override
      method orNest (line 1181) | @Override
      method applyColumn (line 1187) | @Override
      method applyColumn (line 1209) | @Override
      method applyColumn (line 1217) | public JoinNestConditionalSpecImpl<T> applyColumn(String mainColumn,
      method getAccepter (line 1232) | @Override
    class NestConditionalImpl (line 1241) | static class NestConditionalImpl<T extends TermTypeConditionalSupport>...
      method NestConditionalImpl (line 1246) | public NestConditionalImpl(QuerySpec<?> parent, T target, Term term) {
      method nest (line 1252) | @Override
      method orNest (line 1257) | @Override
      method accept (line 1262) | @Override
      method accept (line 1267) | @Override
      method accept (line 1277) | @Override
    class ConditionalImpl (line 1291) | @AllArgsConstructor
      method nest (line 1297) | @Override
      method orNest (line 1306) | @Override
      method and (line 1314) | @Override
      method or (line 1320) | @Override
      method and (line 1326) | @Override
      method or (line 1332) | @Override
      method accept (line 1338) | @Override
      method accept (line 1343) | @Override
      method accept (line 1354) | @Override
      method getAccepter (line 1365) | @Override
      method accept (line 1373) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/JoinConditionalSpec.java
  type JoinConditionalSpec (line 6) | public interface JoinConditionalSpec<C extends JoinConditionalSpec<C>> e...
    method nest (line 8) | @Override
    method orNest (line 11) | @Override
    method alias (line 25) | default <T> C alias(StaticMethodReferenceColumn<T> alias) {
    method alias (line 35) | C alias(String alias);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/JoinNestConditionalSpec.java
  type JoinNestConditionalSpec (line 6) | public interface JoinNestConditionalSpec<C extends TermTypeConditionalSu...
    method nest (line 9) | @Override
    method orNest (line 12) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/JoinOnSpec.java
  type JoinOnSpec (line 7) | public interface JoinOnSpec<Self extends TermTypeConditionalSupport> {
    method is (line 22) | default <T, T2> Self is(StaticMethodReferenceColumn<T> joinColumn, Sta...
    method is (line 40) | default <T, T2> Self is(StaticMethodReferenceColumn<T> joinColumn,
    method not (line 59) | default <T, T2> Self not(StaticMethodReferenceColumn<T> joinColumn, St...
    method not (line 77) | default <T, T2> Self not(StaticMethodReferenceColumn<T> joinColumn,
    method gt (line 96) | default <T, T2> Self gt(StaticMethodReferenceColumn<T> joinColumn, Sta...
    method gt (line 114) | default <T, T2> Self gt(StaticMethodReferenceColumn<T> joinColumn, Str...
    method gte (line 132) | default <T, T2> Self gte(StaticMethodReferenceColumn<T> joinColumn, St...
    method gte (line 150) | default <T, T2> Self gte(StaticMethodReferenceColumn<T> joinColumn, St...
    method lt (line 168) | default <T, T2> Self lt(StaticMethodReferenceColumn<T> joinColumn, Sta...
    method lt (line 186) | default <T, T2> Self lt(StaticMethodReferenceColumn<T> joinColumn, Str...
    method lte (line 204) | default <T, T2> Self lte(StaticMethodReferenceColumn<T> joinColumn, St...
    method lte (line 222) | default <T, T2> Self lte(StaticMethodReferenceColumn<T> joinColumn, St...
    method applyColumn (line 238) | <T, T2> Self applyColumn(StaticMethodReferenceColumn<T> joinColumn,
    method applyColumn (line 255) | <T, T2> Self applyColumn(StaticMethodReferenceColumn<T> joinColumn,

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzer.java
  type QueryAnalyzer (line 25) | public interface QueryAnalyzer {
    method originalSql (line 30) | String originalSql();
    method refactor (line 39) | SqlRequest refactor(QueryParamEntity entity, Object... args);
    method refactorCount (line 51) | SqlRequest refactorCount(QueryParamEntity entity, Object... args);
    method select (line 56) | Select select();
    method findColumn (line 64) | Optional<Column> findColumn(String name);
    method columnIsExpression (line 73) | boolean columnIsExpression(String name, int index);
    method joins (line 78) | List<Join> joins();
    class Join (line 80) | @AllArgsConstructor
      type Type (line 90) | enum Type {
    class Select (line 95) | @RequiredArgsConstructor
      method newSelectAlias (line 104) | public Select newSelectAlias(String alias) {
      method findColumn (line 112) | public Optional<Column> findColumn(String name) {
      method getColumns (line 130) | @Deprecated
    class Table (line 149) | @Getter
      method newAlias (line 156) | public Table newAlias(String alias) {
    class Column (line 161) | @AllArgsConstructor
      method getFullName (line 175) | public String getFullName() {
      method moveOwner (line 179) | public Column moveOwner(String owner) {
      method getId (line 183) | @Override
      method getType (line 188) | @Override
    class SelectTable (line 194) | class SelectTable extends Table {
      method SelectTable (line 197) | public SelectTable(String alias,
      method newAlias (line 204) | @Override
      method getColumns (line 220) | public Map<String, Column> getColumns() {
    type AnalyzerFeatureType (line 226) | enum AnalyzerFeatureType implements FeatureType {
      method getId (line 229) | @Override
      method getName (line 234) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java
  class QueryAnalyzerImpl (line 31) | class QueryAnalyzerImpl implements FromItemVisitor, SelectItemVisitor, S...
    method originalSql (line 50) | @Override
    method refactor (line 55) | @Override
    method refactorCount (line 63) | @Override
    method select (line 71) | @Override
    method findColumn (line 76) | @Override
    method joins (line 81) | @Override
    method QueryAnalyzerImpl (line 86) | QueryAnalyzerImpl(DatabaseOperator database, String sql) {
    method columnIsExpression (line 92) | public boolean columnIsExpression(String name, int index) {
    method getColumnMappings (line 101) | private Map<String, Column> getColumnMappings() {
    method getColumnOrSelectColumn (line 170) | private Column getColumnOrSelectColumn(String name) {
    method parse (line 180) | @SneakyThrows
    method QueryAnalyzerImpl (line 185) | QueryAnalyzerImpl(DatabaseOperator database, SelectBody selectBody, Qu...
    method QueryAnalyzerImpl (line 196) | QueryAnalyzerImpl(DatabaseOperator database, SubSelect select, QueryAn...
    method QueryAnalyzerImpl (line 211) | QueryAnalyzerImpl(DatabaseOperator database, net.sf.jsqlparser.stateme...
    method parsePlainName (line 226) | private String parsePlainName(String name) {
    method visit (line 241) | @Override
    method visit (line 280) | @Override
    method visit (line 285) | public void visit(SubSelect subSelect, String alias) {
    method visit (line 329) | @Override
    method visit (line 336) | @Override
    method visit (line 342) | @Override
    method visit (line 373) | @Override
    method visit (line 392) | @Override
    method visit (line 401) | @Override
    method putSelectColumns (line 410) | private void putSelectColumns(QueryAnalyzer.Table table, List<QueryAna...
    method visit (line 438) | @Override
    method getTable (line 457) | private QueryAnalyzer.Table getTable(net.sf.jsqlparser.schema.Table ta...
    class ExpressionColumn (line 477) | static class ExpressionColumn extends Column {
      method ExpressionColumn (line 481) | public ExpressionColumn(String alias, String owner, RDBColumnMetadat...
      method moveOwner (line 486) | @Override
    method refactorAlias (line 492) | private void refactorAlias(Alias alias) {
    method visit (line 503) | @Override
    method visit (line 549) | @Override
    method visit (line 587) | @Override
    method visit (line 599) | @Override
    method visit (line 624) | @Override
    method initInjector (line 629) | private void initInjector() {
    class QueryAnalyzerTermsFragmentBuilder (line 638) | static class QueryAnalyzerTermsFragmentBuilder extends AbstractTermsFr...
      method createTermFragments (line 640) | @Override
      method createTermFragments (line 645) | @Override
    class SimpleQueryRefactor (line 711) | class SimpleQueryRefactor implements QueryRefactor, SelectVisitor {
      method SimpleQueryRefactor (line 728) | SimpleQueryRefactor() {
      method initColumns (line 733) | private void initColumns(StringBuilder columns) {
      method visit (line 764) | @Override
      method visit (line 856) | @Override
      method visit (line 874) | @Override
      method visit (line 885) | @Override
      method getPrefixParameters (line 891) | public Object[] getPrefixParameters(Object... args) {
      method getSuffixParameters (line 901) | public Object[] getSuffixParameters(Object... args) {
      method refactor (line 911) | @Override
      method refactorCount (line 932) | @Override
      method appendOrderBy (line 977) | private void appendOrderBy(AppendableSqlFragments sql, QueryParamEnt...
      method appendWhere (line 1050) | private void appendWhere(AppendableSqlFragments sql, QueryParamEntit...
    class PrepareStatementVisitor (line 1076) | @Getter
      method PrepareStatementVisitor (line 1080) | public PrepareStatementVisitor() {
      method visit (line 1084) | @Override
      method visit (line 1090) | @Override
      method visit (line 1095) | @Override
      method visit (line 1112) | @Override
      method visit (line 1119) | @Override
      method visit (line 1128) | @Override
      method visit (line 1133) | @Override
      method visit (line 1138) | @Override
      method visit (line 1178) | @Override
      method visit (line 1198) | @Override
      method visit (line 1210) | @Override
    class FakeTable (line 1218) | static class FakeTable extends RDBViewMetadata {
      method getColumn (line 1219) | @Override
    type QueryRefactor (line 1233) | private interface QueryRefactor {
      method refactor (line 1235) | SqlRequest refactor(QueryParamEntity param, Object... args);
      method refactorCount (line 1237) | SqlRequest refactorCount(QueryParamEntity param, Object... args);

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryHelper.java
  type QueryHelper (line 63) | public interface QueryHelper {
    method analysis (line 71) | QueryAnalyzer analysis(String selectSql);
    method select (line 82) | <T> NativeQuerySpec<T> select(String sql,
    method select (line 126) | NativeQuerySpec<Record> select(String sql, Object... args);
    method select (line 136) | <R> SelectColumnMapperSpec<R> select(Class<R> resultType);
    method select (line 146) | <R> SelectSpec<R> select(Class<R> resultType,
    type NativeQuerySpec (line 150) | interface NativeQuerySpec<T> extends ExecuteSpec<T> {
      method logger (line 158) | NativeQuerySpec<T> logger(Logger logger);
      method where (line 171) | default ExecuteSpec<T> where(Consumer<Query<?, QueryParamEntity>> ds...
      method where (line 189) | ExecuteSpec<T> where(QueryParamEntity param);
    type SelectSpec (line 193) | interface SelectSpec<R> {
      method from (line 203) | <From> FromSpec<R> from(Class<From> clazz);
    type WhereSpec (line 213) | interface WhereSpec<R> extends ExecuteSpec<R> {
      method where (line 222) | SortSpec<R> where(QueryParamEntity param);
      method where (line 236) | SortSpec<R> where(Consumer<Conditional<?>> dsl);
    type SortSpec (line 245) | interface SortSpec<R> extends ExecuteSpec<R> {
      method orderByAsc (line 257) | default SortSpec<R> orderByAsc(String column) {
      method orderByDesc (line 271) | default SortSpec<R> orderByDesc(String column) {
      method orderBy (line 286) | SortSpec<R> orderBy(String column,
      method orderByAsc (line 303) | default <S> SortSpec<R> orderByAsc(Getter<S, ?> column) {
      method orderByDesc (line 320) | default <S> SortSpec<R> orderByDesc(Getter<S, ?> column) {
      method orderBy (line 337) | <S> SortSpec<R> orderBy(Getter<S, ?> column,
    type FromSpec (line 343) | interface FromSpec<R> extends JoinSpec<R>, SortSpec<R> {
    type JoinSpec (line 353) | interface JoinSpec<R> extends WhereSpec<R>, SortSpec<R> {
      method leftJoin (line 369) | <T> JoinSpec<R> leftJoin(Class<T> type, Consumer<JoinConditionalSpec...
      method rightJoin (line 384) | <T> JoinSpec<R> rightJoin(Class<T> type, Consumer<JoinConditionalSpe...
      method innerJoin (line 399) | <T> JoinSpec<R> innerJoin(Class<T> type, Consumer<JoinConditionalSpe...
      method fullJoin (line 414) | <T> JoinSpec<R> fullJoin(Class<T> type, Consumer<JoinConditionalSpec...
    type ExecuteSpec (line 424) | interface ExecuteSpec<R> {
      method count (line 431) | Mono<Integer> count();
      method fetch (line 438) | Flux<R> fetch();
      method fetch (line 445) | Flux<R> fetch(int pageIndex,int pageSize);
      method fetchPaged (line 452) | Mono<PagerResult<R>> fetchPaged();
      method fetchPaged (line 461) | default <T> Mono<PagerResult<T>> fetchPaged(Function<List<R>, Mono<L...
      method fetchPaged (line 472) | Mono<PagerResult<R>> fetchPaged(int pageIndex, int pageSize);
      method fetchPaged (line 483) | default <T> Mono<PagerResult<T>> fetchPaged(int pageIndex, int pageS...
    type SelectColumnMapperSpec (line 488) | interface SelectColumnMapperSpec<R> extends ColumnMapperSpec<R, Select...
    type ColumnMapperSpec (line 498) | interface ColumnMapperSpec<R, Self extends ColumnMapperSpec<R, Self>> {
      method all (line 506) | Self all(Class<?> tableType);
      method all (line 522) | <V> Self all(Class<?> tableType, Setter<R, V> setter);
      method all (line 530) | Self all(String tableOrAlias);
      method all (line 542) | <V> Self all(String tableOrAlias, Setter<R, V> setter);
      method as (line 556) | <S, V> Self as(Getter<S, V> column, Setter<R, V> target);
      method as (line 570) | <S, V> Self as(Getter<S, V> column, String target);
      method as (line 583) | <V> Self as(String column, Setter<R, V> target);
      method as (line 595) | Self as(String column, String target);
    type Getter (line 608) | interface Getter<S, V> extends Function<S, V>, Serializable {
    type Setter (line 622) | interface Setter<S, V> extends BiConsumer<S, V>, Serializable {
    method combineOneToMany (line 652) | static <T, ID, R> Flux<T> combineOneToMany(Flux<T> source,
    method combineOneToMany (line 680) | static <T, ID, R> Flux<T> combineOneToMany(Flux<T> source,
    method transformPageResult (line 715) | @SuppressWarnings("all")
    method queryPager (line 742) | static <T> Mono<PagerResult<T>> queryPager(QueryParamEntity param,
    method queryPager (line 757) | static <T, R> Mono<PagerResult<R>> queryPager(QueryParamEntity param,

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryHelperUtils.java
  class QueryHelperUtils (line 7) | public class QueryHelperUtils {
    method toSnake (line 11) | public static String toSnake(String col) {
    method toHump (line 28) | public static String toHump(String col) {
    method assertLegalColumn (line 56) | public static void assertLegalColumn(String col) {
    method isLegalColumn (line 62) | public static boolean isLegalColumn(String col) {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/ToHumpMap.java
  class ToHumpMap (line 5) | public class ToHumpMap<V> extends LinkedHashMap<String, V> {
    method put (line 7) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/CrudService.java
  type CrudService (line 22) | public interface CrudService<E, K> {
    method getRepository (line 23) | SyncRepository<E, K> getRepository();
    method createQuery (line 25) | default SyncQuery<E> createQuery() {
    method createUpdate (line 29) | default SyncUpdate<E> createUpdate() {
    method createDelete (line 33) | default SyncDelete createDelete() {
    method findById (line 37) | @Transactional( readOnly = true, transactionManager = TransactionManag...
    method findById (line 44) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method save (line 55) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method insert (line 62) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method insert (line 69) | @Transactional(rollbackFor = Throwable.class, transactionManager = Tra...
    method updateById (line 74) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method save (line 80) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method save (line 87) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method deleteById (line 94) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method deleteById (line 100) | @Transactional(rollbackFor = Throwable.class,transactionManager = Tran...
    method query (line 106) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryPager (line 112) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method count (line 125) | @Transactional(readOnly = true, transactionManager = TransactionManage...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/EnableCacheReactiveCrudService.java
  type EnableCacheReactiveCrudService (line 21) | public interface EnableCacheReactiveCrudService<E, K> extends ReactiveCr...
    method getCache (line 23) | ReactiveCache<E> getCache();
    method findById (line 27) | default Mono<E> findById(K id) {
    method findById (line 31) | @Override
    method updateById (line 36) | @Override
    method updateById (line 42) | @Override
    method save (line 49) | @Override
    method save (line 56) | @Override
    method save (line 63) | @Override
    method insert (line 70) | @Override
    method insert (line 77) | @Override
    method insertBatch (line 84) | @Override
    method registerClearCache (line 91) | default Mono<Void> registerClearCache() {
    method registerClearCache (line 101) | default Mono<Void> registerClearCache(Collection<?> keys) {
    method deleteById (line 115) | @Override
    method deleteById (line 121) | @Override
    method createUpdate (line 132) | @Override
    method createDelete (line 144) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericCrudService.java
  class GenericCrudService (line 8) | public abstract class GenericCrudService<E,K> implements CrudService<E,K> {
    method getRepository (line 13) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericReactiveCacheSupportCrudService.java
  class GenericReactiveCacheSupportCrudService (line 10) | public abstract class GenericReactiveCacheSupportCrudService<E, K> imple...
    method getRepository (line 15) | @Override
    method getCache (line 25) | @Override
    method getCacheName (line 37) | public String getCacheName() {
    method getCacheAll (line 42) | public Flux<E> getCacheAll() {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericReactiveCrudService.java
  class GenericReactiveCrudService (line 6) | public abstract class GenericReactiveCrudService<E, K> implements Reacti...
    method getRepository (line 12) | @Override
    method GenericReactiveCrudService (line 17) | public GenericReactiveCrudService() {
    method GenericReactiveCrudService (line 20) | public GenericReactiveCrudService(ReactiveRepository<E, K> repository) {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericReactiveTreeSupportCrudService.java
  class GenericReactiveTreeSupportCrudService (line 7) | public abstract class GenericReactiveTreeSupportCrudService<E extends Tr...
    method getRepository (line 14) | @Override
    method getBufferSize (line 19) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericTreeSupportCrudService.java
  class GenericTreeSupportCrudService (line 7) | public abstract class GenericTreeSupportCrudService<E extends TreeSortSu...
    method getRepository (line 12) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveCrudService.java
  type ReactiveCrudService (line 33) | public interface ReactiveCrudService<E, K> {
    method getRepository (line 38) | ReactiveRepository<E, K> getRepository();
    method createQuery (line 53) | default ReactiveQuery<E> createQuery() {
    method createUpdate (line 71) | default ReactiveUpdate<E> createUpdate() {
    method createDelete (line 88) | default ReactiveDelete createDelete() {
    method findById (line 93) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method findById (line 99) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method findById (line 105) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method findById (line 111) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method save (line 117) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method save (line 123) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method save (line 129) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method updateById (line 135) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method updateById (line 141) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method insertBatch (line 147) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method insert (line 153) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method insert (line 159) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method deleteById (line 165) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method deleteById (line 171) | @Transactional(rollbackFor = Throwable.class,  transactionManager = Tr...
    method query (line 178) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method query (line 184) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryPager (line 192) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryPager (line 197) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryPager (line 236) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryPager (line 243) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method count (line 248) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method count (line 256) | @Transactional(readOnly = true, transactionManager = TransactionManage...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java
  type ReactiveTreeSortEntityService (line 35) | public interface ReactiveTreeSortEntityService<E extends TreeSortSupport...
    method queryResultToTree (line 44) | default Mono<List<E>> queryResultToTree(Mono<? extends QueryParamEntit...
    method queryResultToTree (line 54) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildrenTree (line 69) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildren (line 84) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildren (line 96) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeParent (line 117) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeParent (line 129) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildren (line 152) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method insert (line 176) | @Override
    method insert (line 182) | @Override
    method insertBatch (line 188) | @Override
    method getBufferSize (line 200) | default int getBufferSize() {
    method save (line 204) | @Override
    method tryRefactorPath (line 217) | @Deprecated
    method save (line 222) | @Override
    method save (line 228) | @Override
    method updateById (line 234) | @Override
    method deleteById (line 246) | @Override
    method deleteById (line 252) | @Override
    method getIDGenerator (line 263) | IDGenerator<K> getIDGenerator();
    method setChildren (line 265) | void setChildren(E entity, List<E> children);
    method getChildren (line 267) | default List<E> getChildren(E entity) {
    method createRootNodePredicate (line 271) | default Predicate<E> createRootNodePredicate(TreeSupportEntity.TreeHel...
    method isRootNode (line 281) | default boolean isRootNode(E entity) {
    method createDelete (line 285) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortServiceHelper.java
  class ReactiveTreeSortServiceHelper (line 9) | public class ReactiveTreeSortServiceHelper<E extends TreeSortSupportEnti...
    method ReactiveTreeSortServiceHelper (line 13) | public  ReactiveTreeSortServiceHelper(ReactiveTreeSortEntityService<E,...
    method getIdGenerator (line 17) | @Override
    method applyChildren (line 22) | @Override
    method isRootNode (line 27) | @Override
    method queryIncludeChildren (line 32) | @Override
    method queryById (line 37) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/SyncTreeSortServiceHelper.java
  class SyncTreeSortServiceHelper (line 11) | public class SyncTreeSortServiceHelper<E extends TreeSortSupportEntity<P...
    method SyncTreeSortServiceHelper (line 15) | public SyncTreeSortServiceHelper(TreeSortEntityService<E, PK> service) {
    method getIdGenerator (line 19) | @Override
    method applyChildren (line 24) | @Override
    method isRootNode (line 29) | @Override
    method prepare (line 34) | public List<E> prepare(Collection<E> source) {
    method queryIncludeChildren (line 41) | @Override
    method queryById (line 47) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/TreeSortEntityService.java
  type TreeSortEntityService (line 27) | public interface TreeSortEntityService<E extends TreeSortSupportEntity<K...
    method queryResultToTree (line 30) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildrenTree (line 38) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildren (line 47) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method queryIncludeChildren (line 59) | @Transactional(readOnly = true, transactionManager = TransactionManage...
    method insert (line 71) | @Override
    method insert (line 77) | @Override
    method save (line 89) | @Override
    method updateById (line 101) | @Override
    method deleteById (line 108) | @Override
    method getIDGenerator (line 122) | IDGenerator<K> getIDGenerator();
    method setChildren (line 124) | void setChildren(E entity, List<E> children);
    method getChildren (line 126) | default List<E> getChildren(E entity) {
    method getBufferSize (line 130) | default int getBufferSize() {
    method createRootNodePredicate (line 134) | default Predicate<E> createRootNodePredicate(TreeSupportEntity.TreeHel...
    method isRootNode (line 147) | default boolean isRootNode(E entity) {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/TreeSortServiceHelper.java
  class TreeSortServiceHelper (line 20) | public abstract class TreeSortServiceHelper<E extends TreeSortSupportEnt...
    method getIdGenerator (line 33) | protected abstract IDGenerator<PK> getIdGenerator();
    method applyChildren (line 35) | protected abstract void applyChildren(E parent, List<E> children);
    method isRootNode (line 37) | protected abstract boolean isRootNode(E node);
    method queryIncludeChildren (line 39) | protected abstract Flux<E> queryIncludeChildren(Collection<PK> idList);
    method queryById (line 41) | protected abstract Flux<E> queryById(Collection<PK> idList);
    method prepare (line 44) | public Flux<E> prepare(Flux<E> source) {
    method init (line 75) | private Mono<Void> init(Flux<E> source) {
    method initChildren (line 115) | private void initChildren() {
    method checkCyclicDependency (line 128) | private void checkCyclicDependency() {
    method checkCyclicDependency (line 134) | private void checkCyclicDependency(E val, Set<PK> container) {
    method checkParentId (line 146) | private Mono<Void> checkParentId() {
    method refactorPath (line 182) | private void refactorPath() {
    method putChildToReadyToSave (line 244) | private void putChildToReadyToSave(Function<PK, Collection<E>> childGe...
    method refactor (line 253) | private void refactor(E e) {
    method refactorChildPath (line 260) | private void refactorChildPath(PK id, String path, Consumer<E> pathAcc...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/sql/DefaultJdbcExecutor.java
  class DefaultJdbcExecutor (line 26) | @Slf4j
    method DefaultJdbcExecutor (line 32) | public DefaultJdbcExecutor() {
    method DefaultJdbcExecutor (line 35) | public DefaultJdbcExecutor(DataSource dataSource) {
    method getDatasourceId (line 39) | protected String getDatasourceId() {
    method getConnection (line 43) | @Override
    method releaseConnection (line 57) | @Override
    method execute (line 77) | @Override
    method update (line 83) | @Transactional(rollbackFor = Throwable.class, transactionManager = Tra...
    method select (line 89) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/sql/DefaultJdbcReactiveExecutor.java
  class DefaultJdbcReactiveExecutor (line 22) | @Slf4j
    method DefaultJdbcReactiveExecutor (line 27) | @Deprecated
    method DefaultJdbcReactiveExecutor (line 32) | public DefaultJdbcReactiveExecutor(DataSource dataSource) {
    method getDatasourceId (line 36) | protected String getDatasourceId() {
    method getDataSourceAndConnection (line 40) | private Tuple2<DataSource, Connection> getDataSourceAndConnection() {
    method getConnection (line 53) | @Override
    method doInConnection (line 65) | @Override
    method select (line 74) | @Override
    method update (line 80) | @Override
    method update (line 86) | @Override
    method update (line 92) | @Override
    method execute (line 98) | @Override
    method execute (line 104) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/sql/DefaultR2dbcExecutor.java
  class DefaultR2dbcExecutor (line 29) | public class DefaultR2dbcExecutor extends R2dbcReactiveSqlExecutor {
    method getBindSymbol (line 41) | @Override
    method convertRequest (line 46) | @Override
    method prepareStatement (line 54) | @Override
    method bindNull (line 65) | protected void bindNull(Statement statement, int index, Class type) {
    method bind (line 76) | protected void bind(Statement statement, int index, Object value) {
    method getConnection (line 91) | @Override
    method doInConnection (line 97) | @Override
    class ConnectionCloseHolder (line 113) | static class ConnectionCloseHolder extends AtomicBoolean {
      method ConnectionCloseHolder (line 122) | ConnectionCloseHolder(Connection connection, Function<Connection, Pu...
      method close (line 127) | Mono<Void> close() {
    method closeConnection (line 137) | private Publisher<Void> closeConnection(Connection connection) {
    method releaseConnection (line 143) | @Override
    method execute (line 148) | @Override
    method execute (line 154) | @Override
    method update (line 160) | @Override
    method update (line 166) | @Override
    method update (line 172) | @Override
    method select (line 178) | @Override
    method select (line 184) | @Override
    method select (line 190) | @Override
    method select (line 196) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/sql/terms/TreeChildTermBuilder.java
  class TreeChildTermBuilder (line 20) | public abstract class TreeChildTermBuilder extends AbstractTermFragmentB...
    method TreeChildTermBuilder (line 21) | public TreeChildTermBuilder(String termType, String name) {
    method tableName (line 25) | protected abstract String tableName();
    method createFragments (line 27) | @Override

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/utils/TransactionUtils.java
  class TransactionUtils (line 20) | @Slf4j
    method setup (line 28) | public static void setup(TransactionManager transactionManager) {
    method tryRunInTransaction (line 32) | public static <T> Mono<T> tryRunInTransaction(Mono<T> task, Transactio...
    method tryRunInTransaction (line 43) | public static <T> Flux<T> tryRunInTransaction(Flux<T> task, Transactio...
    method afterCommitWithOutTransaction (line 54) | public static Mono<Void> afterCommitWithOutTransaction(Mono<Void> task) {
    method afterCommit (line 71) | public static Mono<Void> afterCommit(Mono<Void> task) {
    method registerSynchronization (line 95) | public static Mono<Void> registerSynchronization(TransactionSynchroniz...

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/CommonErrorControllerAdvice.java
  class CommonErrorControllerAdvice (line 48) | @RestControllerAdvice
    method handleException (line 53) | @ExceptionHandler
    method handleException (line 62) | @ExceptionHandler
    method handleException (line 71) | @ExceptionHandler
    method handleException (line 84) | @ExceptionHandler
    method handleException (line 93) | @ExceptionHandler
    method handleException (line 102) | @ExceptionHandler
    method handleException (line 110) | @ExceptionHandler
    method handleException (line 118) | @ExceptionHandler
    method handleException (line 130) | @ExceptionHandler
    method handleException (line 136) | @ExceptionHandler
    method handleException (line 143) | @ExceptionHandler
    method handleException (line 151) | @ExceptionHandler
    method handleBindingResult (line 158) | private Mono<ResponseMessage<List<ValidationException.Detail>>> handle...
    method handleException (line 178) | @ExceptionHandler
    method handleException (line 184) | @ExceptionHandler
    method handleException (line 194) | @ExceptionHandler
    method handleException (line 204) | @ExceptionHandler
    method handleException (line 214) | @ExceptionHandler
    method handleException (line 225) | @ExceptionHandler
    method handleException (line 232) | @ExceptionHandler
    method handleException (line 244) | @ExceptionHandler
    method handleException (line 256) | @ExceptionHandler
    method handleException (line 269) | @ExceptionHandler
    method handleException (line 290) | @ExceptionHandler
    method handleException (line 297) | @ExceptionHandler
    method handleException (line 305) | @ExceptionHandler

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/CommonWebFluxConfiguration.java
  class CommonWebFluxConfiguration (line 17) | @AutoConfiguration
    method commonErrorControllerAdvice (line 21) | @Bean
    method r2dbcErrorControllerAdvice (line 27) | @Bean
    method responseMessageWrapper (line 34) | @Bean
    method localeWebFilter (line 43) | @Bean

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/CommonWebMvcConfiguration.java
  class CommonWebMvcConfiguration (line 13) | @AutoConfiguration
    method commonErrorControllerAdvice (line 18) | @Bean
    method responseMessageWrapper (line 24) | @SuppressWarnings("all")

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/CommonWebMvcErrorControllerAdvice.java
  class CommonWebMvcErrorControllerAdvice (line 39) | @RestControllerAdvice
    method resolveMessage (line 44) | private String resolveMessage(Throwable e) {
    method handleException (line 51) | @ExceptionHandler
    method handleException (line 58) | @ExceptionHandler
    method handleException (line 66) | @ExceptionHandler
    method handleException (line 75) | @ExceptionHandler
    method handleException (line 81) | @ExceptionHandler
    method handleException (line 87) | @ExceptionHandler
    method handleException (line 96) | @ExceptionHandler
    method handleException (line 102) | @ExceptionHandler
    method handleException (line 114) | @ExceptionHandler
    method handleException (line 127) | @ExceptionHandler
    method handleException (line 139) | @ExceptionHandler
    method handleException (line 145) | @ExceptionHandler
    method handleException (line 151) | @ExceptionHandler
    method handleException (line 160) | @ExceptionHandler
    method handleException (line 170) | @ExceptionHandler
    method handleException (line 177) | @ExceptionHandler
    method handleException (line 185) | @ExceptionHandler
    method handleException (line 193) | @ExceptionHandler
    method handleException (line 203) | @ExceptionHandler
    method handleException (line 214) | @ExceptionHandler
    method handleException (line 225) | @ExceptionHandler
    method handleException (line 242) | @ExceptionHandler
    method handleException (line 248) | @ExceptionHandler
    method handleException (line 256) | @ExceptionHandler

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/CrudController.java
  type CrudController (line 3) | public interface CrudController<E, K> extends

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/DeleteController.java
  type DeleteController (line 13) | public interface DeleteController<E, K> {
    method getRepository (line 14) | @Authorize(ignore = true)
    method delete (line 17) | @DeleteMapping("/{id:.+}")

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/QueryController.java
  type QueryController (line 31) | public interface QueryController<E, K> {
    method getRepository (line 33) | @Authorize(ignore = true)
    method query (line 47) | @GetMapping("/_query/no-paging")
    method postQuery (line 83) | @PostMapping("/_query/no-paging")
    method queryPager (line 103) | @GetMapping("/_query")
    method postQueryPager (line 131) | @PostMapping("/_query")
    method postCount (line 139) | @PostMapping("/_count")
    method count (line 156) | @GetMapping("/_count")
    method getById (line 166) | @GetMapping("/{id:.+}")

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/R2dbcErrorControllerAdvice.java
  class R2dbcErrorControllerAdvice (line 19) | @RestControllerAdvice
    method handleException (line 24) | @ExceptionHandler

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/ResponseMessage.java
  class ResponseMessage (line 11) | @Getter
    method ResponseMessage (line 33) | public ResponseMessage() {
    method ok (line 36) | public static <T> ResponseMessage<T> ok() {
    method ok (line 40) | @SuppressWarnings("all")
    method error (line 45) | public static <T> ResponseMessage<T> error(String message) {
    method error (line 49) | public static <T> ResponseMessage<T> error(String code, String message) {
    method error (line 53) | public static <T> ResponseMessage<T> error(int status, String code, St...
    method of (line 57) | public static <T> ResponseMessage<T> of(String message,
    method result (line 72) | public ResponseMessage<T> result(T result) {

FILE: hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/ResponseMessageWrapper.java
  class ResponseMessageWrapper (line 26) | public class ResponseMessageWrapper extends ResponseBodyR
Condensed preview — 784 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,079K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "chars": 199,
    "preview": "---\nname: 提交Bug\nabout: 提交bug,帮助我们更好完善项目.\ntitle: \"[BUG]\"\nlabels: bug\nassignees: zhou-hao\n\n---\n\n# BUG 说明\n简要说明bug情况\n\n# 运行环境"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/future.md",
    "chars": 104,
    "preview": "---\nname: 需求 特性\nabout: 提出你想要的,帮助完善hsweb\ntitle: \"[需求]\"\nlabels: 需求\nassignees: zhou-hao\n\n---\n\n# 场景\n\n# 需求说明\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/qa.md",
    "chars": 125,
    "preview": "---\nname: 疑问 帮助\nabout: 有任何疑问尽管提\ntitle: \"[疑问]\"\nlabels: 帮助\nassignees: zhou-hao\n\n---\n\n# 环境\njava: 1.8.0_131\nhsweb: 3.0.5\n\n# "
  },
  {
    "path": ".github/workflows/maven-publish-4x.yml",
    "chars": 1461,
    "preview": "name: Auto Deploy 4.x to the Maven Repository\non:\n  push:\n    branches: [\"master\"]\n\njobs:\n  publish:\n    runs-on: ubuntu"
  },
  {
    "path": ".github/workflows/maven-publish-5x.yml",
    "chars": 1458,
    "preview": "name: Auto Deploy 5.x to the Maven Repository\non:\n  push:\n    branches: [\"5.0.x\"]\n\njobs:\n  publish:\n    runs-on: ubuntu-"
  },
  {
    "path": ".github/workflows/pull_request.yml",
    "chars": 480,
    "preview": "name: Pull Request test master\n\non:\n  pull_request:\n    branches: [ master ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest"
  },
  {
    "path": ".github/workflows/pull_request_5x.yml",
    "chars": 476,
    "preview": "name: Pull Request test 5.0.x\n\non:\n  pull_request:\n    branches: [ 5.0.x ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n"
  },
  {
    "path": ".gitignore",
    "chars": 365,
    "preview": "**/pom.xml.versionsBackup\n**/target/\n**/out/\n**/log/\n*.class\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n.idea/\n/nbproject\n"
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "chars": 103,
    "preview": "distributionUrl=https://archive.apache.org/dist/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.zip"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3211,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 500,
    "preview": "# 贡献你的代码\n1. fork 本仓库\n2. 修改,增加代码\n3. 执行`mvn test`通过\n4. 提交`pull request`\n5. 坐等审查\n6. 合并\n\n# BUG\n如果知道导致bug的位置,你可以直接修改后`pull re"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "chars": 26,
    "preview": "1. 问题描述:\n2. 复现步骤:\n3. 日志内容:"
  },
  {
    "path": "LICENSE",
    "chars": 11347,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 3089,
    "preview": "# hsweb4 基于spring-boot2,全响应式的后台管理框架\n\n[![Codecov](https://codecov.io/gh/hs-web/hsweb-framework/branch/4.0.x/graph/badge.s"
  },
  {
    "path": "build.sh",
    "chars": 91,
    "preview": "#!/usr/bin/env bash\n./mvnw install -Dgit.commit.hash=$(git rev-parse HEAD) -DskipTests=true"
  },
  {
    "path": "changes.sh",
    "chars": 391,
    "preview": "#!/usr/bin/env bash\n\n# 收集变更模块\nmodules=$(git diff --name-only HEAD~1 HEAD | \\\nwhile read file; do\n  dir=$(dirname \"$file\""
  },
  {
    "path": "hsweb-authorization/README.md",
    "chars": 161,
    "preview": "# 授权认证模块\n用于整个系统的授权认证管理\n\n# 目录介绍\n1. [hsweb-authorization-api](hsweb-authorization-api):权限控制API\n3. [hsweb-authorization-bas"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/README.md",
    "chars": 2400,
    "preview": "# 权限控制API\n用于权限控制的API接口,支持RBAC权限控制,支持数据级(控制到行,列)权限控制.\n\n[用户令牌管理](token.md)\n\n[权限控制配置](define.md)\n\n# 介绍\n\n以下讲到的类都是基于包:org.hsw"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/custom-data-access.md",
    "chars": 1422,
    "preview": "# 自定义拓展数据权限控制\n\n1. 编写配置转换器,将在前端配置的内容转换为api需要的配置信息\n\n实现 ``DataAccessConfigConvert``接口\n```java\n@org.springframework.stereoty"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/define.md",
    "chars": 36,
    "preview": "# 权限配置定义\n\n用于告诉权限框架哪些请求需要进行权限控制,怎么控制."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/pom.xml",
    "chars": 2062,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java",
    "chars": 7441,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationHolder.java",
    "chars": 4116,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationManager.java",
    "chars": 1126,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationPredicate.java",
    "chars": 1592,
    "preview": "package org.hswebframework.web.authorization;\n\nimport org.hswebframework.web.authorization.exception.AccessDenyException"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationRequest.java",
    "chars": 187,
    "preview": "package org.hswebframework.web.authorization;\n\nimport java.io.Serializable;\n\n/**\n * @author zhouhao\n * @since 3.0.0-RC\n "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationSupplier.java",
    "chars": 975,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/AuthenticationUtils.java",
    "chars": 3079,
    "preview": "package org.hswebframework.web.authorization;\n\nimport org.hswebframework.web.authorization.simple.SimpleAuthentication;\n"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DefaultDimensionType.java",
    "chars": 324,
    "preview": "package org.hswebframework.web.authorization;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n@Getter\n@AllArgs"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Dimension.java",
    "chars": 1070,
    "preview": "package org.hswebframework.web.authorization;\n\nimport org.hswebframework.web.authorization.simple.SimpleDimension;\n\nimpo"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionProvider.java",
    "chars": 1200,
    "preview": "package org.hswebframework.web.authorization;\n\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\n"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionType.java",
    "chars": 356,
    "preview": "package org.hswebframework.web.authorization;\n\npublic interface DimensionType {\n    String getId();\n\n    String getName("
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Permission.java",
    "chars": 6568,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationHolder.java",
    "chars": 3125,
    "preview": "/*\n *  Copyright 2019 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationInitializeService.java",
    "chars": 1127,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationManager.java",
    "chars": 1151,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationManagerProvider.java",
    "chars": 455,
    "preview": "package org.hswebframework.web.authorization;\n\nimport reactor.core.publisher.Mono;\n\npublic interface ReactiveAuthenticat"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/ReactiveAuthenticationSupplier.java",
    "chars": 997,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Role.java",
    "chars": 1146,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/User.java",
    "chars": 1104,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessConfig.java",
    "chars": 1913,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessConfiguration.java",
    "chars": 99,
    "preview": "package org.hswebframework.web.authorization.access;\n\npublic interface DataAccessConfiguration {\n}\n"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessController.java",
    "chars": 507,
    "preview": "package org.hswebframework.web.authorization.access;\n\nimport org.hswebframework.web.authorization.define.AuthorizingCont"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessHandler.java",
    "chars": 552,
    "preview": "package org.hswebframework.web.authorization.access;\n\nimport org.hswebframework.web.authorization.define.AuthorizingCont"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DataAccessType.java",
    "chars": 135,
    "preview": "package org.hswebframework.web.authorization.access;\n\npublic interface DataAccessType {\n\n    String getId();\n\n    String"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DefaultDataAccessType.java",
    "chars": 657,
    "preview": "package org.hswebframework.web.authorization.access;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport org"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/DimensionHelper.java",
    "chars": 3118,
    "preview": "package org.hswebframework.web.authorization.access;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\nimport"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/FieldFilterDataAccessConfig.java",
    "chars": 348,
    "preview": "package org.hswebframework.web.authorization.access;\n\nimport java.util.Set;\n\n/**\n * 对字段进行过滤操作配置,实现字段级别的权限控制\n *\n * @autho"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/OwnCreatedDataAccessConfig.java",
    "chars": 284,
    "preview": "package org.hswebframework.web.authorization.access;\n\n/**\n * 只能操作由自己创建的数据\n *\n * @author zhouhao\n */\npublic interface Own"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/ScopeDataAccessConfig.java",
    "chars": 361,
    "preview": "package org.hswebframework.web.authorization.access;\n\nimport java.util.Set;\n\n/**\n * 范围数据权限控制配置\n *\n * @author zhouhao\n * "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/UserAttachEntity.java",
    "chars": 315,
    "preview": "package org.hswebframework.web.authorization.access;\n\n\n/**\n * 和user关联的实体\n *\n * @author zhouhao\n * @since 3.0.6\n */\npubli"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Authorize.java",
    "chars": 1995,
    "preview": "/*\n *\n *  * Copyright 2020 http://www.hswebframework.org\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/CreateAction.java",
    "chars": 400,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.Permission;\nimport"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DataAccess.java",
    "chars": 1402,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DataAccessType.java",
    "chars": 773,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.access.DataAccessC"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DeleteAction.java",
    "chars": 403,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.Permission;\nimport"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Dimension.java",
    "chars": 1501,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.DimensionType;\n\nim"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/DimensionDataAccess.java",
    "chars": 889,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.define.Phased;\nimp"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Dimensions.java",
    "chars": 630,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport java.lang.annotation.*;\n\nimport static java.lang.annota"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/FieldDataAccess.java",
    "chars": 464,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.springframework.core.annotation.AliasFor;\n\nimport j"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Logical.java",
    "chars": 724,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/QueryAction.java",
    "chars": 401,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.Permission;\nimport"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/RequiresRoles.java",
    "chars": 1155,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\n\nimport org.springframework.core.annotation.AliasFor;\n\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/Resource.java",
    "chars": 2588,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\n\nimport org.hswebframework.web.authorization.Permission;\nimpor"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/ResourceAction.java",
    "chars": 1447,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\n\nimport org.hswebframework.web.authorization.Permission;\n\nimpo"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/SaveAction.java",
    "chars": 429,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.Permission;\n\nimpor"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/TwoFactor.java",
    "chars": 1420,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport org.hswebframework.web.authorization.twofactor.TwoFacto"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/UserOwnData.java",
    "chars": 362,
    "preview": "package org.hswebframework.web.authorization.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 声明某个操作支持用户查看自己的数据\n *\n *"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/AuthenticationBuilder.java",
    "chars": 1617,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/AuthenticationBuilderFactory.java",
    "chars": 223,
    "preview": "package org.hswebframework.web.authorization.builder;\n\n/**\n * 权限构造器工厂\n *\n * @author zhouhao\n */\npublic interface Authent"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/DataAccessConfigBuilder.java",
    "chars": 368,
    "preview": "package org.hswebframework.web.authorization.builder;\n\nimport org.hswebframework.web.authorization.access.DataAccessConf"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/builder/DataAccessConfigBuilderFactory.java",
    "chars": 237,
    "preview": "package org.hswebframework.web.authorization.builder;\n\n/**\n * 数据权限配置构造器工厂\n *\n * @author zhouhao\n */\npublic interface Dat"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessor.java",
    "chars": 1055,
    "preview": "package org.hswebframework.web.authorization.context;\n\nimport io.micrometer.context.ThreadLocalAccessor;\nimport org.hswe"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/context/ThreadLocalReactiveAuthenticationSupplier.java",
    "chars": 612,
    "preview": "package org.hswebframework.web.authorization.context;\n\nimport org.hswebframework.web.authorization.Authentication;\nimpor"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AopAuthorizeDefinition.java",
    "chars": 263,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport java.lang.reflect.Method;\n\n/**\n * @author zhouhao\n * @since"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinition.java",
    "chars": 768,
    "preview": "package org.hswebframework.web.authorization.define;\n\n\nimport java.util.StringJoiner;\n\n/**\n * 权限控制定义,定义权限控制的方式\n *\n * @au"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionContext.java",
    "chars": 150,
    "preview": "package org.hswebframework.web.authorization.define;\n\npublic interface AuthorizeDefinitionContext {\n\n    void addResourc"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionCustomizer.java",
    "chars": 160,
    "preview": "package org.hswebframework.web.authorization.define;\n\npublic interface AuthorizeDefinitionCustomizer {\n\n    void custom("
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizeDefinitionInitializedEvent.java",
    "chars": 627,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport org.hswebframework.web.authorization.events.AuthorizationEv"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/AuthorizingContext.java",
    "chars": 537,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lom"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/CompositeAuthorizeDefinitionCustomizer.java",
    "chars": 784,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.AllArgsConstructor;\n\nimport java.util.List;\nimport j"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessDefinition.java",
    "chars": 502,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\nimport java.util.*;\n\n"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessTypeDefinition.java",
    "chars": 850,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lomb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DimensionDefinition.java",
    "chars": 1538,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lomb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DimensionsDefinition.java",
    "chars": 2501,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.apache.comm"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/HandleType.java",
    "chars": 101,
    "preview": "package org.hswebframework.web.authorization.define;\n\npublic enum HandleType{\n        RBAC,DATA\n    }"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/MergedAuthorizeDefinition.java",
    "chars": 1075,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport java.util.List;\nimport java.util.Set;\n\n\npublic class Merged"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/Phased.java",
    "chars": 94,
    "preview": "package org.hswebframework.web.authorization.define;\n\npublic enum Phased {\n    before, after\n}"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java",
    "chars": 1474,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lomb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceDefinition.java",
    "chars": 4113,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport lombok."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourcesDefinition.java",
    "chars": 2968,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport lombok."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionManager.java",
    "chars": 381,
    "preview": "package org.hswebframework.web.authorization.dimension;\n\nimport reactor.core.publisher.Flux;\n\nimport java.util.Collectio"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserBind.java",
    "chars": 997,
    "preview": "package org.hswebframework.web.authorization.dimension;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserBindProvider.java",
    "chars": 254,
    "preview": "package org.hswebframework.web.authorization.dimension;\n\nimport reactor.core.publisher.Flux;\n\nimport java.util.Collectio"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/dimension/DimensionUserDetail.java",
    "chars": 1056,
    "preview": "package org.hswebframework.web.authorization.dimension;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AbstractAuthorizationEvent.java",
    "chars": 2018,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationBeforeEvent.java",
    "chars": 1562,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationDecodeEvent.java",
    "chars": 1370,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationEvent.java",
    "chars": 995,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationExitEvent.java",
    "chars": 1320,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationFailedEvent.java",
    "chars": 1387,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java",
    "chars": 400,
    "preview": "package org.hswebframework.web.authorization.events;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lom"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationSuccessEvent.java",
    "chars": 1996,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizingHandleBeforeEvent.java",
    "chars": 1881,
    "preview": "package org.hswebframework.web.authorization.events;\n\nimport org.hswebframework.web.authorization.define.AuthorizingCont"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/AccessDenyException.java",
    "chars": 2101,
    "preview": "package org.hswebframework.web.authorization.exception;\n\nimport lombok.Getter;\nimport org.hswebframework.web.exception.I"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/AuthenticationException.java",
    "chars": 1334,
    "preview": "package org.hswebframework.web.authorization.exception;\n\nimport lombok.Getter;\nimport org.hswebframework.web.exception.I"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/NeedTwoFactorException.java",
    "chars": 446,
    "preview": "package org.hswebframework.web.authorization.exception;\n\nimport lombok.Getter;\n\n/**\n * @author zhouhao\n * @since 3.0.4\n "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/exception/UnAuthorizedException.java",
    "chars": 2376,
    "preview": "/*\n *\n *  * Copyright 2020 http://www.hswebframework.org\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/SettingNullValueHolder.java",
    "chars": 1144,
    "preview": "package org.hswebframework.web.authorization.setting;\n\nimport java.util.List;\nimport java.util.Optional;\n\n/**\n * @author"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/SettingValueHolder.java",
    "chars": 502,
    "preview": "package org.hswebframework.web.authorization.setting;\n\nimport java.util.List;\nimport java.util.Optional;\n\npublic interfa"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/StringSourceSettingHolder.java",
    "chars": 2671,
    "preview": "package org.hswebframework.web.authorization.setting;\n\n\nimport com.alibaba.fastjson.JSON;\nimport lombok.AllArgsConstruct"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/UserSettingManager.java",
    "chars": 300,
    "preview": "package org.hswebframework.web.authorization.setting;\n\n/**\n * @author zhouhao\n * @since 3.0.4\n */\npublic interface UserS"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/setting/UserSettingPermission.java",
    "chars": 521,
    "preview": "package org.hswebframework.web.authorization.setting;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport or"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/AbstractDataAccessConfig.java",
    "chars": 526,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.access.DataAccessConfi"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/CompositeReactiveAuthenticationManager.java",
    "chars": 1872,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.AllArgsConstructor;\nimport lombok.extern.slf4j.Slf4j"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java",
    "chars": 4926,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.*;\nimport org.hswebfra"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultDimensionManager.java",
    "chars": 4483,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.Dimension;\nimport org."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DimensionDataAccessConfig.java",
    "chars": 932,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lomb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/PlainTextUsernamePasswordAuthenticationRequest.java",
    "chars": 490,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lom"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java",
    "chars": 8897,
    "preview": "/*\n * Copyright 2020 http://www.hswebframework.org\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleDimension.java",
    "chars": 482,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.*;\nimport org.hswebframework.web.authorization.Dimen"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleDimensionType.java",
    "chars": 540,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.*;\nimport org.hswebframework.web.authorization.Dimen"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleFieldFilterDataAccessConfig.java",
    "chars": 1230,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.access.DataAccessType;"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleOwnCreatedDataAccessConfig.java",
    "chars": 519,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.access.OwnCreatedDataA"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimplePermission.java",
    "chars": 2002,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.*;\nimport org.apache.commons.collections4.Collection"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleRole.java",
    "chars": 796,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.*;\nimport org.hswebframework.web.authorization.Dimen"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleUser.java",
    "chars": 587,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport lombok.*;\nimport org.hswebframework.web.authorization.User;"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/DataAccessConfigConverter.java",
    "chars": 347,
    "preview": "package org.hswebframework.web.authorization.simple.builder;\n\nimport org.hswebframework.web.authorization.access.DataAcc"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilder.java",
    "chars": 6188,
    "preview": "package org.hswebframework.web.authorization.simple.builder;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastj"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilderFactory.java",
    "chars": 796,
    "preview": "package org.hswebframework.web.authorization.simple.builder;\n\nimport org.hswebframework.web.authorization.builder.Authen"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilder.java",
    "chars": 1837,
    "preview": "package org.hswebframework.web.authorization.simple.builder;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastj"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleDataAccessConfigBuilderFactory.java",
    "chars": 3270,
    "preview": "package org.hswebframework.web.authorization.simple.builder;\n\nimport com.alibaba.fastjson.JSON;\nimport jakarta.annotatio"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/AllopatricLoginMode.java",
    "chars": 278,
    "preview": "package org.hswebframework.web.authorization.token;\n\n/**\n * 异地登录模式\n */\npublic enum AllopatricLoginMode {\n    /**\n     * "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/AuthenticationUserToken.java",
    "chars": 366,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.hswebframework.web.authorization.Authentication;\n\n/**\n *"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/DefaultUserTokenManager.java",
    "chars": 10684,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/LocalAuthenticationUserToken.java",
    "chars": 487,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport lombok.AllArgsConstructor;\nimport org.hswebframework.web.aut"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/LocalUserToken.java",
    "chars": 3453,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * 用户令牌信息\n *\n *"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ParsedToken.java",
    "chars": 1068,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.springframework.http.HttpHeaders;\n\nimport java.util.func"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ReactiveTokenAuthenticationSupplier.java",
    "chars": 860,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport lombok.AllArgsConstructor;\nimport org.hswebframework.web.aut"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/SimpleParsedToken.java",
    "chars": 600,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lomb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ThirdPartAuthenticationManager.java",
    "chars": 491,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.hswebframework.web.authorization.Authentication;\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/ThirdPartReactiveAuthenticationManager.java",
    "chars": 467,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.hswebframework.web.authorization.Authentication;\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/TokenAuthenticationManager.java",
    "chars": 786,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.hswebframework.web.authorization.Authentication;\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/TokenState.java",
    "chars": 762,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport org."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserToken.java",
    "chars": 2150,
    "preview": "package org.hswebframework.web.authorization.token;\n\n\nimport org.hswebframework.web.authorization.User;\nimport org.hsweb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenAuthenticationSupplier.java",
    "chars": 2677,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.hswebframework.web.authorization.*;\nimport org.springfra"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenBeforeCreateEvent.java",
    "chars": 397,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lomb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenHolder.java",
    "chars": 573,
    "preview": "package org.hswebframework.web.authorization.token;\n\n\nimport org.hswebframework.web.context.ContextHolder;\nimport reacto"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenManager.java",
    "chars": 4100,
    "preview": "/*\n *  Copyright 2020 http://www.hswebframework.org\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenReactiveAuthenticationSupplier.java",
    "chars": 3777,
    "preview": "package org.hswebframework.web.authorization.token;\n\nimport org.hswebframework.web.authorization.Authentication;\nimport "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/event/UserTokenChangedEvent.java",
    "chars": 648,
    "preview": "package org.hswebframework.web.authorization.token.event;\n\nimport org.hswebframework.web.authorization.events.Authorizat"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/event/UserTokenCreatedEvent.java",
    "chars": 533,
    "preview": "package org.hswebframework.web.authorization.token.event;\n\nimport org.hswebframework.web.authorization.events.Authorizat"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/event/UserTokenRemovedEvent.java",
    "chars": 599,
    "preview": "package org.hswebframework.web.authorization.token.event;\n\nimport org.hswebframework.web.authorization.events.Authorizat"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/RedisTokenAuthenticationManager.java",
    "chars": 2256,
    "preview": "package org.hswebframework.web.authorization.token.redis;\n\nimport org.hswebframework.web.authorization.Authentication;\ni"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/RedisUserTokenManager.java",
    "chars": 15480,
    "preview": "package org.hswebframework.web.authorization.token.redis;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.hswebf"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/SimpleAuthenticationUserToken.java",
    "chars": 505,
    "preview": "package org.hswebframework.web.authorization.token.redis;\n\nimport lombok.AllArgsConstructor;\nimport org.hswebframework.w"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/redis/SimpleUserToken.java",
    "chars": 1519,
    "preview": "package org.hswebframework.web.authorization.token.redis;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorToken.java",
    "chars": 244,
    "preview": "package org.hswebframework.web.authorization.twofactor;\n\nimport java.io.Serializable;\n\n/**\n * @author zhouhao\n * @since "
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorTokenManager.java",
    "chars": 205,
    "preview": "package org.hswebframework.web.authorization.twofactor;\n\n/**\n * @author zhouhao\n * @since 3.0.4\n */\npublic interface Two"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorValidator.java",
    "chars": 533,
    "preview": "package org.hswebframework.web.authorization.twofactor;\n\n/**\n * 双重验证器,用于某些接口需要双重验证时使用,如: 短信验证码,动态口令等\n *\n * @author zhouh"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorValidatorManager.java",
    "chars": 338,
    "preview": "package org.hswebframework.web.authorization.twofactor;\n\n/**\n * 双重验证管理器\n * @author zhouhao\n * @since 3.0.4\n */\npublic in"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/TwoFactorValidatorProvider.java",
    "chars": 257,
    "preview": "package org.hswebframework.web.authorization.twofactor;\n\n/**\n * @author zhouhao\n * @since 3.0.4\n */\npublic interface Two"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/DefaultTwoFactorValidator.java",
    "chars": 952,
    "preview": "package org.hswebframework.web.authorization.twofactor.defaults;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/DefaultTwoFactorValidatorManager.java",
    "chars": 1267,
    "preview": "package org.hswebframework.web.authorization.twofactor.defaults;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/DefaultTwoFactorValidatorProvider.java",
    "chars": 1100,
    "preview": "package org.hswebframework.web.authorization.twofactor.defaults;\n\nimport lombok.Getter;\nimport org.hswebframework.web.au"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/HashMapTwoFactorTokenManager.java",
    "chars": 2345,
    "preview": "package org.hswebframework.web.authorization.twofactor.defaults;\n\nimport org.hswebframework.web.authorization.twofactor."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/twofactor/defaults/UnsupportedTwoFactorValidator.java",
    "chars": 653,
    "preview": "package org.hswebframework.web.authorization.twofactor.defaults;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/java9/module-info.java",
    "chars": 1470,
    "preview": "module hsweb.authorization.api {\n    requires spring.core;\n    requires hsweb.core;\n    requires spring.beans;\n    requi"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/resources/META-INF/services/io.micrometer.context.ThreadLocalAccessor",
    "chars": 78,
    "preview": "org.hswebframework.web.authorization.context.AuthenticationThreadLocalAccessor"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 81,
    "preview": "org.hswebframework.web.authorization.simple.DefaultAuthorizationAutoConfiguration"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/resources/i18n/authentication/messages_en.properties",
    "chars": 773,
    "preview": "error.access_denied=Access Denied\nerror.permission_denied=Permission Denied [{0}]:{1}\nerror.logged_in_elsewhere=User log"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/main/resources/i18n/authentication/messages_zh.properties",
    "chars": 548,
    "preview": "error.access_denied=权限不足,拒绝访问!\nerror.permission_denied=当前用户无权限[{0}]:{1}\nerror.logged_in_elsewhere=该用户已在其他地方登陆\nerror.ille"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/AuthenticationTests.java",
    "chars": 5734,
    "preview": "package org.hswebframework.web.authorization;\n\nimport org.hswebframework.web.authorization.builder.AuthenticationBuilder"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/UserTokenManagerTests.java",
    "chars": 5079,
    "preview": "package org.hswebframework.web.authorization;\n\nimport org.hswebframework.web.authorization.exception.AccessDenyException"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/context/AuthenticationThreadLocalAccessorTest.java",
    "chars": 1489,
    "preview": "package org.hswebframework.web.authorization.context;\n\nimport org.hswebframework.web.authorization.Authentication;\nimpor"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/define/MergedAuthorizeDefinitionTest.java",
    "chars": 954,
    "preview": "package org.hswebframework.web.authorization.define;\n\nimport org.junit.Assert;\nimport org.junit.Test;\n\nimport java.util."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/simple/DefaultDimensionManagerTest.java",
    "chars": 2241,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.Dimension;\nimport org."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/simple/SimpleAuthenticationTest.java",
    "chars": 34329,
    "preview": "package org.hswebframework.web.authorization.simple;\n\nimport org.hswebframework.web.authorization.*;\nimport org.hswebfra"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/token/redis/RedisUserTokenManagerTest.java",
    "chars": 5784,
    "preview": "package org.hswebframework.web.authorization.token.redis;\n\nimport lombok.SneakyThrows;\nimport org.hswebframework.web.aut"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/twofactor/defaults/HashMapTwoFactorTokenManagerTest.java",
    "chars": 793,
    "preview": "package org.hswebframework.web.authorization.twofactor.defaults;\n\nimport lombok.SneakyThrows;\nimport org.hswebframework."
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-api/token.md",
    "chars": 56,
    "preview": "# 用户令牌管理\n用于管理已授权的用户,并这些用户进行操作,如: 统计人数,踢下线,禁止多地点同时登录等操作\n\n"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/README.md",
    "chars": 2563,
    "preview": "# 权限控制基础实现\n\n1. 实现RBAC权限控制\n2. 实现数据权限控制\n3. 可动态进行权限配置设置\n\n\n## 授权\n使用`hsweb-authorization-api`提供的监听器,类`UserOnSignIn`监听用户授权事件`A"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/pom.xml",
    "chars": 3629,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/AopAuthorizingController.java",
    "chars": 8564,
    "preview": "package org.hswebframework.web.authorization.basic.aop;\n\nimport lombok.SneakyThrows;\nimport lombok.extern.slf4j.Slf4j;\ni"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/AopMethodAuthorizeDefinitionCustomizerParser.java",
    "chars": 480,
    "preview": "package org.hswebframework.web.authorization.basic.aop;\n\nimport org.hswebframework.web.aop.MethodInterceptorContext;\nimp"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/AopMethodAuthorizeDefinitionParser.java",
    "chars": 815,
    "preview": "package org.hswebframework.web.authorization.basic.aop;\n\nimport org.hswebframework.web.aop.MethodInterceptorContext;\nimp"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/DefaultAopMethodAuthorizeDefinitionParser.java",
    "chars": 4485,
    "preview": "package org.hswebframework.web.authorization.basic.aop;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.extern.slf4j.Slf"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/AopAuthorizeAutoConfiguration.java",
    "chars": 1843,
    "preview": "package org.hswebframework.web.authorization.basic.configuration;\n\nimport org.hswebframework.web.authorization.basic.aop"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/AuthorizingHandlerAutoConfiguration.java",
    "chars": 4658,
    "preview": "package org.hswebframework.web.authorization.basic.configuration;\n\nimport org.hswebframework.web.authorization.Authentic"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/BasicAuthorizationTokenParser.java",
    "chars": 3658,
    "preview": "package org.hswebframework.web.authorization.basic.configuration;\n\nimport org.apache.commons.codec.binary.Base64;\nimport"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/EnableAopAuthorize.java",
    "chars": 670,
    "preview": "package org.hswebframework.web.authorization.basic.configuration;\n\nimport org.springframework.boot.autoconfigure.ImportA"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/configuration/WebMvcAuthorizingConfiguration.java",
    "chars": 2722,
    "preview": "package org.hswebframework.web.authorization.basic.configuration;\n\nimport org.hswebframework.web.authorization.basic.aop"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/AopAuthorizeDefinitionParser.java",
    "chars": 4668,
    "preview": "package org.hswebframework.web.authorization.basic.define;\n\nimport org.hswebframework.web.authorization.annotation.*;\nim"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java",
    "chars": 4645,
    "preview": "package org.hswebframework.web.authorization.basic.define;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport l"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/EmptyAuthorizeDefinition.java",
    "chars": 1197,
    "preview": "package org.hswebframework.web.authorization.basic.define;\n\nimport lombok.AccessLevel;\nimport lombok.NoArgsConstructor;\n"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/MergedAuthorizeDefinition.java",
    "chars": 607,
    "preview": "package org.hswebframework.web.authorization.basic.define;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.hsweb"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationInfo.java",
    "chars": 3519,
    "preview": "package org.hswebframework.web.authorization.basic.embed;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.hswebf"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationManager.java",
    "chars": 1060,
    "preview": "package org.hswebframework.web.authorization.basic.embed;\n\nimport org.hswebframework.web.authorization.Authentication;\ni"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationProperties.java",
    "chars": 3104,
    "preview": "package org.hswebframework.web.authorization.basic.embed;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.apache"
  },
  {
    "path": "hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedReactiveAuthenticationManager.java",
    "chars": 1528,
    "preview": "package org.hswebframework.web.authorization.basic.embed;\n\nimport lombok.AllArgsConstructor;\nimport org.apache.commons.c"
  }
]

// ... and 584 more files (download for full content)

About this extraction

This page contains the full source code of the hs-web/hsweb-framework GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 784 files (1.8 MB), approximately 447.5k tokens, and a symbol index with 3974 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!