日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Springboot WebFlux集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的示例

瀏覽:144日期:2023-03-19 11:19:38
1 簡(jiǎn)介

在之前的文章《Springboot集成Spring Security實(shí)現(xiàn)JWT認(rèn)證》講解了如何在傳統(tǒng)的Web項(xiàng)目中整合Spring Security和JWT,今天我們講解如何在響應(yīng)式WebFlux項(xiàng)目中整合。二者大體是相同的,主要區(qū)別在于Reactive WebFlux與傳統(tǒng)Web的區(qū)別。

2 項(xiàng)目整合

引入必要的依賴(lài):

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version></dependency>2.1 JWT工具類(lèi)

該工具類(lèi)主要功能是創(chuàng)建、校驗(yàn)、解析JWT。

@Componentpublic class JwtTokenProvider { private static final String AUTHORITIES_KEY = 'roles'; private final JwtProperties jwtProperties; private String secretKey; public JwtTokenProvider(JwtProperties jwtProperties) { this.jwtProperties = jwtProperties; } @PostConstruct public void init() { secretKey = Base64.getEncoder().encodeToString(jwtProperties.getSecretKey().getBytes()); } public String createToken(Authentication authentication) { String username = authentication.getName(); Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities(); Claims claims = Jwts.claims().setSubject(username); if (!authorities.isEmpty()) { claims.put(AUTHORITIES_KEY, authorities.stream().map(GrantedAuthority::getAuthority).collect(joining(','))); } Date now = new Date(); Date validity = new Date(now.getTime() + this.jwtProperties.getValidityInMs()); return Jwts.builder().setClaims(claims).setIssuedAt(now).setExpiration(validity).signWith(SignatureAlgorithm.HS256, this.secretKey).compact(); } public Authentication getAuthentication(String token) { Claims claims = Jwts.parser().setSigningKey(this.secretKey).parseClaimsJws(token).getBody(); Object authoritiesClaim = claims.get(AUTHORITIES_KEY); Collection<? extends GrantedAuthority> authorities = authoritiesClaim == null ? AuthorityUtils.NO_AUTHORITIES: AuthorityUtils.commaSeparatedStringToAuthorityList(authoritiesClaim.toString()); User principal = new User(claims.getSubject(), '', authorities); return new UsernamePasswordAuthenticationToken(principal, token, authorities); } public boolean validateToken(String token) { try { Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token); if (claims.getBody().getExpiration().before(new Date())) {return false; } return true; } catch (JwtException | IllegalArgumentException e) { throw new InvalidJwtAuthenticationException('Expired or invalid JWT token'); } }}2.2 JWT的過(guò)濾器

這個(gè)過(guò)濾器的主要功能是從請(qǐng)求中獲取JWT,然后進(jìn)行校驗(yàn),如何成功則把Authentication放進(jìn)ReactiveSecurityContext里去。當(dāng)然,如果沒(méi)有帶相關(guān)的請(qǐng)求頭,那可能是通過(guò)其它方式進(jìn)行鑒權(quán),則直接放過(guò),讓它進(jìn)入下一個(gè)Filter。

public class JwtTokenAuthenticationFilter implements WebFilter { public static final String HEADER_PREFIX = 'Bearer '; private final JwtTokenProvider tokenProvider; public JwtTokenAuthenticationFilter(JwtTokenProvider tokenProvider) { this.tokenProvider = tokenProvider; } @Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { String token = resolveToken(exchange.getRequest()); if (StringUtils.hasText(token) && this.tokenProvider.validateToken(token)) { Authentication authentication = this.tokenProvider.getAuthentication(token); return chain.filter(exchange) .subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication)); } return chain.filter(exchange); } private String resolveToken(ServerHttpRequest request) { String bearerToken = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(HEADER_PREFIX)) { return bearerToken.substring(7); } return null; }}2.3 Security的配置

這里設(shè)置了兩個(gè)異常處理authenticationEntryPoint和accessDeniedHandler。

@Configurationpublic class SecurityConfig { @Bean SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http,JwtTokenProvider tokenProvider,ReactiveAuthenticationManager reactiveAuthenticationManager) { return http.csrf(ServerHttpSecurity.CsrfSpec::disable).httpBasic(ServerHttpSecurity.HttpBasicSpec::disable).authenticationManager(reactiveAuthenticationManager).exceptionHandling().authenticationEntryPoint( (swe, e) -> { swe.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return swe.getResponse().writeWith(Mono.just(new DefaultDataBufferFactory().wrap('UNAUTHORIZED'.getBytes()))); }).accessDeniedHandler((swe, e) -> { swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN); return swe.getResponse().writeWith(Mono.just(new DefaultDataBufferFactory().wrap('FORBIDDEN'.getBytes()))); }).and().securityContextRepository(NoOpServerSecurityContextRepository.getInstance()).authorizeExchange(it -> it .pathMatchers(HttpMethod.POST, '/auth/login').permitAll() .pathMatchers(HttpMethod.GET, '/admin').hasRole('ADMIN') .pathMatchers(HttpMethod.GET, '/user').hasRole('USER') .anyExchange().permitAll()).addFilterAt(new JwtTokenAuthenticationFilter(tokenProvider), SecurityWebFiltersOrder.HTTP_BASIC).build(); } @Bean public ReactiveAuthenticationManager reactiveAuthenticationManager(CustomUserDetailsService userDetailsService, PasswordEncoder passwordEncoder) { UserDetailsRepositoryReactiveAuthenticationManager authenticationManager = new UserDetailsRepositoryReactiveAuthenticationManager(userDetailsService); authenticationManager.setPasswordEncoder(passwordEncoder); return authenticationManager; }}2.4 獲取JWT的Controller

先判斷對(duì)用戶(hù)密碼進(jìn)行判斷,如果正確則返回對(duì)應(yīng)的權(quán)限用戶(hù),根據(jù)用戶(hù)生成JWT,再返回給客戶(hù)端。

@RestController@RequestMapping('/auth')public class AuthController { @Autowired ReactiveAuthenticationManager authenticationManager; @Autowired JwtTokenProvider jwtTokenProvider; @PostMapping('/login') public Mono<String> login(@RequestBody AuthRequest request) { String username = request.getUsername(); Mono<Authentication> authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, request.getPassword())); return authentication.map(auth -> jwtTokenProvider.createToken(auth)); }}3 總結(jié)

其它與之前的大同小異,不一一講解了。

代碼請(qǐng)查看:https://github.com/LarryDpk/pkslow-samples

以上就是Springboot WebFlux集成Spring Security實(shí)現(xiàn)JWT認(rèn)證的示例的詳細(xì)內(nèi)容,更多關(guān)于Springboot WebFlux集成Spring Security的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久av一区| 91精品一区二区三区综合| 99精品视频精品精品视频| 国产精品流白浆在线观看| 国产精品最新| 国产高清视频一区二区| 你懂的亚洲视频| 日韩成人a**站| 亚洲成人精品| 夜夜精品视频| 亚洲字幕久久| 久久精品天堂| 精品在线91| 日韩中文字幕无砖| 久久的色偷偷| 欧美aa在线观看| 免播放器亚洲| 日本a级不卡| 蜜桃久久久久| 99久久夜色精品国产亚洲1000部| 91久久久久| 国产精品午夜一区二区三区| www在线观看黄色| 黄色亚洲大片免费在线观看| 日韩国产欧美在线播放| 精品国产乱码久久久久久1区2匹| 久久网站免费观看| 日韩高清在线不卡| 日韩免费久久| 日本一区福利在线| 日本精品黄色| 视频在线观看91| 久久99精品久久久野外观看| 91一区二区三区四区| 一区二区视频欧美| 国产欧美一区| 欧美+亚洲+精品+三区| 亚州av一区| www.九色在线| 日韩福利视频一区| 久久人人精品| 国产亚洲久久| 婷婷综合五月| 精品中文字幕一区二区三区四区| 伊人久久大香线蕉av超碰演员| 日韩av中文在线观看| 久久三级视频| 国产精品成人**免费视频| 久久久国产亚洲精品| 欧美日韩亚洲国产精品| 激情欧美丁香| 开心激情综合| 亚洲精品一级| 国产高清一区二区| 精品久久国产一区| 日韩精品免费视频人成| 久久香蕉国产| 精品国产a一区二区三区v免费| 亚洲欧美日本视频在线观看| 国产中文在线播放| 欧美日韩一区二区国产 | 亚洲午夜黄色| 国产日产高清欧美一区二区三区| 欧美日韩视频| 999久久久国产精品| 精品视频91| 国产精品视频一区视频二区| 一区二区三区四区日韩| 99tv成人| 亚洲精品一区三区三区在线观看| 久久成人高清| 日韩av午夜在线观看| 日韩精品一二三四| 99成人在线| 99精品网站| 亚洲美女久久精品| 国产伊人久久| 国产乱码精品一区二区亚洲| 亚洲欧洲av| 老牛影视一区二区三区| 久久国产成人午夜av影院宅| 国产福利片在线观看| 麻豆视频一区二区| 国产精品视频一区二区三区四蜜臂 | 亚洲精品第一| 亚洲欧洲午夜| 亚洲精品一二三区区别| 1024精品久久久久久久久| 99久久www免费| 日本国产精品| 91精品国产成人观看| 少妇久久久久| 欧美 日韩 国产一区二区在线视频| 999久久久国产精品| 欧洲在线一区| 久久精品在线| 亚洲精品一二三区区别| 好吊一区二区三区| 丝袜美腿亚洲色图| 免费在线成人网| 亚洲a成人v| 国产亚洲高清一区| 久久亚洲人体| 中文在线а√天堂| 在线成人动漫av| 99在线精品视频在线观看 | 在线精品视频在线观看高清| 婷婷色综合网| 少妇精品久久久一区二区| 日韩精品第二页| 国产精品亚洲综合久久| 欧美1区二区| 成人精品视频| 国产婷婷精品| 中文字幕日韩高清在线| 日韩av一区二区三区| 欧美xxxx性| 久久黄色影院| 亚洲永久精品唐人导航网址| 欧美一区久久| 国产66精品| 亚洲成人精选| 国产日产高清欧美一区二区三区| 精品精品久久| 伊人精品视频| 欧美天堂一区二区| 水蜜桃久久夜色精品一区| 99精品在线观看| 伊人久久一区| 国产精品一线天粉嫩av| 日韩av片子| 先锋影音国产一区| 久久成人av| 午夜久久久久| 国产美女亚洲精品7777| 日韩在线中文| 视频国产精品| 在线中文字幕播放| 无码日韩精品一区二区免费| 美女av一区| 一区在线观看| 久久只有精品| 国产精品丝袜xxxxxxx| 欧美精品91| 欧美日韩国产高清电影| 国产欧美日韩免费观看| 精品一区在线| 老司机精品在线| 视频一区在线视频| 国产在线一区不卡| 最新国产精品视频| 亚洲精品国产嫩草在线观看| 日本国产欧美| 伊人久久成人| 国产精品yjizz视频网| 自拍自偷一区二区三区| caoporn视频在线| 日韩av中文字幕一区二区三区| 久久理论电影| 精品中国亚洲| 日韩欧美高清一区二区三区| 久久久一二三| 精品中文在线| 青青在线精品| 在线视频日韩| 久久精品动漫| 三上亚洲一区二区| 国产欧美一区二区三区米奇| 亚洲制服少妇| 高清av不卡| 精品一区二区三区视频在线播放| 香蕉久久久久久久av网站| 激情国产在线| 捆绑调教美女网站视频一区| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品国产三级国产在线观看| 日韩精品视频在线看| 伊人久久成人| 91精品一区二区三区综合在线爱| 精品久久影院| 国产精品蜜月aⅴ在线| 免费成人在线影院| 蜜臀av免费一区二区三区| 成人国产精品一区二区网站| 欧美一级二区| 亚洲免费观看高清完整版在线观| 亚洲综合中文| 成人一区而且| 日韩欧美美女在线观看| 日韩电影免费网址| 精品视频91| 久久不卡国产精品一区二区| 日韩精品欧美精品| 午夜亚洲福利| 香蕉视频成人在线观看| 欧美日韩激情| 激情综合网址| 激情久久五月| 蜜臀av免费一区二区三区| 国产成人精品亚洲日本在线观看|