diff --git a/seqdata-cloud-authz/pom.xml b/seqdata-cloud-authz/pom.xml index b510dd95acbf7b73556a07f6673e19399e7924a5..533b22559d889854c909407ed074bb7423be2d7b 100644 --- a/seqdata-cloud-authz/pom.xml +++ b/seqdata-cloud-authz/pom.xml @@ -58,5 +58,16 @@ mssql-jdbc runtime + + + mysql + mysql-connector-java + runtime + + + com.alibaba + druid-spring-boot-starter + 1.1.20 + diff --git a/seqdata-cloud-authz/src/main/java/cn/seqdata/oauth2/AuthzServerConfiguration.java b/seqdata-cloud-authz/src/main/java/cn/seqdata/oauth2/AuthzServerConfiguration.java index 159bd9cf608125c5ad18a040f6fe47b73d761422..8aa2bf47c76112815f1873e06911afa8494cd086 100644 --- a/seqdata-cloud-authz/src/main/java/cn/seqdata/oauth2/AuthzServerConfiguration.java +++ b/seqdata-cloud-authz/src/main/java/cn/seqdata/oauth2/AuthzServerConfiguration.java @@ -1,7 +1,15 @@ package cn.seqdata.oauth2; -import java.util.*; - +import cn.seqdata.oauth2.jpa.rbac.User; +import cn.seqdata.oauth2.mobile.MobileNonceAuthenticationProvider; +import cn.seqdata.oauth2.mobile.MobileNonceService; +import cn.seqdata.oauth2.mobile.MobileTokenGranter; +import cn.seqdata.oauth2.repos.oauth.ClientDetailRepo; +import cn.seqdata.oauth2.service.JpaClientDetailsService; +import cn.seqdata.oauth2.service.JpaUserDetailsManager; +import cn.seqdata.oauth2.service.UserService; +import cn.seqdata.oauth2.util.SecurityUtils; +import lombok.AllArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -29,8 +37,8 @@ import org.springframework.security.oauth2.provider.token.AuthorizationServerTok import org.springframework.security.oauth2.provider.token.TokenEnhancer; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; -import lombok.AllArgsConstructor; +import java.util.*; import cn.seqdata.oauth2.jpa.rbac.User; import cn.seqdata.oauth2.mobile.MobileNonceAuthenticationProvider; import cn.seqdata.oauth2.mobile.MobileNonceHandler; @@ -49,6 +57,59 @@ import cn.seqdata.oauth2.util.SecurityUtils; @EnableAuthorizationServer @AllArgsConstructor public class AuthzServerConfiguration extends AuthorizationServerConfigurerAdapter { + private final AuthenticationManager authenticationManager; + private final UserService userService; + private final JpaUserDetailsManager userDetailsService; + private final RedisConnectionFactory redisConnectionFactory; + private final ClientDetailRepo clientDetailRepo; + private final MobileNonceService mobileNonceService; + + @Bean + public PasswordEncoder passwordEncoder() { + return NoOpPasswordEncoder.getInstance(); +// return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } + + @Bean + public TokenStore tokenStore() { + RedisTokenStore redisTokenStore = new RedisTokenStore(redisConnectionFactory); + // 解决每次生成的token都一样的问题 + redisTokenStore.setAuthenticationKeyGenerator(oAuth2Authentication -> UUID.randomUUID().toString()); + return redisTokenStore; + } + + @Bean + public TokenEnhancer tokenEnhancer() { + return (accessToken, authentication) -> { + if (accessToken instanceof DefaultOAuth2AccessToken) { + Map attributes = new HashMap<>(); + + String clientId = SecurityUtils.clientId(authentication); + String username = SecurityUtils.username(authentication); + User user = userService.loadUser(clientId, username); + + if (Objects.nonNull(user)) { + attributes.put("user_id", user.getId()); + attributes.put("org_id", user.getOrgId()); + } + + ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(attributes); + } + + return accessToken; + }; + } + + @Override + public void configure(AuthorizationServerSecurityConfigurer security) { + security + .tokenKeyAccess("isAuthenticated()") + .checkTokenAccess("isAuthenticated()"); + } + + @Override + public void configure(ClientDetailsServiceConfigurer clients) throws Exception { + clients.withClientDetails(new JpaClientDetailsService(clientDetailRepo)); private final AuthenticationManager authenticationManager; private final UserService userService; private final JpaUserDetailsManager userDetailsService; @@ -116,43 +177,43 @@ public class AuthzServerConfiguration extends AuthorizationServerConfigurerAdapt // registrationRepository.forEach(clientRegistration -> builder // .withClient(clientRegistration.getRegistrationId()) // .authorizedGrantTypes(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())); - } - - @Override - public void configure(AuthorizationServerEndpointsConfigurer endpoints) { - endpoints - .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST) - .authenticationManager(authenticationManager) - .userDetailsService(userDetailsService) - .tokenStore(tokenStore()) - .tokenEnhancer(tokenEnhancer()) - .tokenGranter(tokenGranter(endpoints)); - } - - /** - * 重写 AuthorizationServerEndpointsConfigurer.createDefaultTokenServices,添加 NonceTokenGranter - */ - private TokenGranter tokenGranter(AuthorizationServerEndpointsConfigurer endpoints) { - ClientDetailsService clientDetails = endpoints.getClientDetailsService(); - AuthorizationServerTokenServices tokenServices = endpoints.getTokenServices(); - AuthorizationCodeServices authorizationCodeServices = endpoints.getAuthorizationCodeServices(); - OAuth2RequestFactory requestFactory = endpoints.getOAuth2RequestFactory(); - - List tokenGranters = new ArrayList<>(); - tokenGranters.add(new AuthorizationCodeTokenGranter(tokenServices, authorizationCodeServices, clientDetails, requestFactory)); - tokenGranters.add(new RefreshTokenGranter(tokenServices, clientDetails, requestFactory)); - tokenGranters.add(new ImplicitTokenGranter(tokenServices, clientDetails, requestFactory)); - tokenGranters.add(new ClientCredentialsTokenGranter(tokenServices, clientDetails, requestFactory)); - //用户名密码验证 - if(Objects.nonNull(authenticationManager)) { - tokenGranters.add(new ResourceOwnerPasswordTokenGranter(authenticationManager, tokenServices, clientDetails, requestFactory)); - } - //自定义的手机验证码登录 - if(Objects.nonNull(mobileNonceHandler)) { - MobileNonceAuthenticationProvider authenticationProvider = new MobileNonceAuthenticationProvider(mobileNonceHandler); - tokenGranters.add(new MobileTokenGranter(authenticationProvider, tokenServices, clientDetails, requestFactory)); - } - - return new CompositeTokenGranter(tokenGranters); - } + } + + @Override + public void configure(AuthorizationServerEndpointsConfigurer endpoints) { + endpoints + .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST) + .authenticationManager(authenticationManager) + .userDetailsService(userDetailsService) + .tokenStore(tokenStore()) + .tokenEnhancer(tokenEnhancer()) + .tokenGranter(tokenGranter(endpoints)); + } + + /** + * 重写 AuthorizationServerEndpointsConfigurer.createDefaultTokenServices,添加 NonceTokenGranter + */ + private TokenGranter tokenGranter(AuthorizationServerEndpointsConfigurer endpoints) { + ClientDetailsService clientDetails = endpoints.getClientDetailsService(); + AuthorizationServerTokenServices tokenServices = endpoints.getTokenServices(); + AuthorizationCodeServices authorizationCodeServices = endpoints.getAuthorizationCodeServices(); + OAuth2RequestFactory requestFactory = endpoints.getOAuth2RequestFactory(); + + List tokenGranters = new ArrayList<>(); + tokenGranters.add(new AuthorizationCodeTokenGranter(tokenServices, authorizationCodeServices, clientDetails, requestFactory)); + tokenGranters.add(new RefreshTokenGranter(tokenServices, clientDetails, requestFactory)); + tokenGranters.add(new ImplicitTokenGranter(tokenServices, clientDetails, requestFactory)); + tokenGranters.add(new ClientCredentialsTokenGranter(tokenServices, clientDetails, requestFactory)); + //用户名密码验证 + if (Objects.nonNull(authenticationManager)) { + tokenGranters.add(new ResourceOwnerPasswordTokenGranter(authenticationManager, tokenServices, clientDetails, requestFactory)); + } + //自定义的手机验证码登录 + if (Objects.nonNull(mobileNonceService)) { + MobileNonceAuthenticationProvider authenticationProvider = new MobileNonceAuthenticationProvider(mobileNonceService); + tokenGranters.add(new MobileTokenGranter(authenticationProvider, tokenServices, clientDetails, requestFactory)); + } + + return new CompositeTokenGranter(tokenGranters); + } } diff --git a/seqdata-cloud-authz/src/main/resources/bootstrap.yml b/seqdata-cloud-authz/src/main/resources/bootstrap.yml index b06fcb6db62c66fefdea204686f50929655becce..620f47e3c0b3c4259a6ed1225724206a57cbfbf6 100644 --- a/seqdata-cloud-authz/src/main/resources/bootstrap.yml +++ b/seqdata-cloud-authz/src/main/resources/bootstrap.yml @@ -1,12 +1,19 @@ spring: application: - name: authz + name: ${APPLICATION_NAME:authz} cloud: + gateway: + discovery: + locator: + enabled: true nacos: - config: - server-addr: nacos.seqdata.cn:8848 - file-extension: yml discovery: - server-addr: nacos.seqdata.cn:8848 -server: - port: 30001 \ No newline at end of file + server-addr: ${NACOS_SERVICE_HOST:192.168.1.241}:${NACOS_SERVICE_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: ${CONFIG_FORMAT:yml} + # 公共文件 + shared-configs[0]: + data-id: ${SHARE_CONFIG_PREFIX:application}.${spring.cloud.nacos.config.file-extension} + # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false + refresh: false \ No newline at end of file diff --git a/seqdata-cloud-gateway/src/main/resources/bootstrap.yml b/seqdata-cloud-gateway/src/main/resources/bootstrap.yml index 02780cf4cf6e8596158fababb2a7f10c0c7cb27b..9ff0490f81069f5a30ac5a42641016dee7a4dc00 100644 --- a/seqdata-cloud-gateway/src/main/resources/bootstrap.yml +++ b/seqdata-cloud-gateway/src/main/resources/bootstrap.yml @@ -1,14 +1,19 @@ spring: application: - name: gateway + name: ${APPLICATION_NAME:gateway} cloud: gateway: discovery: locator: enabled: true nacos: - config: - server-addr: nacos.seqdata.cn:8848 - file-extension: yml discovery: - server-addr: nacos.seqdata.cn:8848 \ No newline at end of file + server-addr: ${NACOS_SERVICE_HOST:192.168.1.241}:${NACOS_SERVICE_PORT:8848} + config: + server-addr: ${spring.cloud.nacos.discovery.server-addr} + file-extension: ${CONFIG_FORMAT:yml} + # 公共文件 + shared-configs[0]: + data-id: ${SHARE_CONFIG_PREFIX:application}.${spring.cloud.nacos.config.file-extension} + # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false + refresh: false \ No newline at end of file