当前位置: 首页 > news >正文

网站怎么做rss/怎样申请网站

网站怎么做rss,怎样申请网站,株洲定制网站建设,夺宝网站还可以做吗这里我们一共要建三个包 auth-service-api&#xff1a;用户登录、鉴权和刷新token的接口层auth-service&#xff1a;接口的实现&#xff0c;以及jwt的引用gateway&#xff1a;网关集成jwt鉴权 auth-service-api 项目结构如下&#xff1a; pom <artifactId>auth-ser…

这里我们一共要建三个包

  • auth-service-api:用户登录、鉴权和刷新token的接口层
  • auth-service:接口的实现,以及jwt的引用
  • gateway:网关集成jwt鉴权

auth-service-api

项目结构如下:
在这里插入图片描述

  • pom
<artifactId>auth-service-api</artifactId>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>
  • Account
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Account implements Serializable {private String username;private String token;private String refreshToken;
}
  • AuthResponseCode

这里放一些响应代码

public class AuthResponseCode {public static final Long SUCCESS = 1L;public static final Long INCORRECT_PWD = 1000L;public static final Long USER_NOT_FOUND = 1001L;}
  • AuthResponse

定义一个响应VO

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AuthResponse {private Account account;private Long code;}
  • AuthService
@FeignClient("auth-service")
public interface AuthService {@PostMapping("/login")@ResponseBodypublic AuthResponse login(@RequestParam("username") String username,@RequestParam("password") String password);@GetMapping("/verify")public AuthResponse verify(@RequestParam("token") String token,@RequestParam("username") String username);@PostMapping("/refresh")@ResponseBodypublic AuthResponse refresh(@RequestParam("refresh") String refresh);}

auth-service

项目结构如下:
在这里插入图片描述

  • 配置文件
spring.application.name=auth-service
server.port=65100eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/logging.file=${spring.application.name}.logspring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379info.app.name=auth-service
info.app.description=testmanagement.security.enabled=false
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
  • pom
<artifactId>auth-service</artifactId>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- jwt --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.7.0</version></dependency><dependency><groupId>com.xxx</groupId><artifactId>auth-service-api</artifactId><version>${project.version}</version></dependency></dependencies>
  • AuthApplication启动类
@SpringBootApplication
@EnableEurekaClient
public class AuthApplication {public static void main(String[] args) {new SpringApplicationBuilder(AuthApplication.class).web(WebApplicationType.SERVLET).run(args);}
}
  • JwtService
@Slf4j
@Service
public class JwtService {private static final String KEY = "testKey";private static final String ISSUER = "Lyn";private static final long TOKEN_EXP_TIME = 60 * 1000;private static final String USER_NAME = "username";/*** 生成Token*/public String token(Account acct) {Date now = new Date();Algorithm algorithm = Algorithm.HMAC256(KEY);String token = JWT.create().withIssuer(ISSUER).withIssuedAt(now).withExpiresAt(new Date(now.getTime() + TOKEN_EXP_TIME)).withClaim(USER_NAME, acct.getUsername()).sign(algorithm);log.info("jwt generated user={}", acct.getUsername());return token;}/*** 校验Token*/public boolean verify(String token, String username) {log.info("verifying jwt - username={}", username);try {Algorithm algorithm = Algorithm.HMAC256(KEY);JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSUER).withClaim(USER_NAME, username).build();verifier.verify(token);return true;} catch (Exception e) {log.error("auth failed", e);return false;}}}
  • controller
@RestController
@Slf4j
public class Controller {@Autowiredprivate JwtService jwtService;@Autowiredprivate RedisTemplate redisTemplate;@PostMapping("/login")@ResponseBodypublic AuthResponse login(@RequestParam String username,@RequestParam String password) {Account account = Account.builder().username(username).build();// 这里应该验证username + password,我们跳过验证String token = jwtService.token(account);account.setToken(token);account.setRefreshToken(UUID.randomUUID().toString());redisTemplate.opsForValue().set(account.getRefreshToken(), account);return AuthResponse.builder().account(account).code(SUCCESS).build();}@PostMapping("/refresh")@ResponseBodypublic AuthResponse refresh(@RequestParam String refreshToken) {Account account = (Account) redisTemplate.opsForValue().get(refreshToken);if (account == null) {return AuthResponse.builder().code(USER_NOT_FOUND).build();}String jwt = jwtService.token(account);account.setToken(jwt);account.setRefreshToken(UUID.randomUUID().toString());redisTemplate.delete(refreshToken);redisTemplate.opsForValue().set(account.getRefreshToken(), account);return AuthResponse.builder().account(account).code(SUCCESS).build();}@GetMapping("/verify")public AuthResponse verify(@RequestParam String token,@RequestParam String username) {boolean success = jwtService.verify(token, username);return AuthResponse.builder().code(success ? AuthResponseCode.SUCCESS : AuthResponseCode.USER_NOT_FOUND).build();}
}

gateway

gateway的配置可参考《SpringBoot:Gateway引入初体验》,我们要做以下改造

  • pom引入auth-service-api
<!-- 因为spring cloud gateway是基于webflux的,
如果非要web支持的话需要导入spring-boot-starter-webflux而不是spring-boot-start-web-->
<dependency><groupId>com.xxx</groupId><artifactId>auth-service-api</artifactId><version>${project.version}</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></exclusion></exclusions>
</dependency>

我们配置一个自定义Filter

@Component("authFilter")
@Slf4j
public class AuthFilter implements GatewayFilter, Ordered {private static final String AUTH = "Authorization";private static final String USERNAME = "user-name";@Autowiredprivate AuthService authService;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("Auth start");ServerHttpRequest request = exchange.getRequest();HttpHeaders header = request.getHeaders();String token = header.getFirst(AUTH);String username = header.getFirst(USERNAME);ServerHttpResponse response = exchange.getResponse();if (StringUtils.isBlank(token)) {log.error("token not found");response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}AuthResponse resp = authService.verify(token, username);if (resp.getCode() != 1L) {log.error("invalid token");response.setStatusCode(HttpStatus.FORBIDDEN);return response.setComplete();}// TODO 将用户信息存放在请求header中传递给下游业务ServerHttpRequest.Builder mutate = request.mutate();mutate.header("user-name", username);ServerHttpRequest buildRequest = mutate.build();// TODO 如果响应中需要放数据,也可以放在response的header中response.setStatusCode(HttpStatus.OK);response.getHeaders().add("username",username);return chain.filter(exchange.mutate().request(buildRequest).response(response).build());}@Overridepublic int getOrder() {return 0;}
}

然后在过滤器配置中直接使用AuthFilter

@Configuration
public class GatewayConfiguration {@Autowiredprivate AuthFilter authFilter;@Bean@Orderpublic RouteLocator customizedRoutes(RouteLocatorBuilder builder) {return builder.routes().route(r -> r.path("/java/**").filters(f -> f.stripPrefix(1).filter(authFilter)).uri("lb://FEIGN-CLIENT")).build();}}

到这里,使用Gateway + JWT 实现微服务体系下的用户鉴权的基础逻辑就完成了!

http://www.jmfq.cn/news/5042881.html

相关文章:

  • 营销型网站建设易网拓/百度快照首页
  • wordpress建站/刷排名有百度手机刷排名
  • 建网站电话/网站推广优化招聘
  • 东莞手机网站建设/谁有恶意点击软件
  • 网站建设内容保障制度/个人发布信息的免费平台
  • 珠海cp网站建设/人工智能培训师
  • 可以做两个网站指向同一个域名/惠州网站推广排名
  • 绵阳科技网站建设/注册网站平台
  • 淘宝网站做淘宝客/2022年最近十大新闻
  • 网站建设框架模板/今天新疆新闻头条
  • 教我做网站/seo关键词优化排名外包
  • 南京公司网站建设平台/啦啦啦资源视频在线观看8
  • 网站 月15g流量够用吗/自己做网站难吗
  • 百度收录网站/营销模式有几种
  • 做暖暖免费视频网站/百度营销官网
  • 百度认证官方网站/2023年10月爆发新冠
  • 上海网站建设技术/友情链接百科
  • 网站icp备案认证怎么做/app如何推广以及推广渠道
  • 本地网站建设的步骤过程/谷歌排名查询
  • 网站建设找谁做/西安百度首页优化
  • 如何给网站做dns解析/教师遭网课入侵直播录屏曝光广场舞
  • 网站可信度验证/关键词seo优化
  • 1000M双线网站空间/怎么免费制作网页
  • 在线网站建设工程标准/seo培训网的优点是
  • 做企业网站收费多少/关键词seo如何优化
  • 如何查询网站域名备案信息/网站排名优化方法
  • 网站优化标准/网站内部seo
  • 视频网站/网络营销推广方案模板
  • 网页游戏大全找556pk游戏专业/郑州seo服务技术
  • 购物网站建设的思路/百度seo在线优化