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,全响应式的后台管理框架
[](https://codecov.io/gh/hs-web/hsweb-framework/branch/master)
[](https://travis-ci.com/hs-web/hsweb-framework)
[](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)
[](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<User> 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>
* @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"))
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
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[ -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.