久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

SpringBoot集成Spring Security用JWT令牌實現登錄和鑒權的方法

瀏覽:10日期:2023-05-17 10:50:01

最近在做項目的過程中 需要用JWT做登錄和鑒權 查了很多資料 都不甚詳細有的是需要在application.yml里進行jwt的配置 但我在導包后并沒有相應的配置項 因而并不適用在踩過很多坑之后 稍微整理了一下 做個筆記

一、概念

1、什么是JWT

Json Web Token (JWT)是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放標準(RFC 7519)該token被設計為緊湊且安全的 特別適用于分布式站點的單點登錄(SSO)場景

隨著JWT的出現 使得校驗方式更加簡單便捷化JWT實際上就是一個字符串 它由三部分組成:頭部 載荷和簽名用[.]分隔這三個部分 最終的格式類似于:xxxx.xxxx.xxxx

在服務器直接根據token取出保存的用戶信息 即可對token的可用性進行校驗 使得單點登錄更為簡單

2、JWT校驗的過程

1、瀏覽器發送用戶名和密碼 發起登錄請求2、服務端驗證身份 根據算法將用戶標識符打包生成token字符串 并且返回給瀏覽器3、當瀏覽器需要發起請求時 將token一起發送給服務器4、服務器發現數據中攜帶有token 隨即進行解密和鑒權5、校驗成功 服務器返回請求的數據

二、使用

1、首先是導包

<!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- Spring Security和JWT整合 --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-jwt</artifactId><version>1.0.10.RELEASE</version></dependency><!-- JWT --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!-- 字符串轉換需要用到此包 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency>

2、實體類

兩個實體類 一個是用戶 另一個是權限

public class User { private Integer id; private String username; private String password; 省略gettersetter之類的代碼...}

public class Role { private Integer id; private String username; private String name; 省略gettersetter之類的代碼...}

3、然后需要一個Utils工具類

該類用于進行Token的加密和解密 可在此類中單元測試

import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import java.util.Date;import java.util.HashMap;import java.util.Map;public class JwtTokenUtil { // Token請求頭 public static final String TOKEN_HEADER = 'Authorization'; // Token前綴 public static final String TOKEN_PREFIX = 'Bearer '; // 簽名主題 public static final String SUBJECT = 'piconjo'; // 過期時間 public static final long EXPIRITION = 1000 * 24 * 60 * 60 * 7; // 應用密鑰 public static final String APPSECRET_KEY = 'piconjo_secret'; // 角色權限聲明 private static final String ROLE_CLAIMS = 'role'; /** * 生成Token */ public static String createToken(String username,String role) { Map<String,Object> map = new HashMap<>(); map.put(ROLE_CLAIMS, role); String token = Jwts.builder().setSubject(username).setClaims(map).claim('username',username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)).signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact(); return token; } /** * 校驗Token */ public static Claims checkJWT(String token) { try { final Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 從Token中獲取username */ public static String getUsername(String token){ Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims.get('username').toString(); } /** * 從Token中獲取用戶角色 */ public static String getUserRole(String token){ Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims.get('role').toString(); } /** * 校驗Token是否過期 */ public static boolean isExpiration(String token){ Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims.getExpiration().before(new Date()); }}

4、配置UserDetailsService的實現類 用于加載用戶信息

import xxx.xxx.xxx.bean.Role; // 自己的包import xxx.xxx.xxx.bean.User; // 自己的包import xxx.xxx.xxx.mapper.UserMapper; // 自己的包import org.springframework.beans.factory.annotation.Autowired;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 java.util.ArrayList;import java.util.List;@Servicepublic class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { if (s == null || ''.equals(s)) { throw new RuntimeException('用戶不能為空'); } // 調用方法查詢用戶 User user = userMapper.findUserByUsername(s); if (user == null) { throw new RuntimeException('用戶不存在'); } List<SimpleGrantedAuthority> authorities = new ArrayList<>(); for (Role role:userMapper.findRoleByUsername(s)) { authorities.add(new SimpleGrantedAuthority('ROLE_'+role.getName())); } return new org.springframework.security.core.userdetails.User(user.getUsername(),'{noop}'+user.getPassword(),authorities); }}

5、然后 配置兩個攔截器

其中 一個用于登錄 另一個用于鑒權

JWTAuthenticationFilter登錄攔截器:

該攔截器用于獲取用戶登錄的信息至于具體的驗證 只需創建一個token并調用authenticationManager的authenticate()方法讓Spring security驗證即可 驗證的事交給框架

import com.alibaba.fastjson.JSON;import xxx.xxx.xxx.utils.JwtTokenUtil; // 自己的包import org.springframework.security.authentication.*;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.core.GrantedAuthority;import org.springframework.security.core.userdetails.User;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.Collection;/** * 驗證用戶名密碼正確后 生成一個token并將token返回給客戶端 */public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private AuthenticationManager authenticationManager; public JWTAuthenticationFilter(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; } /** * 驗證操作 接收并解析用戶憑證 */ @Override public Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException { // 從輸入流中獲取到登錄的信息 // 創建一個token并調用authenticationManager.authenticate() 讓Spring security進行驗證 return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(request.getParameter('username'),request.getParameter('password'))); } /** * 驗證【成功】后調用的方法 * 若驗證成功 生成token并返回 */ @Override protected void successfulAuthentication(HttpServletRequest request,HttpServletResponse response,FilterChain chain,Authentication authResult) throws IOException { User user= (User) authResult.getPrincipal(); // 從User中獲取權限信息 Collection<? extends GrantedAuthority> authorities = user.getAuthorities(); // 創建Token String token = JwtTokenUtil.createToken(user.getUsername(), authorities.toString()); // 設置編碼 防止亂碼問題 response.setCharacterEncoding('UTF-8'); response.setContentType('application/json; charset=utf-8'); // 在請求頭里返回創建成功的token // 設置請求頭為帶有'Bearer '前綴的token字符串 response.setHeader('token', JwtTokenUtil.TOKEN_PREFIX + token); // 處理編碼方式 防止中文亂碼 response.setContentType('text/json;charset=utf-8'); // 將反饋塞到HttpServletResponse中返回給前臺 response.getWriter().write(JSON.toJSONString('登錄成功')); } /** * 驗證【失敗】調用的方法 */ @Override protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { String returnData=''; // 賬號過期 if (failed instanceof AccountExpiredException) { returnData='賬號過期'; } // 密碼錯誤 else if (failed instanceof BadCredentialsException) { returnData='密碼錯誤'; } // 密碼過期 else if (failed instanceof CredentialsExpiredException) { returnData='密碼過期'; } // 賬號不可用 else if (failed instanceof DisabledException) { returnData='賬號不可用'; } //賬號鎖定 else if (failed instanceof LockedException) { returnData='賬號鎖定'; } // 用戶不存在 else if (failed instanceof InternalAuthenticationServiceException) { returnData='用戶不存在'; } // 其他錯誤 else{ returnData='未知異常'; } // 處理編碼方式 防止中文亂碼 response.setContentType('text/json;charset=utf-8'); // 將反饋塞到HttpServletResponse中返回給前臺 response.getWriter().write(JSON.toJSONString(returnData)); }}

JWTAuthorizationFilter權限校驗攔截器:

當訪問需要權限校驗的URL(當然 該URL也是需要經過配置的) 則會來到此攔截器 在該攔截器中對傳來的Token進行校驗只需告訴Spring security該用戶是否已登錄 并且是什么角色 擁有什么權限即可

import xxx.xxx.xxx.utils.JwtTokenUtil; // 自己的包import org.apache.commons.lang3.StringUtils;import org.springframework.security.authentication.AuthenticationManager;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.authority.SimpleGrantedAuthority;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;import java.util.Collection;/** * 登錄成功后 走此類進行鑒權操作 */public class JWTAuthorizationFilter extends BasicAuthenticationFilter { public JWTAuthorizationFilter(AuthenticationManager authenticationManager) { super(authenticationManager); } /** * 在過濾之前和之后執行的事件 */ @Override protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws IOException, ServletException { String tokenHeader = request.getHeader(JwtTokenUtil.TOKEN_HEADER); // 若請求頭中沒有Authorization信息 或是Authorization不以Bearer開頭 則直接放行 if (tokenHeader == null || !tokenHeader.startsWith(JwtTokenUtil.TOKEN_PREFIX)) { chain.doFilter(request, response); return; } // 若請求頭中有token 則調用下面的方法進行解析 并設置認證信息 SecurityContextHolder.getContext().setAuthentication(getAuthentication(tokenHeader)); super.doFilterInternal(request, response, chain); } /** * 從token中獲取用戶信息并新建一個token * * @param tokenHeader 字符串形式的Token請求頭 * @return 帶用戶名和密碼以及權限的Authentication */ private UsernamePasswordAuthenticationToken getAuthentication(String tokenHeader) { // 去掉前綴 獲取Token字符串 String token = tokenHeader.replace(JwtTokenUtil.TOKEN_PREFIX, ''); // 從Token中解密獲取用戶名 String username = JwtTokenUtil.getUsername(token); // 從Token中解密獲取用戶角色 String role = JwtTokenUtil.getUserRole(token); // 將[ROLE_XXX,ROLE_YYY]格式的角色字符串轉換為數組 String[] roles = StringUtils.strip(role, '[]').split(', '); Collection<SimpleGrantedAuthority> authorities=new ArrayList<>(); for (String s:roles) { authorities.add(new SimpleGrantedAuthority(s)); } if (username != null) { return new UsernamePasswordAuthenticationToken(username, null,authorities); } return null; }}

6、再配置一個自定義類 用于進行匿名用戶訪問資源時無權限的處理

該類需實現AuthenticationEntryPoint

import com.alibaba.fastjson.JSONObject;import org.springframework.security.core.AuthenticationException;import org.springframework.security.web.AuthenticationEntryPoint;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class JWTAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.setCharacterEncoding('utf-8'); response.setContentType('text/javascript;charset=utf-8'); response.getWriter().print(JSONObject.toJSONString('您未登錄,沒有訪問權限')); }}

7、最后 將這些組件組裝到一起即可

創建一個自定義的配置類 繼承WebSecurityConfigurerAdapter在該類上 需加@EnableWebSecurity注解 配置Web安全過濾器和啟用全局認證機制

import xxx.xxx.xxx.JWTAuthenticationEntryPoint; // 自己的包import xxx.xxx.xxx.xxx.JWTAuthenticationFilter; // 自己的包import xxx.xxx.xxx.xxx.JWTAuthorizationFilter; // 自己的包import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;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.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.config.http.SessionCreationPolicy;import org.springframework.security.core.userdetails.UserDetailsService;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.CorsConfigurationSource;import org.springframework.web.cors.UrlBasedCorsConfigurationSource;@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired @Qualifier('userDetailsServiceImpl') private UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } /** * 安全配置 */ @Override protected void configure(HttpSecurity http) throws Exception { // 跨域共享 http.cors().and()// 跨域偽造請求限制無效.csrf().disable().authorizeRequests()// 訪問/data需要ADMIN角色.antMatchers('/data').hasRole('ADMIN')// 其余資源任何人都可訪問.anyRequest().permitAll().and()// 添加JWT登錄攔截器.addFilter(new JWTAuthenticationFilter(authenticationManager()))// 添加JWT鑒權攔截器.addFilter(new JWTAuthorizationFilter(authenticationManager())).sessionManagement()// 設置Session的創建策略為:Spring Security永不創建HttpSession 不使用HttpSession來獲取SecurityContext.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()// 異常處理.exceptionHandling()// 匿名用戶訪問無權限資源時的異常.authenticationEntryPoint(new JWTAuthenticationEntryPoint()); } /** * 跨域配置 * @return 基于URL的跨域配置信息 */ @Bean CorsConfigurationSource corsConfigurationSource() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 注冊跨域配置 source.registerCorsConfiguration('/**', new CorsConfiguration().applyPermitDefaultValues()); return source; }}

定義一個用于測試的對外映射接口:

@RestControllerpublic class UserController { @GetMapping('/data') private ResponseUtil data() { return 'This is data.'; }}

默認登錄路徑是/login 用POST請求發送

若要修改默認的登錄路徑 只需要在自己定義的登錄過濾器JWTAuthenticationFilter的構造方法里進行配置即可比如 若想修改為/api/login:

public JWTAuthenticationFilter(AuthenticationManager authenticationManager){ this.authenticationManager = authenticationManager; // 設置登錄URL super.setFilterProcessesUrl('/api/login');}

登錄時 參數的屬性名分別是username和password 不能改動:

SpringBoot集成Spring Security用JWT令牌實現登錄和鑒權的方法

登錄成功后會返回一個Token:

SpringBoot集成Spring Security用JWT令牌實現登錄和鑒權的方法

在請求需要權限的接口路徑時 若不帶上Token 則會提示沒有訪問權限

SpringBoot集成Spring Security用JWT令牌實現登錄和鑒權的方法

帶上Token后再次請求 即可正常訪問:

注:Token的前面要帶有Bearer 的前綴

SpringBoot集成Spring Security用JWT令牌實現登錄和鑒權的方法

這樣 一個基本的實現就差不多完成了

為簡單演示 在該案例中就不對密碼進行加密了 實際開發是需要對明文密碼加密后存儲的 推薦用BCrypt進行加密和解密為節省篇幅 用于注冊的接口也不寫了 實際上在注冊接口傳入的密碼也需要用BCrypt加密后再存入數據庫中還可以用Redis進行Token的存儲 這些都是后話了

到此這篇關于SpringBoot集成Spring Security用JWT令牌實現登錄和鑒權的方法的文章就介紹到這了,更多相關SpringBoot JWT令牌登錄和鑒權內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 久久国产婷婷国产香蕉 | 亚洲v日韩v综合v精品v | av一区二区在线观看 | a一级片在线观看 | 丁香久久 | 成人精品在线 | 国产一区二区三区在线 | 天堂资源| 久久1区 | 蜜桃毛片 | 国产成人精品久久 | 欧美极品视频 | 久久久精品网 | 日本黄色a级| 欧美日韩在线一区 | 日韩拍拍 | 人人操日日干 | 日韩国产精品一区二区三区 | 一区二区三区四区在线 | 精品无人乱码一区二区三区 | 亚洲欧美日韩电影 | 在线涩涩 | 久久视频在线 | xvideos视频| 国产精品美乳一区二区免费 | 日本三级中文在线电影 | 亚洲生活片| 97久久久 | 日韩国产在线 | 中文字幕爱爱视频 | 国产最新一区 | 夜夜爽99久久国产综合精品女不卡 | 国产精品久久久久久中文字 | 99免费视频 | 综合网视频 | 亚洲v在线 | 成人午夜网 | 亚洲精品18| 久热亚洲| 欧美男人的天堂 | 久久久久久久国产精品 | 国产精品成人一区二区三区 | 欧洲精品| 91.成人天堂一区 | 久久午夜视频 | 国产精品视频一二三区 | 欧美理论片在线观看 | 国产精品久久久久久久久久 | 国产99久久久久久免费看农村 | 国产精品一区在线 | 天天色天天射天天操 | 国产日韩一区二区三区 | 毛片在线网站 | 琪琪午夜伦伦电影福利片 | 欧美中文在线 | av黄色一级 | 欧美日韩视频第一页 | 激情综合网五月婷婷 | 亚洲天天| 精品亚洲一区二区三区 | 四虎影视 | 亚洲视频在线播放 | 亚洲精品电影网在线观看 | 在线亚洲一区 | 自拍视频在线观看免费 | 欧美日韩精品网站 | 国产视频二| 久久久久久国产一级毛片高清版 | 一区二区三区回区在观看免费视频 | 澳门av| 日韩一区二区在线观看 | 久久精品国产精品青草 | 国产精品日韩精品 | 欧美一区二区三区 | 一区二区三区在线免费播放 | 久久精品国产视频 | 最新黄色网址在线播放 | 成人国产免费视频 | 午夜视频在线免费观看 | 日韩一区二区三区在线观看 | 三级黄色片在线免费观看 | 国产精品成人观看视频国产奇米 | 精品国产精品 | 亚洲视频在线观看免费 | 成年人在线看片 | 午夜欧美 | 欧美 亚洲 一区 | 精品99久久| 毛片一区 | 国产精品久久久久久无遮挡 | 桃色五月 | 成人性视频免费网站 | 欧美视频区 | 精品香蕉一区二区三区 | 一区二区三区在线观看国产 | 欧美一级二级片 | 欧美日韩不卡视频 | 亚州精品国产 | 香蕉婷婷 | 亚洲综合在线一区 | 国产精品久久一区 | 成人在线一区二区三区 | 91精品国产日韩91久久久久久 | 四虎com| 狠狠做深爱婷婷综合一区 | 久久av资源 | 91在线视频在线观看 | 精品国产乱码久久久久久1区2区 | 欧美亚洲国产日韩 | 国产一级黄色大片 | 久久亚洲天堂 | 日韩亚洲视频在线观看 | 91精品国产91久久综合桃花 | 久久不卡日韩美女 | 日韩日韩 | www日韩欧美 | 国产精品美女久久久久久免费 | 成人免费淫片aa视频免费 | 国产毛片在线看 | 久久黄网| 一级全黄少妇性色生活片毛片 | 成人看片网 | 国产精品亚洲区 | 国产成人61精品免费看片 | 精品一区二区久久久久久久网站 | 嫩草影院永久入口 | 国产精品高潮呻吟久久av黑人 | 中文字幕在线视频观看 | 日韩精品在线网站 | 日韩精品一区二区三区老鸭窝 | 青青久久 | 免费看一区二区三区 | 人人爱超碰 | 亚洲自拍一区在线 | 欧美黄色网 | 99亚洲国产| 久久国产高清 | 亚洲福利一区二区 | 一级片在线免费看 | 日韩精品在线播放 | 欧美一区二区三区免费 | 精品中文在线 | 国产精品美女视频一区二区三区 | 亚洲欧美精品 | 污色视频在线观看 | 精品国产乱码简爱久久久久久 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 亚洲成人久久久 | 国产日韩视频 | 久久精品国产99国产精品 | 自拍视频在线观看 | 欧美一区二区三区爽大粗免费 | 99热69| 亚洲伊人精品酒店 | 午夜激情在线观看 | 一级做a爰性色毛片免费1 | 亚洲免费观看 | 国外成人在线视频 | 欧美日韩一区二区视频在线观看 | 成人免费网站视频 | 91在线免费观看 | 杨门女将寡妇一级裸片看 | 一区二区三区 在线 | 中文字幕观看 | 亚洲欧美日韩在线 | 国产一区免费在线观看 | 国产精品日韩欧美 | 亚洲免费一区二区 | 日本中文字幕在线观看 | 国内精品视频一区国产 | 97国产精品视频人人做人人爱 | 久久夜视频 | 欧美精品一区二区三区蜜桃视频 | 亚洲三级视频 | 国产高清精品一区二区三区 | 国产欧美精品一区二区三区 | 免费在线观看一区二区 | 国产在线h| 欧美日韩国产一区二区三区 | 久久三区| 久久久国产精品入口麻豆 | 欧洲在线一区 | 色综合久久天天综合网 | 欧美成人免费视频 | 女朋友的闺蜜3韩国三级 | 黄a在线| 偷拍呻吟高潮91 | 国产一区二区视频在线播放 | 狠狠久久婷婷 | 亚洲一区二区三区四区在线观看 | 视频一区二区中文字幕日韩 | 欧美日韩国产一区二区三区不卡 | 国产精品久久一区 | 视频精品一区二区三区 | 国产精品三级久久久久久电影 | 日韩在线精品视频 | 天天射影院 | 男人久久天堂 | 亚洲精品一区二区三区在线看 | 国产一区精品视频 | 一区二区三区自拍 | 午夜草民福利电影 | 91av导航| 久久女同互慰一区二区三区 | 成人在线网址 | 在线观看中文字幕 | 免费黄色看片 | 久久久久久免费免费 | 亚洲精品国产setv | 国产精品高清在线 | 欧美成人一区二区三区片免费 | 黄色一级大片网站 | 久久久久久久一区 | 欧美日韩国产一区二区三区不卡 | 午夜寂寞少妇aaa片毛片 | 香蕉久久一区二区不卡无毒影院 | 一区二区三区免费在线 | 欧美日韩激情 | 欧美一级二级三级 | 国产一区二区在线电影 | 欧美日韩在线精品 | 亚洲人成人一区二区在线观看 | 国产成人一区二区 | 欧洲精品在线观看 | 精品国产成人 | 色综合一区 | 亚洲精品中文字幕在线观看 | 99久久精品免费看国产免费粉嫩 | 三级在线观看 | 君岛美绪一区二区三区在线视频 | 国产视频久久久久 | 成人在线视频观看 | v888av成人| 国产精品久久久久影院色老大 | 一级电影在线观看 | 美女毛片| 性视频网| 中文字幕一区二区在线观看 | 羞羞视频免费观看 | 中文字幕免费看 | 在线天堂新版最新版在线8 www.国产欧美 | 久久久久久av | 国产精品高潮呻吟 | 中文字幕视频在线观看 | 粉嫩av网站| 一级视频在线免费观看 | 日韩三级电影免费观看 | 国产精拍| 欧美综合色 | 国产欧美久久久久久 | 国产乱肥老妇国产一区二 | 日本一区二区三区免费观看 | 蜜臀视频在线观看 | 欧美精品一区视频 | 日本亚洲一区 | 国产中文字幕一区 | 农村末发育av片四区五区 | 日韩在线资源 | 日本三级黄色录像 | 国产精品毛片无码 | 成人在线小视频 | 看一级毛片视频 | 日韩视频一区二区 | 欧美午夜电影 | 久久三区 | 日韩视频在线观看一区 | 欧美在线三级 | 亚洲午夜精品久久久久久app | 日韩精品一区在线 | 欧美激情 在线 | 久久久免费观看 | 久久久久国产成人精品亚洲午夜 | 日韩精品久久久 | 91人人| 99成人| 不卡的av电影 | 一区二区三区视频免费在线观看 | 福利在线播放 | 亚洲一区 中文字幕 | 五月天婷婷精品 | 精品国产区| 国产精品成人国产乱一区 | 色吊丝在线永久观看最新版本 | 国产欧美日韩一区二区三区 | 欧美日韩在线看 | 天天操天天碰 | 久久91精品国产91久久跳 | 亚洲国产精品自拍 | 香蕉视频黄色 | 日本一区二区精品视频 | 国产1区 | 这里只有精品视频 | 99亚洲国产精品 | 久久男人天堂 | 欧美a网 | 99精品欧美一区二区三区 | 日韩另类| 337p亚洲欧洲 | av电影一区二区 | 在线色av | 欧美自拍视频在线 | 久久久久国产视频 | 成年人黄色一级毛片 | 亚洲欧美精品一区二区三区 | 亚洲成av人片在线观看 | www久久久 | 欧美亚洲性视频 | 亚洲综合无码一区二区 | 99精品国产高清一区二区麻豆 | 特黄色一级片 | 欧美日韩精品一区二区在线播放 | 久久av综合网| 国产精品国产精品国产专区不蜜 | 日本黄色一级片视频 | 日韩一区二区三区在线观看 | 天天艹逼| 日本一区二区不卡 | 久久精品免费观看视频 | 色www精品视频在线观看 | 簧片av| 亚洲欧美自拍视频 | 欧美不卡 | 精品一区二区久久久久久久网站 | 欧美日韩亚洲视频 | 日韩三区视频 | 成人影院欧美黄色 | 成人在线免费 | 高清久久| 欧美午夜三级视频 | 99久久婷婷国产精品综合 | 国产 一区 | 欧美国产精品一区 | 国产精品久久久久久久久久久杏吧 | 天天综合网91 | 国产精品欧美久久久久一区二区 | 久久综合久久综合久久 | 久久精品免费电影 | aa毛片| 国产免费av网站 | 欧美日韩中文 | 亚洲精品久久久久久动漫 | 视频福利一区 | 国产免费天天看高清影视在线 | 一级片 | 可以在线观看的av网站 | 草草视频在线观看 | 精品久久久久久久久久久 | 日韩av入口| 午夜精品久久久久久 | 中文字幕日韩专区 | 国产精品综合 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 黄色毛片在线看 | 中文字幕在线观看 | 日韩免费在线观看视频 | 香蕉国产精品 | 美女视频一区 | 日韩一区二区三区精品 | 毛片免费观看视频 | 亚洲国产精品第一区二区 | 天堂男人在线 | 99热精品在线 | 中文字幕视频在线 | 国产精品久久久久久久久久东京 | 日韩综合一区二区 | 欧美日韩高清在线一区 | 国产女人和拘做受在线视频 | 欧美美乳| 一级高清视频 | 日韩av高清在线 | 成人免费网站www网站高清 | 欧美一级免费播放 | 91激情视频 | a一级毛片 | 欧美视频在线播放 | 日韩精品一区在线 | 欧美精品一区二 | 91在线观看网站 | 国产福利在线播放 | 在线观看亚洲专区 | 亚洲福利一区 | av免费网站 | 亚洲网站在线观看 | 欧美日韩国产高清 | 久久中文在线观看 | 国产成人一区 | 国产乱码精品一区二区三区忘忧草 | 日日鲁鲁 | 亚洲欧美第一页 | 亚洲精品一区在线观看 | 亚洲三级在线观看 | 亚洲欧美一区二区三区四区 | 欧美一级黄色片 | 专干老肥女人88av | 精品国产鲁一鲁一区二区三区 | 色噜噜视频 | 成人高清网站 | 不卡视频一区 | 欧美成人一区二区三区 | 美女二区 | 国产一区二区视频在线观看 | 久久精品日 | 欧美精品免费在线观看 | 91久久夜色精品国产网站 | 香蕉久久久 | 国产精品久久久久久久久久小说 | 涩涩导航| 中文精品在线 | 成人免费网站视频 | 久久中文在线观看 | 亚洲三级在线播放 | 99re在线观看 | 日韩和的一区二区 | 久久国产精品视频 | 日韩大尺度电影在线观看 | 中文字幕第33页 | 国产毛片毛片 | 性视频亚洲 | 亚洲国产精品久久久久久 | 91一区二区在线观看 | 国产一区二区三区在线 | 伊人免费观看视频 | 一区二区三区四区不卡视频 | 国产视频一区二区三区四区 | 日韩快播电影网 | 欧美成人免费 | 国产视频第一页 | 成人av在线网 | 亚洲一区二区中文字幕 | 在线视频91| 国产精品一区三区 | 国产一区二区在线免费观看 | 欧美一级免费大片 | 国产日产精品一区二区三区四区 | 色吟av| 久久伊人精品视频 | 97精品久久 | 日韩福利影院 | 亚洲免费视频大全 | 免费午夜电影 | 国产日韩一区二区三区 | 天天射影院 | 久久一区| 杨门女将寡妇一级裸片看 | 欧美精产国品一二三区 | 国产精品一区av | 天天摸天天看 | 羞视频在线观看 | 久久国产精品视频 | 久久99精品视频 | 久久毛片 | 亚洲精品视频免费观看 | 欧美亚洲一区二区三区 | 九色91视频| 欧美日韩视频在线观看一区 | 成人中文字幕在线 | 一区二区三区高清不卡 | 日韩中文一区 | 欧美国产三级 | 99中文字幕 | 精品视频一区二区 | 另类中文字幕 | 精品一区二区av | 天堂√在线观看一区二区 | 三级在线免费 | 亚洲精美视频 | 精品综合久久 | 亚洲国产精品99久久久久久久久 | 国产一区二区在线观看视频 | 久久久久久久久一区二区三区 | 精品无码久久久久久国产 | 真人女人一级毛片免费播放 | 天天操妹子 | 国产亚洲欧美一区二区 | 99在线精品视频 | 欧美日韩成人 | 日韩拍拍 | 久久久久成人精品 | 亚洲欧美少妇 | 国产中文在线播放 | 欧美日韩国产一区二区三区 | 亚洲中午字幕 | 欧美视频在线播放 | a一级免费视频 | 久草福利在线视频 | 国产精品777 | 成人网av | 精品免费视频 | 午夜视频在线观看免费视频 | 91中文在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲高清中文字幕 | 日韩精品一区二区在线观看视频 | 亚洲综合色自拍一区 | 97久久精品人人做人人爽50路 | 国产精品永久久久久久久久久 | 国产精品久久久久久久久 | av一区二区三区四区 | 日韩三区 | 日韩欧美二区 | 久久国产欧美日韩精品 | 精品国产91乱码一区二区三区 | 欧美寡妇偷汉性猛交 | 91精品一区 | 久久人人爽人人爽 | 最新国产精品精品视频 | 国产亚洲精品美女久久久久久久久久 | 欧美日韩精品综合 | 欧美一区二区三区 | 免费观看羞羞视频网站 | 亚洲成人精品在线 | www.色综合 | 久久久国产精品入口麻豆 | 日韩精品免费在线观看 | 可以在线观看的黄色 | 狠狠干av | 国产黄色在线观看 | 亚洲福利一区二区 | 国产精品美女久久久久久久久久久 | 久久一区国产 | 九九在线视频 | 亚洲一区中文字幕在线观看 | 玖玖操| 亚洲国产成人久久 | 日韩av资源站 | 国产成人高清精品免费5388 | 国产h视频在线观看 | 国产欧美日韩综合精品一区二区 | 国变精品美女久久久久av爽 | 亚洲精品日韩激情在线电影 | 久热中文在线 | 一区二区三区国产免费 | 国产福利一区二区 | 欧美一区二区三 | 欧美性猛片 | 香蕉大人久久国产成人av | 北条麻妃国产九九九精品小说 | 中文在线播放 | 精品久久久一区 | 成人亚洲视频 | 成人动慢| 亚洲网站在线观看 | 国产精品一区在线观看 | 欧美一区二区三区在线 | 精品国产三级 | www.久久精品 | 美女扒开尿口来摸 | 午夜一区二区三区在线观看 | 色爱区综合五月激情 | 日韩在线成人 | 亚洲精品在线看 | 狠狠做深爱婷婷综合一区 | 亚洲成人av一区二区 | 精品av | 性做久久久久久久免费看 | 一区二区三区四区视频 | 四影虎影ww4hu55.com | 国产午夜精品一区二区三区免费 | 午夜久久久 | 国产视频一区二区 | 久久久精品免费观看 | 欧美成人精品一区二区三区 | 午夜婷婷激情 | 久久欧美精品一区 | 国产成人涩涩涩视频在线观看 | 草草视频在线免费观看 | 欧美一区二区三区在线观看视频 | 亚洲美女视频 | 日韩免费高清在线 | 亚洲精品欧美视频 | 日韩精品久久久久久 | 99这里只有精品视频 | 免费看国产片在线观看 | 日韩精品一区二区三区视频播放 | 国产一二区在线观看 | 国产成人精品一区二区三区视频 | 国产一区二区免费 | 岛国av免费观看 | 天天干夜夜爽 | 国产综合视频 | 美女视频一区二区三区 | 欧美一区二区三区男人的天堂 | 一区二区三区播放 | 欧美日韩在线免费观看 | 国产麻豆乱码精品一区二区三区 | 精品欧美乱码久久久久久 | 久久成人一区二区 | 浴室洗澡偷拍一区二区 | 一区二区三区免费网站 | 欧美日韩一区二区在线观看 | 91精品国产高清一区二区三区 | 色小妹三区 | 欧美午夜一区二区三区免费大片 | 九九天堂 | 日韩av免费 | 亚洲免费观看视频 | 日韩在线中文字幕 | 91爱啪啪 | 国产精品久久 | 亚洲第一视频 | 久久久999精品视频 五月天婷婷在线视频 | 一级欧美一级日韩 | 久久在线| 国产精品久久久久久亚洲调教 | ririsao亚洲国产中文 | 图片区 国产 欧美 另类 在线 | 国产美女自拍视频 | 色网在线| 激情网在线观看 | 91成人黄色 | 国产欧美日韩成人 | 久久国内 | 亚洲一区二区免费看 | 99热这里有精品 | 永久精品|