亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

SpringBoot+Spring Security+JWT實現(xiàn)RESTful Api權(quán)限控制的方法

2024-07-14 08:43:35
字體:
供稿:網(wǎng)友

摘要:用spring-boot開發(fā)RESTful API非常的方便,在生產(chǎn)環(huán)境中,對發(fā)布的API增加授權(quán)保護是非常必要的。現(xiàn)在我們來看如何利用JWT技術(shù)為API增加授權(quán)保護,保證只有獲得授權(quán)的用戶才能夠訪問API。

一:開發(fā)一個簡單的API

在IDEA開發(fā)工具中新建一個maven工程,添加對應(yīng)的依賴如下:

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter</artifactId>  </dependency>   <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency>   <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency>   <!-- spring-data-jpa -->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-data-jpa</artifactId>  </dependency>   <!-- mysql -->  <dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId>   <version>5.1.30</version>  </dependency>   <!-- spring-security 和 jwt -->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-security</artifactId>  </dependency>  <dependency>   <groupId>io.jsonwebtoken</groupId>   <artifactId>jjwt</artifactId>   <version>0.7.0</version>  </dependency>

新建一個UserController.java文件,在里面在中增加一個hello方法:

@RequestMapping("/hello") @ResponseBody public String hello(){  return "hello"; }

這樣一個簡單的RESTful API就開發(fā)好了。

現(xiàn)在我們運行一下程序看看效果,執(zhí)行JwtauthApplication.java類中的main方法:

等待程序啟動完成后,可以簡單的通過curl工具進行API的調(diào)用,如下圖:

SpringBoot,Spring,Security,JWT,RESTful,權(quán)限控制

至此,我們的接口就開發(fā)完成了。但是這個接口沒有任何授權(quán)防護,任何人都可以訪問,這樣是不安全的,下面我們開始加入授權(quán)機制。

二:增加用戶注冊功能

首先增加一個實體類User.java:

package boss.portal.entity; import javax.persistence.*; /** * @author zhaoxinguo on 2017/9/13. */@Entity@Table(name = "tb_user")public class User {  @Id @GeneratedValue private long id; private String username; private String password;  public long getId() {  return id; }  public String getUsername() {  return username; }  public void setUsername(String username) {  this.username = username; }  public String getPassword() {  return password; }  public void setPassword(String password) {  this.password = password; }}

然后增加一個Repository類UserRepository,可以讀取和保存用戶信息:

package boss.portal.repository; import boss.portal.entity.User;import org.springframework.data.jpa.repository.JpaRepository; /** * @author zhaoxinguo on 2017/9/13. */public interface UserRepository extends JpaRepository<User, Long> {  User findByUsername(String username); }

在UserController類中增加注冊方法,實現(xiàn)用戶注冊的接口:

/**  * 該方法是注冊用戶的方法,默認放開訪問控制  * @param user  */ @PostMapping("/signup") public void signUp(@RequestBody User user) {  user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));  applicationUserRepository.save(user); }

其中的@PostMapping("/signup")

這個方法定義了用戶注冊接口,并且指定了url地址是/users/signup。由于類上加了注解 @RequestMapping(“/users”),類中的所有方法的url地址都會有/users前綴,所以在方法上只需指定/signup子路徑即可。

密碼采用了BCryptPasswordEncoder進行加密,我們在Application中增加BCryptPasswordEncoder實例的定義。

package boss.portal; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @SpringBootApplicationpublic class JwtauthApplication { 	@Bean	public BCryptPasswordEncoder bCryptPasswordEncoder() {		return new BCryptPasswordEncoder();	} 	public static void main(String[] args) {		SpringApplication.run(JwtauthApplication.class, args);	}}

三:增加JWT認證功能

用戶填入用戶名密碼后,與數(shù)據(jù)庫里存儲的用戶信息進行比對,如果通過,則認證成功。傳統(tǒng)的方法是在認證通過后,創(chuàng)建sesstion,并給客戶端返回cookie?,F(xiàn)在我們采用JWT來處理用戶名密碼的認證。區(qū)別在于,認證通過后,服務(wù)器生成一個token,將token返回給客戶端,客戶端以后的所有請求都需要在http頭中指定該token。服務(wù)器接收的請求后,會對token的合法性進行驗證。驗證的內(nèi)容包括:

  1. 內(nèi)容是一個正確的JWT格式
  2. 檢查簽名
  3. 檢查claims
  4. 檢查權(quán)限

處理登錄

創(chuàng)建一個類JWTLoginFilter,核心功能是在驗證用戶名密碼正確后,生成一個token,并將token返回給客戶端:

package boss.portal.web.filter;import boss.portal.entity.User;import com.fasterxml.jackson.databind.ObjectMapper;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.ArrayList;import java.util.Date; /** * 驗證用戶名密碼正確后,生成一個token,并將token返回給客戶端 * 該類繼承自UsernamePasswordAuthenticationFilter,重寫了其中的2個方法 * attemptAuthentication :接收并解析用戶憑證。 * successfulAuthentication :用戶成功登錄后,這個方法會被調(diào)用,我們在這個方法里生成token。 * @author zhaoxinguo on 2017/9/12. */public class JWTLoginFilter extends UsernamePasswordAuthenticationFilter {  private AuthenticationManager authenticationManager;  public JWTLoginFilter(AuthenticationManager authenticationManager) {  this.authenticationManager = authenticationManager; }  // 接收并解析用戶憑證 @Override public Authentication attemptAuthentication(HttpServletRequest req,            HttpServletResponse res) throws AuthenticationException {  try {   User user = new ObjectMapper()     .readValue(req.getInputStream(), User.class);    return authenticationManager.authenticate(     new UsernamePasswordAuthenticationToken(       user.getUsername(),       user.getPassword(),       new ArrayList<>())   );  } catch (IOException e) {   throw new RuntimeException(e);  } }  // 用戶成功登錄后,這個方法會被調(diào)用,我們在這個方法里生成token @Override protected void successfulAuthentication(HttpServletRequest req,           HttpServletResponse res,           FilterChain chain,           Authentication auth) throws IOException, ServletException {   String token = Jwts.builder()    .setSubject(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername())    .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 24 * 1000))    .signWith(SignatureAlgorithm.HS512, "MyJwtSecret")    .compact();  res.addHeader("Authorization", "Bearer " + token); } }

該類繼承自UsernamePasswordAuthenticationFilter,重寫了其中的2個方法:

attemptAuthentication :接收并解析用戶憑證。

successfulAuthentication :用戶成功登錄后,這個方法會被調(diào)用,我們在這個方法里生成token。

授權(quán)驗證

用戶一旦登錄成功后,會拿到token,后續(xù)的請求都會帶著這個token,服務(wù)端會驗證token的合法性。

創(chuàng)建JWTAuthenticationFilter類,我們在這個類中實現(xiàn)token的校驗功能。

package boss.portal.web.filter;import io.jsonwebtoken.Jwts;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.util.ArrayList; /** * token的校驗 * 該類繼承自BasicAuthenticationFilter,在doFilterInternal方法中, * 從http頭的Authorization 項讀取token數(shù)據(jù),然后用Jwts包提供的方法校驗token的合法性。 * 如果校驗通過,就認為這是一個取得授權(quán)的合法請求 * @author zhaoxinguo on 2017/9/13. */public class JWTAuthenticationFilter extends BasicAuthenticationFilter {  public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {  super(authenticationManager); }  @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {  String header = request.getHeader("Authorization");   if (header == null || !header.startsWith("Bearer ")) {   chain.doFilter(request, response);   return;  }   UsernamePasswordAuthenticationToken authentication = getAuthentication(request);   SecurityContextHolder.getContext().setAuthentication(authentication);  chain.doFilter(request, response);  }  private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {  String token = request.getHeader("Authorization");  if (token != null) {   // parse the token.   String user = Jwts.parser()     .setSigningKey("MyJwtSecret")     .parseClaimsJws(token.replace("Bearer ", ""))     .getBody()     .getSubject();    if (user != null) {    return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>());   }   return null;  }  return null; } }

該類繼承自BasicAuthenticationFilter,在doFilterInternal方法中,從http頭的Authorization 項讀取token數(shù)據(jù),然后用Jwts包提供的方法校驗token的合法性。如果校驗通過,就認為這是一個取得授權(quán)的合法請求。

SpringSecurity配置

通過SpringSecurity的配置,將上面的方法組合在一起。

package boss.portal.security;import boss.portal.web.filter.JWTLoginFilter;import boss.portal.web.filter.JWTAuthenticationFilter;import org.springframework.boot.autoconfigure.security.SecurityProperties;import org.springframework.context.annotation.Configuration;import org.springframework.core.annotation.Order;import org.springframework.http.HttpMethod;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * SpringSecurity的配置 * 通過SpringSecurity的配置,將JWTLoginFilter,JWTAuthenticationFilter組合在一起 * @author zhaoxinguo on 2017/9/13. */@Configuration@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)public class WebSecurityConfig extends WebSecurityConfigurerAdapter {  private UserDetailsService userDetailsService;  private BCryptPasswordEncoder bCryptPasswordEncoder;  public WebSecurityConfig(UserDetailsService userDetailsService, BCryptPasswordEncoder bCryptPasswordEncoder) {  this.userDetailsService = userDetailsService;  this.bCryptPasswordEncoder = bCryptPasswordEncoder; }  @Override protected void configure(HttpSecurity http) throws Exception {  http.cors().and().csrf().disable().authorizeRequests()    .antMatchers(HttpMethod.POST, "/users/signup").permitAll()    .anyRequest().authenticated()    .and()    .addFilter(new JWTLoginFilter(authenticationManager()))    .addFilter(new JWTAuthenticationFilter(authenticationManager())); }  @Override public void configure(AuthenticationManagerBuilder auth) throws Exception {  auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder); } }

這是標準的SpringSecurity配置內(nèi)容,就不在詳細說明。注意其中的

.addFilter(new JWTLoginFilter(authenticationManager())) .addFilter(new JwtAuthenticationFilter(authenticationManager()))

這兩行,將我們定義的JWT方法加入SpringSecurity的處理流程中。

下面對我們的程序進行簡單的驗證:

# 請求hello接口,會收到403錯誤,如下圖:

curl http://localhost:8080/hello

SpringBoot,Spring,Security,JWT,RESTful,權(quán)限控制

# 注冊一個新用戶curl -H"Content-Type: application/json" -X POST -d '{"username":"admin","password":"password"}' http://localhost:8080/users/signup

如下圖:

SpringBoot,Spring,Security,JWT,RESTful,權(quán)限控制

# 登錄,會返回token,在http header中,Authorization: Bearer 后面的部分就是tokencurl -i -H"Content-Type: application/json" -X POST -d '{"username":"admin","password":"password"}' http://localhost:8080/login

如下圖:

SpringBoot,Spring,Security,JWT,RESTful,權(quán)限控制

# 用登錄成功后拿到的token再次請求hello接口# 將請求中的XXXXXX替換成拿到的token# 這次可以成功調(diào)用接口了curl -H"Content-Type: application/json" /-H"Authorization: Bearer XXXXXX" /"http://localhost:8080/users/hello"

如下圖:

SpringBoot,Spring,Security,JWT,RESTful,權(quán)限控制

五:總結(jié)

至此,給SpringBoot的接口加上JWT認證的功能就實現(xiàn)了,過程并不復(fù)雜,主要是開發(fā)兩個SpringSecurity的filter,來生成和校驗JWT token。

JWT作為一個無狀態(tài)的授權(quán)校驗技術(shù),非常適合于分布式系統(tǒng)架構(gòu),因為服務(wù)端不需要保存用戶狀態(tài),因此就無需采用redis等技術(shù),在各個服務(wù)節(jié)點之間共享session數(shù)據(jù)。

六:源碼下載地址

地址:https://gitee.com/micai/springboot-springsecurity-jwt-demo

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
www.91popny.com| 欧美自拍偷拍午夜视频| 麻豆国产精品| 日韩av手机在线免费观看| 久久麻豆精品| 女人丝袜激情亚洲| 91色琪琪电影亚洲精品久久| 色先锋久久av资源部| 久久99久久精品| 男人日女人下面视频| 成人18夜夜网深夜福利网| 视频一区二区在线播放| 成人免费高清在线播放| 精品美女在线视频| 国产xxxxx| 337p亚洲精品色噜噜狠狠p| 国产精品一区毛片| 亚洲欧美中文日韩v在线观看| 欧美电影免费观看高清| 成人精品一二三区| 999久久久国产精品| 成人午夜免费在线视频| 制服丝袜国产精品| 国精产品乱码一区一区三区四区| 国内自拍亚洲| 久蕉依人在线视频| 国产福利精品一区| 久久久久久麻豆| 中文字幕在线第一页| 亚洲天天在线日亚洲洲精| 久久久久久99精品| 欧美一级免费看| 国产精品久久福利| 国产人久久人人人人爽| vam成人资源在线观看| 国产真实精品久久二三区| 粉嫩av一区二区三区免费野| 亚洲欧美国产精品va在线观看| 国产精品成人一区二区三区电影毛片| 亚洲精品按摩视频| 国产不卡一卡2卡三卡4卡5卡在线| 麻豆亚洲一区| 日韩成人综合网| 亚洲免费一级视频| 国产一级精品毛片| 欧美日韩色一区| 欧美亚洲伦理www| 最近国产精品视频| 欧美福利专区| 国产欧美一区二区三区另类精品| xf在线a精品一区二区视频网站| 欧美男女性生活在线直播观看| 中文日韩在线观看| 亚洲国产欧美一区二区三区丁香婷| 亚洲最新永久观看在线| 雨宫琴音一区二区在线| 亚洲3atv精品一区二区三区| 在线观看xxxx| 91国内在线视频| 手机看片福利盒子久久| 久久999免费视频| 青青青在线视频免费观看| 久久久久久久久久久亚洲| 四虎在线免费看| 国产精品日韩精品在线播放| а√天堂8资源在线官网| 亚洲va久久久噜噜噜久久天堂| 外国成人直播| 国产精品自在在线| 天堂资源最新版在线视频观看免费网| 黄色精品免费| 中文字幕一区二区精品| 在线观看xxxxvideo| 日韩久久精品网| 色棕色天天综合网| 激情五月深爱五月| av电影一区二区三区| 九九久久久久99精品| 日本精品视频在线观看| 国产精品臀控福利在线观看| 亚洲精品狠狠操| 国产福利第一视频在线播放| 7777精品伊人久久久大香线蕉最新版| 91精品久久久久久久| www.欧美精品一二三区| 成年人在线观看视频免费| 国产精品毛片一区二区在线看舒淇| 国产欧美日韩视频在线| 亚洲无av在线中文字幕| 成人性视频免费看| 日本不卡免费高清视频在线| 亚洲色图校园春色| 成年人小视频网站| 欧美深夜福利| 亚洲视频电影在线| 日本道在线观看一区二区| 久久久久久久久综合| 欧美亚洲国产怡红院影院| 老司机aⅴ在线精品导航| av激情久久| 国产成人一区二区三区| 日韩av中文字幕一区| 中文字幕欧美日韩在线| 成人精品视频在线观看| 精品视频www| 成人做爰69片免网站| 精品国产二区三区| 亚洲av无码乱码国产精品fc2| 精品人妻无码一区二区| 99精品欧美一区二区三区综合在线| 中文字幕码精品视频网站| 亚洲色图校园春色| 日韩av电影手机在线观看| 日韩精品电影在线观看| 欧美草草影院在线视频| 欧美天堂在线视频| 中文字幕一区二区在线播放| 欧美亚洲综合一区| h视频免费高清在线观看| 国产中文字幕视频| 99久久精品国产导航| 国产美女高潮视频| 午夜激情视频在线观看| 欧美亚洲日本| 极品少妇一区二区三区精品视频| 91偷拍一区二区三区精品| 国产乱码精品一区二区三区亚洲人| 国内精品露脸在线视频播放| 日韩三级电影免费观看| 丝袜理论片在线观看| 传媒av在线| 91在线播放国产| 久久久精品2019中文字幕之3| 麻豆免费在线观看视频| 伊人中文字幕在线观看| 91精品国产综合久久久久久丝袜| 国产又爽又黄ai换脸| 日本欧美一区二区| 中文字幕天堂av| 亚洲一区日韩在线| 视频一区视频二区国产精品| 欧洲精品一区二区三区在线观看| a一区二区三区| 欧美视频导航| 国产精品9区| 国产在线一区二区三区播放| 美女在线视频免费| 中文字幕乱码日本亚洲一区二区| 亚洲伊人成综合成人网| 一个色综合av| 女人床在线观看| 欧美高清视频看片在线观看| a级免费视频| 99热这里只有成人精品国产| 欧美高清xxxx性| 777奇米888色狠狠俺也去| 精品亚洲综合| 777久久久精品一区二区三区| a91a精品视频在线观看| 中国xxxx视频播放50| 欧美乱大交做爰xxxⅹ性3| 国产在线拍偷自揄拍精品| 亚洲成人激情综合网| 香蕉久久夜色精品国产使用方法| 天天爱天天干天天操| 亚洲欧美一区二区三区在线播放| 国内成人精品视频| 午夜久久久久久久久久一区二区| 啦啦啦在线视频免费观看高清中文| 草莓视频一区二区三区| 亚洲色图av在线| 亚洲一区二区三区乱码aⅴ| 国色天香一二三期区别大象| 亚洲欧洲免费无码| 亚洲三级在线视频| 亚洲午夜私人影院| 日本亚洲三级在线| 日本一区二区电影| 日本少妇xxxx软件| 欧美日韩亚洲一区二区三区在线| 三级视频网站在线观看| 午夜欧美性电影| 亚洲午夜久久久久久久久久久| 国产精品自拍片| 人妻少妇精品视频一区二区三区| 99久久久国产精品美女| 国产探花在线播放| 在线精品亚洲欧美日韩国产| 高清日韩av| 欧美日韩国产片| 亚洲女娇小黑人粗硬| 黄色激情网站| 日本欧美三级| 国产精品美女久久久久久2018| 亚洲乱码国产乱码精品精的特点| 999香蕉视频| 97国产精品视频| 国产精品久久久久久久久久久久久久久久久久| 国产精品第一页第二页第三页| 在线综合视频网站| 日本一二区不卡| 国产精品久久久久影院日本| 国产精品第9页| 色琪琪原网站亚洲香蕉| 一区二区三区四区日韩| 三年中国中文观看免费播放| 自拍偷拍亚洲激情| 久艹视频在线观看| www.亚洲| 亚洲视频在线观看一区二区| 国产精品久久久久一区| 午夜免费在线观看精品视频| 久久av电影| 久久日韩视频| 欧美freesex交免费视频| 国产欧美在线视频| 国产精品chinese| 欧美色综合影院| bestiality新另类大全| 国产va在线| 欧美无砖砖区免费| 68精品久久久久久欧美| 蜜桃狠狠色伊人亚洲综合网站| 狠狠色狠狠色综合日日五| 曰批又黄又爽免费视频| 国产日韩欧美一区二区三区| 久久r这里只有精品| 鲁大师影院一区二区三区| 在线观看中文| www.女人的天堂.com| 国产乱码久久久| 国产成人精品久久二区二区| 一区二区激情小说| 国产精品自拍视频| 欧美成人激情| t66y永久入口地址| 日韩欧美综合视频| 不卡一区二区三区四区五区| 香蕉视频成人在线观看| 男女免费观看在线爽爽爽视频| 麻豆一区二区三区精品视频| 三级网站免费观看| 国内精品一区二区三区四区| 欧美jiizzhd精品欧美| 久久久久久久综合色一本| 国产精品一在线观看| 国产一区二区在线免费| 7777精品伊人久久久大香线蕉经典版下载| 尤物视频..com| 国偷自产av一区二区三区小尤奈| 男人天堂av网站| 污视频网址在线观看| 男人艹女人在线观看| 久久午夜视频| 污片在线观看一区二区| 久热在线中文字幕色999舞| 福利91精品一区二区三区| 国产后进白嫩翘臀在线观看视频| 91视频福利| 精品视频在线观看网站| 青青视频免费在线观看| 亚洲 日韩 国产第一| 粉嫩久久久久久久极品| 91在线网址| 免费在线观看h| 国产精品免费无码| 九一成人免费视频| 亚洲一区二区精品| 91精品国产乱码久久蜜臀| 一区二区国产精品精华液| www.亚洲天堂网| 美国av免费观看| 色屁屁草草影院ccyycom| 26uuu精品一区二区三区四区在线| 免费欧美电影| 亚洲线精品一区二区三区八戒| 韩国av免费在线| 91女主播在线观看| 日本一二三不卡| 女教师淫辱の教室蜜臀av软件| 日韩欧美伦理电影院| 轻点好疼好大好爽视频| 成人免费在线观看| 污视频在线观看免费网站| 美女喷水白浆| 欧美高清视频一区二区三区| 好吊色视频988gao在线观看| 国语自产偷拍精品视频偷| 中文字幕2020第一页| 丰满人妻av一区二区三区| 欧美成人黑人xx视频免费观看| 国产欧美激情| 亚洲区一区二| 中文乱码字幕高清在线观看| 一道精品视频一区二区三区图片| 无码av免费一区二区三区试看| 国产剧情av在线播放| 成人一级片在线观看| 欧美白人最猛性xxxxx69交| 懂色一区二区三区免费观看| 色噜噜日韩精品欧美一区二区| 欧美日韩国产高清视频| 成人久久网站| 91麻豆精品国产91久久久更新资源速度超快| 欧美一区二区黄| av在线免费观看国产| 日韩美女主播在线视频一区二区三区| 亚洲大尺度在线观看| 国产美女娇喘av呻吟久久| 亚洲精品国产一区| 日本亚洲色大成网站www久久| 一区二区日本视频| 大胆高清日本a视频| 日韩五码电影| 91porn在线| 欧美一级特黄aaa| 欧美专区在线视频| 免费萌白酱国产一区二区三区| 日韩av电影免费| 欧美视频自拍偷拍| 成人黄色小视频在线观看| 国产欧洲精品视频| 国产精品视频导航| 久久偷窥视频| 日本中文字幕在线一区| 综合av色偷偷网| 国产精品99精品无码视亚| 久久精品免费网站|