nacos namespace 可以用作区分不同环境 nacos group 可以作为业务组区分
config/mall-common.yaml为公共配置,需要放到Nacos Config,DataId为mall-common.yaml config/mall-xxx.yaml为各个项目的配置,同样需要放到Nacos Config,DataId为mall-xxx.yaml
spring.cloud.nacos.discovery.server-addr=http://localhost:8848 spring.cloud.nacos.discovery.namespace=test spring.cloud.nacos.discovery.group=XXX_GROUP spring.cloud.nacos.config.namespace=test spring.cloud.nacos.config.group=XXX_GROUP
spring:
cloud:
nacos:
discovery:
namespace: test
group: XXX_GROUP
server-addr: http://localhost:8848
config:
namespace: test
group: XXX_GROUP
动态刷新配置的注解@RefreshScope
https://blog.csdn.net/qq_36525300/article/details/120224966 Nacos 自带 spring-cloud-starter-netflix-ribbon,而 Netflix 的 Ribbon 已进入维护阶段,从最新的 SpringCloud 2020 版本开始就需要改用 Spring cloud loadbalancer
访问http://localhost:9999/mall-admin-web/echo/demo_name 网关即会将请求转发到服务ID为mall-admin-web 的服务,本例是http://localhost:8802/echo/demo_name,转发前去掉mall-admin-web前缀
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
项目使用JWT实现access_token,关于access_token生成步骤的配置如下:
生成密钥库
使用JDK工具的keytool生成JKS密钥库(Java Key Store),并将jwt.jks放到resources目录
keytool -genkey -alias jwt -keyalg RSA -keypass 123456 -keystore jwt.jks -storepass 123456
获取公钥 keytool -list -rfc --keystore meeleet.jks | openssl x509 -inform pem -pubkey
mysql2h2-converter-tool-0.2.2.jar 可以将mysql的SQL转为H2支持的SQL
请求头 Authorization => Basic Y2xpZW50OjEyMzQ1Ng== Y2xpZW50OjEyMzQ1Ng== 是 client_id:client_secret的base64编码结果
/**
* OpenAPI 配置
*
* @Author jaychang
* @Version 1.0.0
*/
@SecurityScheme(name = "securityAuth", type = SecuritySchemeType.OAUTH2,
flows = @OAuthFlows(
password = @OAuthFlow(
tokenUrl = "${springdoc.oAuthFlow.tokenUrl}",
scopes = {@OAuthScope(name = "all", description = "all scope")})
))
@Configuration
public class OpenAPI30Configuration implements WebMvcConfigurer {
@Bean
public OpenAPI customizeOpenAPI() {
OpenAPI openAPI = new OpenAPI();
openAPI.info(new Info().title("Auth API")
.description("Spring shop sample application")
.version("v1.0.0")
.license(new License().name("Apache 2.0").url("http://springdoc.org")))
.externalDocs(new ExternalDocumentation()
.description("SpringShop Wiki Documentation")
.url("https://springshop.wiki.github.org/docs"));
return openAPI;
}
}
# 如果仅仅是JWT Token,并没有用到OAuth2可以用以下代码
// 声明全局保持Token
// final String securitySchemeName = "bearerAuth";
// openAPI.addSecurityItem(new SecurityRequirement()
// .addList(securitySchemeName))
// .components(new Components()
// .addSecuritySchemes(securitySchemeName, new io.swagger.v3.oas.models.security.SecurityScheme()
// .name(securitySchemeName)
// .type(io.swagger.v3.oas.models.security.SecurityScheme.Type.HTTP)
// .scheme("bearer")
// .bearerFormat("JWT")));
http://localhost:9999/swagger-ui.html
http://localhost:9999/mall-admin-web/swagger-ui.html http://localhost:9999/mall-admin-web/swagger-ui/index.html 以上两种方式都可以
meeleet-auth复制到nacos config,会变成meeleet_auth,需要特别注意
那是因为验证码登录Authentication的类型,与用户名密码登录的Authentication的类型是一样的,都是UsernamePasswordAuthenticationToken, org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.supports
@Override
public boolean supports(Class<?> authentication) {
return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
}
故可以复用DaoAuthenticationProvider,无需自己定义一个Provider
举例:当app端、运营端、web端都需要grant_type=password的登录模式时,由于app端、web端与运营端是不同的用户体系,需要使用不同的UserDetailService
方法1: 定义不同的grant_type app端、web端定义grant_type = member_password 运营端定义grant_type = operator_password 定义多个Grant,再定义多个Provider 方法2: grant_type都一样,grant_type = password 参考com.meeleet.cloud.auth.security.extension.refresh.PreAuthenticatedUserDetailsService 根据不同client_id对应不同UserDetailService,定义一个UserDetailService代理类,代理不同client_id的UserDetailService 姑且就叫这个UserDetailService代理为MultipleUserDetailService
问题是client_id哪里可以得到呢?
看了OAuth2密码模式的认证流程,我们可以得知,需要自定义TokenGranter(在ResourceOwnerPasswordTokenGranter基础上增加client_id的信息)、因此也需要自定义AuthenticationToken(可继承UsernamePasswordAuthenticationToken,增加client_id信息)
,还需要自定义AuthenticationProvider(可继承DaoAuthenticationProvider,重写retrieveUser方法)
{
"code": "B0001",
"data": null,
"msg": "Unauthorized grant type: captcha"
}
则相应的client_id要配置相应的authorized_grant_types,若开发时觉得不便,可以去掉缓存注解
默认返回格式不是我们需要{"code":xxx,"data":{...},"msg":"zzz"}
自己写个Controller,定义一个/oauth/token方法,然后引入TokenEndpoint,方法内部直接调用它的postAccessToken方法 但是这样的话,TokenEndpoint内部定义的很多异常处理方法就失效了。无法通过自定义WebResponseExceptionTranslator来处理异常
不过也没什么关系,我们自己可以定义一个异常处理类(通过@RestControllerAdvice注解来实现),来依样画葫芦处理各种异常
自定义WebResponseExceptionTranslator来处理异常
minio版本降低到8.2.2
建议使用系统环境变量来设置,示例如下 spring.cloud.nacos.discovery.metadata.version=1.0 spring.cloud.nacos.discovery.metadata.weight=8