精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于國密SM4實現用戶認證&授權

安全 應用安全
Spring Security的PasswordEncoder是用于進行密碼加密和驗證的接口。它是一個密碼編碼器,用于將用戶的原始密碼轉換為安全的加密字符串,并在驗證過程中將加密后的密碼與用戶提供的密碼進行比較。

JWT生成和認證的基本流程

JWT(JSON Web Token),是目前比較流行的用戶身份驗證解決方案。 下面是一個簡化的時序圖,用于說明JWT生成和認證的基本流程。

圖片圖片

引入 Spring Security 依賴

Spring Security 是一個功能強大且高度可定制的安全框架。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

配置說明

在 Spring Security 配置文件中,我們通常需要做如下配置:

  • AuthenticationProvider實現類:用于自定義身份驗證邏輯;
  • Filter:用于驗證 token 有效性;
  • AuthenticationManager:用于接收并處理身份驗證請求;
  • PasswordEncoder:用于密碼加密和驗證;
  • SecurityFilterChain:過濾器鏈;

圖片圖片

自定義PasswordEncoder

Spring Security的PasswordEncoder是用于進行密碼加密和驗證的接口。它是一個密碼編碼器,用于將用戶的原始密碼轉換為安全的加密字符串,并在驗證過程中將加密后的密碼與用戶提供的密碼進行比較。PasswordEncoder接口的主要用于提供安全的密碼存儲和驗證機制,以防止用戶密碼泄露時被惡意使用。它是一種重要的安全性措施,用于保護用戶密碼的安全性。

Spring Security 提供了多種PasswordEncoder接口的實現類,包括:

  • BCryptPasswordEncoder:使用BCrypt算法進行密碼哈希和驗證。它是目前廣泛使用的密碼哈希算法之一,具有較高的安全性。
  • NoOpPasswordEncoder:不進行任何密碼編碼和哈希操作,即明文存儲密碼。不推薦在生產環境中使用,僅用于測試目的。
  • Pbkdf2PasswordEncoder:使用PBKDF2算法進行密碼哈希和驗證。它通過應用哈希函數多次迭代和鹽值,增加了密碼破解的難度。
  • MessageDigestPasswordEncoder:使用指定的消息摘要算法(如MD5、SHA-1、SHA-256等)進行密碼哈希和驗證。

使用國密(SM4)算法

<!-- SM4依賴 -->
<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk15to18</artifactId>
  <version>1.71</version>
</dependency>

自定義的 PasswordEncoder

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.nio.charset.StandardCharsets;
import java.util.Objects;

public class Sm4PasswordEncoder implements PasswordEncoder {

 // key長度必須為16
 private static final String KEY = "KeyMustBe16Size.";

 @Override
 public String encode(CharSequence rawPassword) {
return SmUtil.sm4(KEY.getBytes(StandardCharsets.UTF_8)).encryptHex(rawPassword.toString());
 }

 @Override
 public boolean matches(CharSequence rawPassword, String encodedPassword) {
return Objects.equals(rawPassword.toString(),
   SmUtil.sm4(KEY.getBytes(StandardCharsets.UTF_8)).decryptStr(encodedPassword, StandardCharsets.UTF_8));
 }
}

需要實現PasswordEncoder接口的encode()和matches()方法。encode()方法用于對明文密碼進行加密處理,matches()方法用于比較明文密碼與加密后的密碼是否匹配。

配置自定義的 PasswordEncoder

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
 // 其它代碼
 /**
  * 密碼加密方式配置
  */
 @Bean
 public PasswordEncoder passwordEncoder() {
  return new Sm4PasswordEncoder();
 }
}

自定義 Filter 驗證 token 有效性

實現UserDetailsService接口,用于獲取用戶詳細信息

import org.yian.springboot.demo.entity.User;
import org.yian.springboot.demo.service.RoleService;
import org.yian.springboot.demo.service.UserService;
import org.yian.springboot.demo.security.model.AuthUser;
import org.yian.springboot.demo.util.WebUtil;
import lombok.AllArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Service
@AllArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {

 @Resource
 private UserService userService;
 @Resource
 private RoleService roleService;

 @Override
 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  User user = userService.findByUsername(username);
if (Objects.isNull(user)) {
   throw new UsernameNotFoundException("用戶名或密碼錯誤!");
  }
  List<String> roleCodeList = roleService.findRoleCodesByUsername(username);
  List<GrantedAuthority> authorities = roleCodeList.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());
return new AuthUser(user.getId(), user.getRealName(), user.getAvatar(), user.getPhone(),
   user.getUsername(), user.getPassword(), authorities);
 }
}

UserDetailsServiceImpl類實現了UserDetailsService接口,重寫了loadUserByUsername方法,用于獲取用戶的詳細信息。

圖片圖片

其中AuthUser為自定義認證用戶信息類,代碼如下:

import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;

import java.util.Collection;

@Getter
public class AuthUser extends User {
 /**
  * 用戶ID
  */
 private final String userId;
 /**
  * 真實姓名
  */
 private final String realName;
 /**
  * 電話
  */
 private final String phone;
 /**
  * 頭像
  */
 private final String avatar;

 public AuthUser(String userId, String realName, String avatar, String phone, String username, String password,
     Collection<? extends GrantedAuthority> authorities) {
  super(username, password, true, true, true, true, authorities);
  this.userId = userId;
  this.realName = realName;
  this.avatar = avatar;
  this.phone = phone;
 }
}

AuthUser繼承org.springframework.security.core.userdetails.User,添加了一些業務屬性。

自定義 Filter 驗證 token 有效性:

import org.yian.springboot.demo.constant.AuthConstant;
import org.yian.springboot.demo.util.JwtUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 驗證token有效性
 */
@Slf4j
public class TokenFilter extends OncePerRequestFilter {

 @Resource
 private UserDetailsService userDetailsService;

 @Override
 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  String token = getToken(request);
if (StrUtil.isNotEmpty(token)) {
   // 從Token中獲取username
   String username = JwtUtil.getUsernameFromToken(token);
   // 根據username獲取用戶信息
   UserDetails userDetails = userDetailsService.loadUserByUsername(username);
   // 創建身份驗證對象
   Authentication authentication
    = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
   // 設置身份驗證對象
   SecurityContextHolder.getContext().setAuthentication(authentication);
  }
  // 過濾器鏈
  filterChain.doFilter(request, response);
 }

 private String getToken(HttpServletRequest request) {
  String bearerToken = request.getHeader("Authorization");
if (StrUtil.isNotEmpty(bearerToken) && bearerToken.startsWith(AuthConstant.AUTHORIZATION_BEARER)) {
   // 去掉令牌前綴
   return bearerToken.replace(AuthConstant.AUTHORIZATION_BEARER, StrUtil.EMPTY);
  }
return null;
 }
}

圖片圖片

配置自定義的自定義Filter:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
 // 其它代碼
 @Bean
 public TokenFilter tokenFilter() {
  return new TokenFilter();
 }
}

配置 AuthenticationProvider

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

 // 其它代碼

 @Resource
 private UserDetailsServiceImpl userDetailsService;

 @Bean
 public DaoAuthenticationProvider authenticationProvider() {
  DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
  authProvider.setUserDetailsService(userDetailsService);
  authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
 }
}

DaoAuthenticationProvider是Spring Security提供的一個身份驗證實現類,它使用數據庫中的用戶詳細信息和密碼加密器進行身份驗證。

配置 AuthenticationManager

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

 // 其它代碼

 @Bean
 public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
  return authConfig.getAuthenticationManager();
 }
}

配置過濾器鏈

自定義類,處理未經身份驗證或者身份驗證失敗的用戶訪問受保護資源時的行為。

import org.yian.springboot.demo.api.Result;
import org.yian.springboot.demo.api.ResultCode;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 處理未經身份驗證或者身份驗證失敗的用戶訪問受保護資源時的行為
 */
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
 @Override
 public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
  String msg = StrUtil.format("請求訪問:{},認證失敗,無法訪問系統資源", request.getRequestURI());
  response.setStatus(200);
  response.setContentType("application/json");
  response.setCharacterEncoding("utf-8");
  response.getWriter().print(JSONUtil.toJsonStr(Result.fail(ResultCode.UNAUTHORIZED, msg)));
 }
}

配置AuthenticationManager:

import org.yian.springboot.demo.security.crypto.Sm4PasswordEncoder;
import org.yian.springboot.demo.security.filter.TokenFilter;
import org.yian.springboot.demo.service.impl.UserDetailsServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import javax.annotation.Resource;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

 @Resource
 private UserDetailsServiceImpl userDetailsService;

 @Resource
 private AuthenticationEntryPoint authenticationEntryPoint;

 @Bean
 public DaoAuthenticationProvider authenticationProvider() {
  DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
  authProvider.setUserDetailsService(userDetailsService);
  authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
 }

 @Bean
 public TokenFilter tokenFilter() {
return new TokenFilter();
 }

 @Bean
 public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
return authConfig.getAuthenticationManager();
 }

 /**
  * 密碼加密方式配置
  */
 @Bean
 public PasswordEncoder passwordEncoder() {
return new Sm4PasswordEncoder();
 }

 @Bean
 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  // 啟用跨域資源共享(CORS)支持
  http.cors()
   .and()
   // 禁用跨站請求偽造(CSRF)保護
   .csrf().disable()
   // 配置異常處理和身份驗證入口點
   .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
   .and()
   // 配置會話管理和會話創建策略:不使用會話
   .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
   .and()
   // 配置請求授權規則
   .authorizeRequests().antMatchers("/api/test/**").permitAll()
   .antMatchers("/api/auth/**").permitAll()
   // 所有其他請求需要進行身份驗證
   .anyRequest().authenticated();

  // 配置用戶身份驗證邏輯
  http.authenticationProvider(authenticationProvider());

  // 在UsernamePasswordAuthenticationFilter過濾器之前添加TokenFilter
  http.addFilterBefore(tokenFilter(), UsernamePasswordAuthenticationFilter.class);

return http.build();
 }
}

登錄接口

import org.yian.springboot.demo.api.Result;
import org.yian.springboot.demo.security.model.AuthUser;
import org.yian.springboot.demo.util.JwtUtil;
import lombok.AllArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@AllArgsConstructor
@RequestMapping("/api/auth")
public class LoginController {

 private final AuthenticationManager authenticationManager;

 @PostMapping("/login")
 public Result<Map<String, Object>> login(String username, String password) {
  UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
  Authentication authentication = authenticationManager.authenticate(authenticationToken);
  SecurityContextHolder.getContext().setAuthentication(authentication);
  String token = JwtUtil.createToken(username, new HashMap<>());
  AuthUser authUser = (AuthUser) authentication.getPrincipal();

  Map<String, Object> resultMap = new HashMap<>(16);
  resultMap.put("token", token);
  resultMap.put("user", authUser);

return Result.success(resultMap);
 }
}
  1. login()方法接收兩個參數:username和password,表示用戶輸入的用戶名和密碼。根據用戶名、密碼創建一個UsernamePasswordAuthenticationToken對象;
  2. 然后調用authenticationManager.authenticate(authenticationToken)方法,使用AuthenticationManager對身份驗證令牌進行身份驗證,得到一個已經通過身份驗證的Authentication對象;
  3. 然后調用SecurityContextHolder.getContext().setAuthentication(authentication)方法,將驗證后的Authentication對象存儲到SecurityContextHolder中,以便對用戶進行身份認證;
  4. 調用JWT工具類生成token 。調用authentication.getPrincipal()方法獲取經過驗證的用戶信息,強制類型轉換為AuthUser類型。統一放在Map中返回。

測試

認證成功返回結果截圖:

圖片圖片

認證失敗返回結果截圖:

圖片圖片


責任編輯:武曉燕 來源: 一安未來
相關推薦

2021-09-17 09:00:00

安全身份認證OAuth 2.0

2024-08-27 09:28:39

2020-10-26 19:20:08

Linux國密算法加密

2023-06-26 00:30:51

2009-12-23 10:46:38

WPF實現用戶界面

2009-12-30 09:45:52

Silverlight

2010-01-28 10:00:54

linux用戶注銷logout

2012-05-04 09:28:49

Linux

2022-09-22 10:01:47

微服務授權認證

2010-08-04 10:48:17

路由器

2011-07-07 15:32:07

2018-04-02 10:16:00

bug代碼安卓

2016-10-24 23:18:55

數據分析漏斗留存率

2016-05-17 10:03:39

用戶體驗運維可度量

2019-08-22 15:42:03

2018-05-30 10:22:47

電商平臺

2025-03-05 07:58:30

2013-11-27 12:23:38

2014-07-22 14:48:05

2024-09-22 10:46:33

數據飛輪算法
點贊
收藏

51CTO技術棧公眾號

国产 日韩 欧美大片| 国产一区二区三区91| 亚洲综合激情小说| 久久99精品国产一区二区三区| 影音先锋亚洲天堂| 欧美少妇xxxx| 日韩欧美高清在线| 国产一区二区三区精彩视频 | 日韩免费看网站| 春日野结衣av| 69成人在线| 久久亚洲私人国产精品va媚药| 国产一区二区色| 国产亚洲精品久久久久久无几年桃 | 精品成人在线视频| 在线日韩av永久免费观看| 亚洲精品久久久久久无码色欲四季 | 国产av无码专区亚洲av| 久久久精品性| 欧美精品激情在线观看| 青青草自拍偷拍| 精品av导航| 欧美一级专区免费大片| 五月婷婷深爱五月| 黄视频免费在线看| 一卡二卡三卡日韩欧美| 亚洲最新在线| 久蕉在线视频| 91亚洲精品久久久蜜桃| 91久久偷偷做嫩草影院| 亚洲图片视频小说| 石原莉奈在线亚洲二区| 久久久久久com| 成人免费精品动漫网站| 成人一区而且| 国产亚洲人成a一在线v站| 国产免费一区二区三区最新6| 亚洲精品大全| 欧美日韩美少妇| 成年人小视频网站| 欧美xxxxxx| 欧美性感美女h网站在线观看免费| 日韩一级免费看| 在线观看午夜av| 成人欧美一区二区三区| 午夜精品一区二区在线观看| 精品乱码一区二区三四区视频 | 欧洲亚洲一区二区三区四区五区| 少妇高潮一区二区三区69| 国产成人亚洲综合a∨婷婷图片| 91精品啪aⅴ在线观看国产| 中国精品一区二区| 免费观看久久久4p| 国产精品十八以下禁看| 毛片在线免费播放| 蜜臀精品一区二区三区在线观看 | 国产a级片免费观看| 毛片免费看不卡网站| 日韩欧美国产骚| 少妇性饥渴无码a区免费| 性欧美xxx69hd高清| 精品成人久久av| 国产成人无码av在线播放dvd| 中文字幕影音在线| 日本韩国一区二区| 97公开免费视频| 国产精品成人国产| 7777精品久久久大香线蕉| 欧美一级视频在线| 亚洲码欧美码一区二区三区| 精品国产三级a在线观看| 国产伦精品一区二区三区88av| xvideos.蜜桃一区二区| 日韩精品高清在线观看| 免费在线观看你懂的| 欧美亚洲精品在线| 久久综合久久美利坚合众国| 欧美国产日韩综合| 国产精品尤物| 国产精品旅馆在线| 国产福利小视频| 99九九99九九九视频精品| 欧美一区二区三区四区在线观看地址 | 亚洲国产岛国毛片在线| 艳母动漫在线免费观看| 爱情岛论坛亚洲品质自拍视频网站| 天天综合网天天综合色| 中文久久久久久| 亚洲电影一区| 亚洲欧美在线免费| 久久国产精品国语对白| 国产精品日韩| 91精品视频在线免费观看| 亚洲欧美强伦一区二区| 国产欧美日韩在线看| 美女av免费观看| 欧美色网一区| 日韩天堂在线观看| 亚洲午夜久久久久久久国产| 国产精品chinese| 国产成人综合亚洲| 成人av免费播放| 国产日韩三级在线| 久久国产午夜精品理论片最新版本| 美脚恋feet久草欧美| 日韩欧美的一区二区| 在线小视频你懂的| 综合一区av| 国产精品三级久久久久久电影| 日韩一级片免费观看| 国产精品久久久久久久久果冻传媒| 欧美久久在线观看| 91精品一久久香蕉国产线看观看 | 日本亚洲精品| 欧美日韩一区二区免费视频| 99中文字幕在线| 教室别恋欧美无删减版| 韩国精品美女www爽爽爽视频| 一级片一区二区三区| 高清成人在线观看| 久久免费视频2| 欧美va视频| 日韩高清有码在线| www.youjizz.com亚洲| 国产麻豆9l精品三级站| 亚洲国产精品久久久久久女王| 国产传媒av在线| 精品国产青草久久久久福利| 黑鬼狂亚洲人videos| 六月丁香婷婷久久| 日韩视频在线播放| 性欧美gay| 亚洲免费成人av电影| 日韩精品成人在线| va亚洲va日韩不卡在线观看| 久久久久久久9| 日韩高清在线观看一区二区| 色99之美女主播在线视频| 国产一级片免费在线观看| 91在线观看免费视频| 免费拍拍拍网站| 国产伦精品一区二区三区免费优势| 欧美噜噜久久久xxx| 国产精品无码久久av| 亚洲欧洲国产日韩| 黄色aaaaaa| 亚洲精品888| 亚洲一区二区三区777| 国产三区视频在线观看| 欧美一区二区三区精品| 国产精品嫩草影院俄罗斯| 国产一区二区三区在线观看精品| 中文字幕一区二区三区四区五区六区| 快播电影网址老女人久久| 亚洲欧美精品一区二区| 秋霞av一区二区三区| 久久久99免费| 丰满少妇在线观看| 天天影视综合| 91手机在线观看| aa国产成人| 日韩精品一区二区三区第95| 无码人妻丰满熟妇精品| 国产日韩欧美在线一区| 国产3p在线播放| 欧美激情91| 国产综合欧美在线看| 欧美gay囗交囗交| 日韩一二三在线视频播| 国产高清在线观看视频| 亚洲国产综合视频在线观看| 中日韩精品一区二区三区| 日韩制服丝袜先锋影音| gogogo免费高清日本写真| 成人另类视频| 国产成人综合久久| 91精品久久| 日韩精品在线观看一区| 中文字幕av片| 亚洲黄色av一区| 玖玖爱在线观看| 麻豆精品久久久| 亚洲精品国产suv一区88| 婷婷亚洲成人| 成人国产在线视频| 热色播在线视频| 久久黄色av网站| 污污视频在线观看网站| 欧美男生操女生| 青草视频在线观看免费| 综合色中文字幕| 五月天激情小说| 麻豆成人久久精品二区三区红| 国产爆乳无码一区二区麻豆| 欧美日韩123| 91中文字幕在线| 裤袜国产欧美精品一区| 欧美日韩国产91| 97超碰人人在线| 亚洲丁香久久久| 国产又大又黑又粗| 日韩欧美大尺度| 久久久久亚洲av成人片| 国产精品区一区二区三区 | 国产网站一区二区| 久久久久中文字幕亚洲精品| 全国精品久久少妇| 欧美牲交a欧美牲交| 在线中文字幕第一区| 少妇免费毛片久久久久久久久| 超碰成人97| 成人精品久久av网站| 日韩电影免费观| 69久久夜色精品国产69乱青草 | 国模叶桐国产精品一区| 日本在线免费| 在线观看国产精品淫| 天天摸夜夜添狠狠添婷婷| 7777精品伊人久久久大香线蕉超级流畅| 尤物视频在线观看国产| 一区二区不卡在线播放| 91传媒免费观看| 国产精品人人做人人爽人人添 | 亚洲精品中文字幕乱码三区| 成年人在线免费看片| 久久色视频免费观看| 中文字幕在线播放一区| 国产精品一区二区在线观看不卡| 一区二区三区网址| 久久亚洲欧美| www.四虎成人| 久久福利毛片| 内射国产内射夫妻免费频道| 日韩视频二区| 精品无码国产一区二区三区av | 中文字幕无码不卡免费视频| 国产亚洲在线观看| 欧美成人高潮一二区在线看| 亚洲小说欧美另类社区| 久久亚洲国产成人精品无码区 | 欧美极品美女视频网站在线观看免费| 免费的黄网站在线观看| 日韩在线一区二区三区免费视频| 成人精品一区二区三区免费| 国产一区二区久久精品| 高清国产福利在线观看| 国产亚洲一区精品| 午夜激情视频在线| 日韩一区av在线| av网站免费在线观看| 欧美大码xxxx| 欧美大胆的人体xxxx| 97精品国产aⅴ7777| 成av人片在线观看www| 欧美在线免费观看| 性欧美freehd18| 国产在线视频欧美| 日韩在线成人| 国产欧美一区二区视频| 日韩欧美中文字幕电影| 日本一区视频在线| 日韩中文欧美| 国产乱子伦精品视频| 在线看片欧美| 成人三级视频在线播放 | 国产精品欧美激情| 成人国产综合| 亚洲精品免费一区二区三区| 538任你躁精品视频网免费| 国产一区在线观| 国产欧美日韩精品一区二区三区| 伊人久久青草| 国一区二区在线观看| 国产91在线免费| 日本不卡在线视频| 国产xxx在线观看| 91在线精品一区二区| 久久一级免费视频| 亚洲综合视频在线观看| 日本天堂网在线| 欧美日韩和欧美的一区二区| 性一交一乱一色一视频麻豆| 日韩精品在线观看一区| 麻豆视频在线观看免费网站| 国内精品视频久久| av高清一区| 999日本视频| 久久99高清| 久久久久久久9| 美女尤物国产一区| 国产chinese中国hdxxxx| 欧美国产欧美综合| 日韩精品一区二区av| 欧美日韩国产电影| 五月婷中文字幕| 久久久99久久精品女同性| 国产精品电影| 91久久久久久久久| 久久综合亚洲| 国产欧美精品aaaaaa片| 蜜臀久久久久久久| 国产福利在线观看视频| 综合激情成人伊人| 久久永久免费视频| 亚洲第一精品夜夜躁人人爽| 男人影院在线观看| 日本精品免费观看| 国产精品对白久久久久粗| 亚洲一区二区三区欧美| 亚欧美中日韩视频| 亚洲成av人片在线观看无| 亚洲婷婷国产精品电影人久久| 国产黄色免费观看| 亚洲成在人线av| 亚洲精品天堂| 91美女片黄在线观| 欧洲美女日日| 999香蕉视频| 成人免费高清视频| 青青草原在线免费观看视频| 欧美日本国产视频| 国产精品四虎| 亲爱的老师9免费观看全集电视剧| 在线精品自拍| 一二三在线视频| 久草精品在线观看| 婷婷丁香综合网| 欧美性色黄大片| 久草视频在线看| 国产成人精品综合久久久| 无码日韩精品一区二区免费| av日韩一区二区三区| 国产99精品国产| 久艹视频在线观看| 日韩美女一区二区三区四区| 精品51国产黑色丝袜高跟鞋| 国产欧美精品在线播放| 日韩成人三级| 亚洲娇小娇小娇小| 国产精品乱人伦一区二区| 中文字幕在线观看免费| 夜夜嗨av一区二区三区四区| 奇米777日韩| 三区精品视频观看| 日本午夜精品一区二区三区电影| 人妻一区二区视频| 欧美少妇一区二区| 在线观看h片| 成人免费黄色网| 91精品观看| 久久久久亚洲av无码网站| 亚洲午夜久久久久久久久电影院| 亚洲第一精品网站| 欧美精品videofree1080p| 九九热播视频在线精品6| www国产精品内射老熟女| 91欧美激情一区二区三区成人| 男人天堂2024| 在线观看国产精品91| 国产麻豆一区二区三区| 色欲色香天天天综合网www| 91美女片黄在线观看| 少妇又紧又色又爽又刺激视频 | 亚洲波多野结衣| 欧美一级日韩一级| av在线视屏| 日本一区二区在线| 麻豆91精品91久久久的内涵| 亚洲最大的黄色网址| 欧美精品一区二区久久婷婷| av岛国在线| 日本一区二区视频| 国产高清在线观看免费不卡| 日本中文字幕在线免费观看| 国产一区二区成人| 日日夜夜精品视频| 亚洲熟妇av一区二区三区| 国产精品久久99| 欧美一级特黄aaaaaa| 国产成人精彩在线视频九色| 亚欧美无遮挡hd高清在线视频 | 欧美—级a级欧美特级ar全黄| 婷婷激情久久| 亚洲黄色av片| 精品久久久久久中文字幕大豆网| yourporn在线观看视频| www 成人av com| 丝袜亚洲另类欧美综合| 波多野结衣爱爱视频| 亚洲美女av黄| 日韩欧美中文字幕在线视频 | 一区二区精品国产| 成人免费看视频| 亚洲无码精品在线观看| 久久久之久亚州精品露出| 日韩欧美精品| 最近中文字幕无免费| 欧美一级午夜免费电影| 欧亚一区二区| 老太脱裤子让老头玩xxxxx|