精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

激情文学综合丁香| 99久久.com| 日本道免费精品一区二区三区| 日本成人三级电影网站| 国产手机精品视频| 国产精品嫩草99av在线| 色午夜这里只有精品| 国产乱国产乱老熟300部视频| 欧美久久天堂| 中文字幕的久久| 成人激情直播| 欧美在线视频精品| 亚洲精品日本| 久久精品视频中文字幕| 久久中文字幕人妻| 成人综合日日夜夜| 色综合亚洲欧洲| 懂色av一区二区三区四区五区| 天天干视频在线观看| 欧美aaa在线| 97在线观看视频国产| 日本不卡一二区| 亚洲第一福利社区| 欧美大片一区二区| 中文字幕亚洲影院| 日韩在线影院| 欧美日韩亚洲精品一区二区三区| 日韩视频一二三| 第三区美女视频在线| av在线一区二区三区| 亚洲精品欧美日韩专区| 中文天堂在线播放| 久久亚洲二区| 91地址最新发布| 久久亚洲成人av| 亚洲深深色噜噜狠狠爱网站| 中文字幕成人在线| 99久久久无码国产精品性| 精品精品国产毛片在线看| 91超碰这里只有精品国产| 国产福利影院在线观看| 伊人久久综合一区二区| 欧美日韩国产在线看| 男女激情免费视频| 男女视频在线| 亚洲男人天堂一区| av磁力番号网| 最近中文字幕免费mv2018在线| 中文av一区二区| 午夜精品一区二区在线观看| 国产资源在线播放| 国产欧美一区二区在线| 日本一区二区三区视频在线播放 | 午夜影院在线播放| 午夜精品久久久| 99热自拍偷拍| 密臀av在线播放| 日韩欧美一区视频| 国产三级三级三级看三级| 欧美电影免费观看网站| 在线欧美日韩国产| 色乱码一区二区三区在线| 国产性生活视频| 宅男噜噜噜66国产日韩在线观看| 97久久久久久| 久草手机在线视频| 丝袜诱惑亚洲看片| 91精品国产综合久久香蕉的用户体验 | 国产在线观看不卡| 99久久久久久久| 高清不卡一区二区在线| 国产一区二区在线观看免费播放| 少妇高潮一区二区三区99小说| 91丨porny丨首页| 日韩欧美精品久久| av官网在线播放| 天天av天天翘天天综合网色鬼国产| 久久久亚洲精品无码| 欧美片第1页| 欧美另类久久久品| 无码人妻一区二区三区一| 久久国产精品免费精品3p| 亚洲美女性视频| 国产人与禽zoz0性伦| 欧美日韩一区二区高清| 欧美一级高清免费播放| 中文字幕一级片| 国产91色综合久久免费分享| 麻豆传媒一区二区| 午夜伦理在线| 亚洲.国产.中文慕字在线| www.国产区| 伊人久久噜噜噜躁狠狠躁| 亚洲精品网站在线播放gif| 国产精品69久久久久孕妇欧美| 欧美日韩天堂| 国产激情999| www.午夜激情| 国产日韩欧美麻豆| www污在线观看| 国产一区一一区高清不卡| 日韩一本二本av| 捆绑裸体绳奴bdsm亚洲| 日本一区二区三区视频| 久久全球大尺度高清视频| 高潮无码精品色欲av午夜福利| 国产精品123区| 日韩一区免费观看| 超碰在线资源| 欧美久久久久中文字幕| 右手影院亚洲欧美| 综合激情一区| 国产精品视频公开费视频| 五月婷婷狠狠干| 一区二区三区在线高清| 9久久婷婷国产综合精品性色| 亚洲电影一区| 久久精品中文字幕一区| www毛片com| hitomi一区二区三区精品| 日本久久高清视频| 欧美91在线|欧美| 亚洲女同精品视频| 日韩三级小视频| 国产成人自拍网| 国产高清免费在线| 成人国产激情在线| 亚洲欧美在线免费| 日本道在线观看| 不卡影院免费观看| 成人在线免费高清视频| 婷婷久久综合九色综合99蜜桃| 亚洲免费视频网站| 日韩在线视频免费播放| 成人午夜视频福利| 日韩一级免费看| 久久久久亚洲精品中文字幕| xxxxx成人.com| 无码人妻丰满熟妇区bbbbxxxx| 91在线一区二区三区| 白白操在线视频| 欧美9999| 欧美猛交免费看| 国产成人精品免费看视频| 亚洲欧洲av色图| 日本中文字幕精品—区二区| 成人精品电影| 国产精品久久久久久久av大片| 青青青草原在线| 色婷婷久久99综合精品jk白丝| 色呦呦一区二区| 国产欧美日本| 欧美一区二区三区四区夜夜大片 | 波多野结衣有码| 亚洲一级影院| 精品久久久久久综合日本| 亚洲欧洲综合在线| 欧美日韩午夜视频在线观看| 喷水视频在线观看| 久久激情久久| 亚洲人成网站在线播放2019| 欧美亚洲福利| 麻豆国产va免费精品高清在线| 国产喷水福利在线视频| 亚洲精品视频一区| 丝袜熟女一区二区三区| 亚洲一区免费| 色女孩综合网| 成人在线啊v| 欧美黑人极品猛少妇色xxxxx| 国产综合无码一区二区色蜜蜜| 亚洲成人7777| 受虐m奴xxx在线观看| 麻豆91小视频| 日韩国产小视频| 男人的天堂久久| 国产精品久久二区| 在线播放蜜桃麻豆| 日韩av在线高清| 日本一区二区三区久久| 亚洲人吸女人奶水| 欧美xxxx×黑人性爽| 视频一区中文字幕| 亚洲 欧洲 日韩| 欧美在线关看| 国产精品永久免费在线| 青草在线视频| 亚洲一区第一页| 99riav国产| 色综合咪咪久久| 五月天免费网站| 99国产欧美另类久久久精品| 中文字幕在线观看第三页| 亚洲一区二区日韩| 免费国产一区二区| 日韩一区二区三区在线看| 国产99在线|中文| 神马午夜伦理不卡| 亚洲天堂免费视频| 午夜精品久久久久久久91蜜桃| 日韩欧美在线视频观看| 欧美人妻精品一区二区三区 | 我不卡一区二区| 处破女av一区二区| 一级黄色特级片| 亚洲欧美成人| 成人污网站在线观看| 精品freesex老太交| 国产一区喷水| 精品麻豆剧传媒av国产九九九| 日韩av不卡在线| 丰乳肥臀在线| 久久久99久久精品女同性| 人操人视频在线观看| 精品国产伦理网| 国产精品-色哟哟| 欧美性猛交xxxx黑人交 | 色诱亚洲精品久久久久久| 日韩一区二区三区四区在线| 国产视频一区二区三区在线观看| 欧洲熟妇的性久久久久久| 国模少妇一区二区三区| 国产福利一区视频| 国产农村妇女精品一二区| 欧美日韩dvd| 久久精品亚洲人成影院 | 黄色免费在线观看| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 无码精品人妻一区二区| 日韩欧美国产一区二区在线播放 | 久久福利资源站| 日韩国产一区久久| 日韩av网址大全| 国产一区免费视频| 另类春色校园亚洲| 国产精品一区而去| 国产亚洲精品美女久久| 成人黄色在线免费观看| 亚洲无线观看| 亚洲自拍欧美色图| 久久天堂久久| 成人看片人aa| 国产不卡精品在线| 亚洲综合中文字幕在线观看| 999精品视频在线观看| 成人在线精品视频| 国产高清精品二区| 99国产在线观看| 91在线一区| 国产伦精品一区二区三区在线| 99精品在免费线中文字幕网站一区 | 日韩精品一区不卡| 色婷婷一区二区| 中文在线免费观看| 欧美日韩国产精选| 国产精品老熟女视频一区二区| 欧美精三区欧美精三区| 国产男女无套免费网站| 日韩一区二区高清| 亚洲欧美另类视频| 日韩电影在线观看中文字幕| 色鬼7777久久| 最新69国产成人精品视频免费| 在线免费观看黄| 久久伊人精品一区二区三区| 亚洲综合影视| 91精品国产沙发| 欧美电影h版| 91精品视频网站| 一区二区在线视频观看| 牛人盗摄一区二区三区视频| 成人精品久久| 激情六月天婷婷| 老牛影视一区二区三区| 日韩在线不卡一区| 成人免费毛片app| 中文字幕高清视频| 亚洲色大成网站www久久九九| 九九热视频精品| 色综合久久久久综合体桃花网| 一区二区三区在线免费观看视频 | 天天综合天天综合色| 中文字幕精品三级久久久 | 五月天婷婷影视| 成人黄色在线看| 国产毛片欧美毛片久久久| 亚洲激情一二三区| www.com亚洲| 日韩视频在线观看一区二区| 天堂中文字幕在线| 久久夜色精品国产| 视频二区不卡| 国产精品免费观看高清| 成人情趣视频网站| 国产片侵犯亲女视频播放| 日日欢夜夜爽一区| 国产国语老龄妇女a片| 欧美极品美女视频| 日韩精品国产一区二区| 欧美日韩国产综合一区二区三区 | 91性感美女视频| 亚洲天堂黄色片| 在线国产亚洲欧美| 黄色片一区二区| 久久亚洲国产精品| 欧美一区久久久| 国产日韩久久| 在线中文字幕亚洲| 奇米影音第四色| 91亚洲午夜精品久久久久久| 欧美日韩在线观看成人| 精品视频免费看| 欧美少妇另类| 97色在线观看免费视频| 欧美高清一级片| 一区二区三区av| 久久一区中文字幕| 中文字幕影片免费在线观看| 亚洲男同1069视频| 亚洲图片中文字幕| 国产亚洲精品成人av久久ww| 国产不卡123| 高清av免费一区中文字幕| 亚洲国产精品久久久久蝴蝶传媒| 妺妺窝人体色www在线观看| 99热国产精品| 日本少妇裸体做爰| 精品久久人人做人人爱| www免费视频观看在线| 成人天堂噜噜噜| 欧美韩日一区| 人人爽人人爽av| 国产精品久久久久久久久免费桃花 | 好看的日韩精品视频在线| 欧美在线三级| aaaaaaaa毛片| 亚洲激情图片一区| a天堂视频在线| 欧美成人免费播放| 日韩一二三区| 亚洲色欲久久久综合网东京热| 国产69精品久久久久毛片| 好吊色视频在线观看| 欧美疯狂做受xxxx富婆| 欧美69xxx| 亚洲一区二区三区成人在线视频精品 | 一本色道久久综合狠狠躁篇怎么玩 | 国产精品丝袜一区二区三区| 国产精品一区二区99| 国产成人av影视| 国产精品少妇自拍| 日韩欧美一级大片| 日韩资源在线观看| 精品国产不卡一区二区| 99久久99久久精品| 成人综合在线观看| 日韩在线视频免费播放| 亚洲欧美激情在线视频| 韩国美女久久| 日韩精品一区二区三区在线播放| av成人手机在线| 91精品久久久久久久久久| 国产韩国精品一区二区三区| 永久免费黄色片| 亚洲综合精品自拍| 五月婷婷丁香花| 国产精品久久久999| 天天综合一区| 第一页在线视频| 精品国产精品自拍| www免费网站在线观看| 91在线视频导航| 亚洲另类视频| 少妇人妻好深好紧精品无码| 9191国产精品| 高清视频在线观看三级| 亚洲视频小说| 大桥未久av一区二区三区中文| 国产又大又黄又粗| 久久资源免费视频| 欧美黄色影院| av在线免费看片| 五月婷婷激情综合| 美女羞羞视频在线观看| 激情五月综合色婷婷一区二区| 日本美女视频一区二区| 国产高清在线免费观看| 精品夜色国产国偷在线| 成人污版视频| 免费在线观看毛片网站| 亚洲黄色av一区| 国产一区二区三区福利| 豆国产97在线| 久久国产精品露脸对白| 日韩精品视频免费看| 播播国产欧美激情| 网红女主播少妇精品视频| 国产欧美精品一二三| 日本韩国精品在线| 高清在线视频不卡|