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

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

SpringBoot和Redis實現Token權限認證的實例講解

瀏覽:2日期:2023-03-25 08:09:52
一、引言

登陸權限控制是每個系統都應必備的功能,實現方法也有好多種。下面使用Token認證來實現系統的權限訪問。

功能描述:

用戶登錄成功后,后臺返回一個token給調用者,同時自定義一個@AuthToken注解,被該注解標注的API請求都需要進行token效驗,效驗通過才可以正常訪問,實現接口級的鑒權控制。

同時token具有生命周期,在用戶持續一段時間不進行操作的話,token則會過期,用戶一直操作的話,則不會過期。

二、環境

SpringBoot

Redis(Docke中鏡像)

MySQL(Docker中鏡像)

三、流程分析1、流程分析

(1)、客戶端登錄,輸入用戶名和密碼,后臺進行驗證,如果驗證失敗則返回登錄失敗的提示。

如果驗證成功,則生成 token 然后將 username 和 token 雙向綁定 (可以根據 username 取出 token 也可以根據 token 取出username)存入redis,同時使用 token+username 作為key把當前時間戳也存入redis。并且給它們都設置過期時間。

(2)、每次請求接口都會走攔截器,如果該接口標注了@AuthToken注解,則要檢查客戶端傳過來的Authorization字段,獲取 token。

由于 token 與 username 雙向綁定,可以通過獲取的 token 來嘗試從 redis 中獲取 username,如果可以獲取則說明 token 正確,反之,說明錯誤,返回鑒權失敗。

(3)、token可以根據用戶使用的情況來動態的調整自己過期時間。

在生成 token 的同時也往 redis 里面存入了創建 token 時的時間戳,每次請求被攔截器攔截 token 驗證成功之后,將當前時間與存在 redis 里面的 token 生成時刻的時間戳進行比較,當當前時間的距離創建時間快要到達設置的redis過期時間的話,就重新設置token過期時間,將過期時間延長。

如果用戶在設置的 redis 過期時間的時間長度內沒有進行任何操作(沒有發請求),則token會在redis中過期。

四、具體代碼實現1、自定義注解

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface AuthToken {}2、登陸控制器

@RestControllerpublic class welcome { Logger logger = LoggerFactory.getLogger(welcome.class); @Autowired Md5TokenGenerator tokenGenerator; @Autowired UserMapper userMapper; @GetMapping('/welcome') public String welcome(){ return 'welcome token authentication'; } @RequestMapping(value = '/login', method = RequestMethod.GET) public ResponseTemplate login(String username, String password) { logger.info('username:'+username+' password:'+password); User user = userMapper.getUser(username,password); logger.info('user:'+user); JSONObject result = new JSONObject(); if (user != null) { Jedis jedis = new Jedis('192.168.1.106', 6379); String token = tokenGenerator.generate(username, password); jedis.set(username, token); //設置key生存時間,當key過期時,它會被自動刪除,時間是秒 jedis.expire(username, ConstantKit.TOKEN_EXPIRE_TIME); jedis.set(token, username); jedis.expire(token, ConstantKit.TOKEN_EXPIRE_TIME); Long currentTime = System.currentTimeMillis(); jedis.set(token + username, currentTime.toString()); //用完關閉 jedis.close(); result.put('status', '登錄成功'); result.put('token', token); } else { result.put('status', '登錄失敗'); } return ResponseTemplate.builder() .code(200) .message('登錄成功') .data(result) .build(); } //測試權限訪問 @RequestMapping(value = 'test', method = RequestMethod.GET) @AuthToken public ResponseTemplate test() { logger.info('已進入test路徑'); return ResponseTemplate.builder() .code(200) .message('Success') .data('test url') .build(); }}3、攔截器

@Slf4jpublic class AuthorizationInterceptor implements HandlerInterceptor { //存放鑒權信息的Header名稱,默認是Authorization private String httpHeaderName = 'Authorization'; //鑒權失敗后返回的錯誤信息,默認為401 unauthorized private String unauthorizedErrorMessage = '401 unauthorized'; //鑒權失敗后返回的HTTP錯誤碼,默認為401 private int unauthorizedErrorCode = HttpServletResponse.SC_UNAUTHORIZED; //存放登錄用戶模型Key的Request Key public static final String REQUEST_CURRENT_KEY = 'REQUEST_CURRENT_KEY'; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); // 如果打上了AuthToken注解則需要驗證token if (method.getAnnotation(AuthToken.class) != null || handlerMethod.getBeanType().getAnnotation(AuthToken.class) != null) { String token = request.getParameter(httpHeaderName); log.info('Get token from request is {} ', token); String username = ''; Jedis jedis = new Jedis('192.168.1.106', 6379); if (token != null && token.length() != 0) { username = jedis.get(token); log.info('Get username from Redis is {}', username); } if (username != null && !username.trim().equals('')) { Long tokeBirthTime = Long.valueOf(jedis.get(token + username)); log.info('token Birth time is: {}', tokeBirthTime); Long diff = System.currentTimeMillis() - tokeBirthTime; log.info('token is exist : {} ms', diff); if (diff > ConstantKit.TOKEN_RESET_TIME) { jedis.expire(username, ConstantKit.TOKEN_EXPIRE_TIME); jedis.expire(token, ConstantKit.TOKEN_EXPIRE_TIME); log.info('Reset expire time success!'); Long newBirthTime = System.currentTimeMillis(); jedis.set(token + username, newBirthTime.toString()); } //用完關閉 jedis.close(); request.setAttribute(REQUEST_CURRENT_KEY, username); return true; } else { JSONObject jsonObject = new JSONObject(); PrintWriter out = null; try { response.setStatus(unauthorizedErrorCode); response.setContentType(MediaType.APPLICATION_JSON_VALUE); jsonObject.put('code', ((HttpServletResponse) response).getStatus()); jsonObject.put('message', HttpStatus.UNAUTHORIZED); out = response.getWriter(); out.println(jsonObject); return false; } catch (Exception e) { e.printStackTrace(); } finally { if (null != out) { out.flush(); out.close(); } } } } request.setAttribute(REQUEST_CURRENT_KEY, null); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}4、測試結果

SpringBoot和Redis實現Token權限認證的實例講解

SpringBoot和Redis實現Token權限認證的實例講解

五、小結

登陸權限控制,實際上利用的就是攔截器的攔截功能。因為每一次請求都要通過攔截器,只有攔截器驗證通過了,才能訪問想要的請求路徑,所以在攔截器中做校驗Token校驗。

想要代碼,可以去GitHub上查看。

https://github.com/Hofanking/token-authentication.git

攔截器介紹,可以參考 這篇文章

補充:springboot+spring security+redis實現登錄權限管理

筆者負責的電商項目的技術體系是基于SpringBoot,為了實現一套后端能夠承載ToB和ToC的業務,需要完善現有的權限管理體系。

在查看Shiro和Spring Security對比后,筆者認為Spring Security更加適合本項目使用,可以總結為以下2點:

1、基于攔截器的權限校驗邏輯,可以針對ToB的業務接口來做相關的權限校驗,以筆者的項目為例,ToB的接口請求路徑以/openshop/api/開頭,可以根據接口請求路徑配置全局的ToB的攔截器;

2、Spring Security的權限管理模型更簡單直觀,對權限、角色和用戶做了很好的解耦。

以下介紹本項目的實現步驟

一、在項目中添加Spring相關依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>1.5.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.8.RELEASE</version> </dependency>二、使用模板模式定義權限管理攔截器抽象類

public abstract class AbstractAuthenticationInterceptor extends HandlerInterceptorAdapter implements InitializingBean { @Resource private AccessDecisionManager accessDecisionManager; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //檢查是否登錄 String userId = null; try { userId = getUserId(); }catch (Exception e){ JsonUtil.renderJson(response,403,'{}'); return false; } if(StringUtils.isEmpty(userId)){ JsonUtil.renderJson(response,403,'{}'); return false; } //檢查權限 Collection<? extends GrantedAuthority> authorities = getAttributes(userId); Collection<ConfigAttribute> configAttributes = getAttributes(request); return accessDecisionManager.decide(authorities,configAttributes); } //獲取用戶id public abstract String getUserId(); //根據用戶id獲取用戶的角色集合 public abstract Collection<? extends GrantedAuthority> getAttributes(String userId); //查詢請求需要的權限 public abstract Collection<ConfigAttribute> getAttributes(HttpServletRequest request);}三、權限管理攔截器實現類 AuthenticationInterceptor

@Componentpublic class AuthenticationInterceptor extends AbstractAuthenticationInterceptor { @Resource private SessionManager sessionManager; @Resource private UserPermissionService customUserService; @Override public String getUserId() { return sessionManager.obtainUserId(); } @Override public Collection<? extends GrantedAuthority> getAttributes(String s) { return customUserService.getAuthoritiesById(s); } @Override public Collection<ConfigAttribute> getAttributes(HttpServletRequest request) { return customUserService.getAttributes(request); } @Override public void afterPropertiesSet() throws Exception { }}四、用戶Session信息管理類

集成redis維護用戶session信息

@Componentpublic class SessionManager { private static final Logger logger = LoggerFactory.getLogger(SessionManager.class); @Autowired private RedisUtils redisUtils; public SessionManager() { } public UserInfoDTO obtainUserInfo() { UserInfoDTO userInfoDTO = null; try { String token = this.obtainToken(); logger.info('=======token=========', token); if (StringUtils.isEmpty(token)) { LemonException.throwLemonException(AccessAuthCode.sessionExpired.getCode(), AccessAuthCode.sessionExpired.getDesc()); } userInfoDTO = (UserInfoDTO)this.redisUtils.obtain(this.obtainToken(), UserInfoDTO.class); } catch (Exception var3) { logger.error('obtainUserInfo ex:', var3); } if (null == userInfoDTO) { LemonException.throwLemonException(AccessAuthCode.sessionExpired.getCode(), AccessAuthCode.sessionExpired.getDesc()); } return userInfoDTO; } public String obtainUserId() { return this.obtainUserInfo().getUserId(); } public String obtainToken() { HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); String token = request.getHeader('token'); return token; } public UserInfoDTO createSession(UserInfoDTO userInfoDTO, long expired) { String token = UUIDUtil.obtainUUID('token.'); userInfoDTO.setToken(token); if (expired == 0L) { this.redisUtils.put(token, userInfoDTO); } else { this.redisUtils.put(token, userInfoDTO, expired); } return userInfoDTO; } public void destroySession() { String token = this.obtainToken(); if (StringUtils.isNotBlank(token)) { this.redisUtils.remove(token); } }}五、用戶權限管理service

@Servicepublic class UserPermissionService { @Resource private SysUserDao userDao; @Resource private SysPermissionDao permissionDao; private HashMap<String, Collection<ConfigAttribute>> map =null; /** * 加載資源,初始化資源變量 */ public void loadResourceDefine(){ map = new HashMap<>(); Collection<ConfigAttribute> array; ConfigAttribute cfg; List<SysPermission> permissions = permissionDao.findAll(); for(SysPermission permission : permissions) { array = new ArrayList<>(); cfg = new SecurityConfig(permission.getName()); array.add(cfg); map.put(permission.getUrl(), array); } }/** * @Author zhangs * @Description 獲取用戶權限列表 * @Date 18:56 2019/11/11 **/ public List<GrantedAuthority> getAuthoritiesById(String userId) { SysUserRspDTO user = userDao.findById(userId); if (user != null) { List<SysPermission> permissions = permissionDao.findByAdminUserId(user.getUserId()); List<GrantedAuthority> grantedAuthorities = new ArrayList <>(); for (SysPermission permission : permissions) { if (permission != null && permission.getName()!=null) { GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(permission.getName()); grantedAuthorities.add(grantedAuthority); } } return grantedAuthorities; } return null; } /* * * @Author zhangs * @Description 獲取當前請求所需權限 * @Date 18:57 2019/11/11 **/ public Collection<ConfigAttribute> getAttributes(HttpServletRequest request) throws IllegalArgumentException { if(map !=null) map.clear(); loadResourceDefine(); AntPathRequestMatcher matcher; String resUrl; for(Iterator<String> iter = map.keySet().iterator(); iter.hasNext(); ) { resUrl = iter.next(); matcher = new AntPathRequestMatcher(resUrl); if(matcher.matches(request)) { return map.get(resUrl); } } return null; }}六、權限校驗類 AccessDecisionManager

通過查看authorities中的權限列表是否含有configAttributes中所需的權限,判斷用戶是否具有請求當前資源或者執行當前操作的權限。

@Servicepublic class AccessDecisionManager { public boolean decide(Collection<? extends GrantedAuthority> authorities, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException { if(null== configAttributes || configAttributes.size() <=0) { return true; } ConfigAttribute c; String needRole; for(Iterator<ConfigAttribute> iter = configAttributes.iterator(); iter.hasNext(); ) { c = iter.next(); needRole = c.getAttribute(); for(GrantedAuthority ga : authorities) { if(needRole.trim().equals(ga.getAuthority())) { return true; } } } return false; }}七、配置攔截規則

@Configurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { @Resource private AbstractAuthenticationInterceptor authenticationInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 多個攔截器組成一個攔截器鏈 // addPathPatterns 用于添加攔截規則 // excludePathPatterns 用戶排除攔截 //對來自/openshop/api/** 這個鏈接來的請求進行攔截 registry.addInterceptor(authenticationInterceptor).addPathPatterns('/openshop/api/**'); super.addInterceptors(registry); }}八 相關表說明

用戶表 sys_user

CREATE TABLE `sys_user` ( `user_id` varchar(64) NOT NULL COMMENT ’用戶ID’, `username` varchar(255) DEFAULT NULL COMMENT ’登錄賬號’, `first_login` datetime(6) NOT NULL COMMENT ’首次登錄時間’, `last_login` datetime(6) NOT NULL COMMENT ’上次登錄時間’, `pay_pwd` varchar(100) DEFAULT NULL COMMENT ’支付密碼’, `chant_id` varchar(64) NOT NULL DEFAULT ’-1’ COMMENT ’關聯商戶id’, `create_time` datetime DEFAULT NULL COMMENT ’創建時間’, `modify_time` datetime DEFAULT NULL COMMENT ’修改時間’, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

角色表 sys_role

CREATE TABLE `sys_role` ( `role_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `create_time` datetime DEFAULT NULL COMMENT ’創建時間’, `modify_time` datetime DEFAULT NULL COMMENT ’修改時間’, PRIMARY KEY (`role_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

用戶角色關聯表 sys_role_user

CREATE TABLE `sys_role_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sys_user_id` varchar(64) DEFAULT NULL, `sys_role_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

權限表 sys_premission

CREATE TABLE `sys_permission` ( `permission_id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL COMMENT ’權限名稱’, `description` varchar(255) DEFAULT NULL COMMENT ’權限描述’, `url` varchar(255) DEFAULT NULL COMMENT ’資源url’, `check_pwd` int(2) NOT NULL DEFAULT ’1’ COMMENT ’是否檢查支付密碼:0不需要 1 需要’, `check_sms` int(2) NOT NULL DEFAULT ’1’ COMMENT ’是否校驗短信驗證碼:0不需要 1 需要’, `create_time` datetime DEFAULT NULL COMMENT ’創建時間’, `modify_time` datetime DEFAULT NULL COMMENT ’修改時間’, PRIMARY KEY (`permission_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

角色權限關聯表 sys_permission_role

CREATE TABLE `sys_permission_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_id` int(11) DEFAULT NULL, `permission_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产日韩精品久久 | 香蕉视频成人在线观看 | 午夜影院a | 国产精品福利在线 | 国产精品免费久久 | 午夜在线 | 亚洲视频 欧美视频 | 天堂中文网官网 | 国产精品免费一区二区三区四区 | 国产精品一二 | 午夜影院在线观看 | 久草免费在线 | 午夜精品久久 | 国产超碰人人爽人人做人人爱 | 在线观看毛片网站 | 日韩精品 电影一区 亚洲 | 国产精品永久久久久久久久久 | 亚洲免费视频网 | 国产高潮呻吟久久渣男片 | 国产女人高潮视频在线观看 | 欧美专区在线 | 亚洲精品电影在线观看 | 国产精品国产成人国产三级 | 日韩视频在线免费观看 | 国产乱肥老妇国产一区二 | 久久久久国产精品 | 91精品国产色综合久久不卡98 | 久久影院一区 | 欧美一区二区三区精品 | 亚洲无吗电影 | 欧美日韩电影一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 国产精品久久久久久久久久10秀 | 亚洲444kkkk在线观看最新 | 99久久婷婷 | 成人综合网站 | 日本高清h色视频在线观看 日日干日日操 | 日摸夜操| 亚洲男人av | 国产精品成人3p一区二区三区 | 国内精品国产成人国产三级粉色 | 欧美一级免费在线观看 | 91免费在线视频 | 日韩精品视频在线 | 成人免费观看视频 | 欧美在线亚洲 | 国产一区二区三区四 | 精品不卡 | 午夜午夜精品一区二区三区文 | 欧美xxxxxx视频 | 亚洲免费在线播放 | 中文字幕亚洲精品 | 蜜桃一区二区 | www.av7788.com| 久久久精品一区二区 | 精品网站www| 日产精品久久久一区二区 | 一区二区三区精品 | 亚洲小视频网站 | 在线欧美日韩 | 黄色片毛片 | 精品国产精品 | 久久精品99国产精品日本 | 亚洲国产二区 | 精品中文字幕一区二区 | 国产成人综合在线 | 日韩欧美国产精品综合嫩v 亚洲欧美日韩在线 | 日韩欧美在线观看视频 | 欧美日韩国产一区二区三区 | 国产三区四区 | 国产在线精品一区二区三区 | 欧美a v在线播放 | 高清国产一区二区三区四区五区 | 久久人人爽人人爽人人片av软件 | 日韩在线视频免费 | 久草视频在线播放 | 综合久久综合久久 | 91在线看| 91高清视频| 国产精品成人观看视频国产奇米 | 久热免费在线 | 成人小视频在线观看 | 久久国内 | 毛片网免费 | 一区二区三区国产在线 | 在线视频中文字幕 | av免费看在线 | 精品久久久精品 | 欧美日韩精品久久久 | 在线观看国产一区 | 精品国产区| 午夜视频在线观看免费视频 | 99re6在线 | 亚洲成av人片在线观看 | 亚洲视频综合 | 欧美一级做a爰片免费视频 亚洲精品一区在线观看 | 久久久久亚洲精品国产 | 国产二区免费 | 国产美女精品人人做人人爽 | 久久99国产精品免费网站 | 国产精品无码久久久久 | 三级黄视频在线观看 | 综合色婷婷一区二区亚洲欧美国产 | 青青99 | 综合视频一区二区三区 | 亚洲人人 | 干干干操操操 | 国产一区二区三区在线 | 性高湖久久久久久久久 | 久久久久亚洲精品 | 久国产| 区一区二区三在线观看 | 久久精品免费一区二区三区 | 国产一区二区三区欧美 | 亚洲欧美国产毛片在线 | 欧美成人久久 | 欧美国产精品一区 | 久久精品色欧美aⅴ一区二区 | 91在线高清观看 | 亚洲aⅴ天堂av在线电影软件 | 亚洲精品成人网 | 欧美日韩在线一区二区三区 | 日韩av一区二区三区四区 | 激情网站免费观看 | 亚洲欧美一区二区三区在线 | 国产视频一区二区在线 | 黄在线看v | 一级欧美一级日韩片 | 黄色日本视频 | 国产高清视频在线观看 | 日韩视频一区二区三区四区 | 国产一级视频免费播放 | 欧美午夜在线观看 | 色欧美片视频在线观看 | 亚洲视频欧美视频 | 亚洲一区二区 | 久久国产精品无码网站 | 国产亚洲一区二区三区在线 | 黄色片免费在线观看 | 美女毛片 | 久久99深爱久久99精品 | 国产成人精品一区二区三区视频 | 中文字幕一区在线 | 亚洲一区精品在线 | 免费在线国产 | 97av视频在线观看 | 午夜家庭影院 | 亚洲va中文字幕 | 欧美在线综合 | 国产精品福利在线观看 | 中文字幕第一页在线视频 | 亚洲伊人久久综合 | 成人精品免费视频 | 亚洲精品一二三四五区 | 国产免费av网站 | 中文在线a在线 | 一级久久久久 | 精品国产一区三区 | 亚洲经典视频在线观看 | 97伦理片 | 夜夜av| 亚洲精彩视频在线观看 | 91国内外精品自在线播放 | 久久久久久久久免费视频 | 成人在线免费观看 | 亚洲巨乳自拍在线视频 | 在线黄av| 午夜欧美 | 亚洲日韩中文字幕一区 | 国产精品一二三区 | 欧美激情免费 | www.99日本精品片com | 亚洲精品资源在线观看 | 伊人狠狠| 美日韩精品视频 | 午夜视频91 | 姐姐在线观看动漫第二集免费 | 欧美成人精品在线观看 | 国产欧美一区二区精品忘忧草 | 91精品国产一区二区三区蜜臀 | 国产电影一区二区 | 91视频.www| 国产精品毛片一区二区在线看 | 影音先锋资源av | 狠狠狠色丁香婷婷综合久久五月 | 日韩中文字幕在线播放 | 久久综合一区二区 | 亚洲一区二区在线看 | 欧美一区二区免费 | 成人性大片免费观看网站 | 亚洲 欧美 另类 综合 偷拍 | 久久久av | 国产日韩在线播放 | 久久国产视频一区二区 | 日本xxx性 | 亚洲综合视频一区 | 国产视频久久久久久久 | 日日操天天射 | 三区视频 | 欧美精品1区| 中文字幕在线三区 | 伊人免费在线观看高清版 | 亚洲第一精品在线 | 久久久久国产精品免费免费搜索 | 久久亚洲网| 老牛嫩草一区二区三区眼镜 | 午夜视频免费 | 亚洲成人精品视频 | av男人天堂网 | 免费观看一级视频 | 国产伊人久 | 日韩精品一区二区三区在线播放 | 日韩不卡中文字幕 | 日韩精品免费在线观看 | 亚洲国产精品久久久久久 | 精品在线一区 | 日干夜操 | 久久久免费 | 国产高清自拍 | 免费看国产片在线观看 | 日本精品视频网站 | 国产欧美综合一区二区三区 | 在线免费观看成年人视频 | 国产伊人久 | 美女在线一区 | 午夜精品久久久久 | 羞羞视频免费观 | 色婷网 | 色婷婷久久 | 狠狠干网站 | 国产一区二区精品在线 | 91精品国产91久久久久久不卡 | 欧美一a一片一级一片 | 99亚洲 | 欧美成年黄网站色视频 | 久草视频在线播放 | 久久久国产视频 | 亚洲综合在线一区 | 欧美一区二区三区四区视频 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 99久久久国产精品美女 | 亚洲男人天堂网 | 日韩欧美在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 久久精品久久综合 | 国产成人亚洲综合 | 99精品久久久 | 成人激情免费视频 | 人人射 | 一区二区激情 | 日韩在线视频一区 | 99国产视频 | 三级视频在线 | 精品久久久久久久久久久 | 日本在线视频一区 | 性高湖久久久久久久久aaaaa | 日韩国产一区二区 | 欧美成人第一页 | 久久亚洲综合 | 精品成人佐山爱一区二区 | 精品成人佐山爱一区二区 | 免费在线观看一级毛片 | a久久免费视频 | 婷婷av在线| 91视频精选| 亚洲欧美综合乱码精品成人网 | 久久久久无码国产精品一区 | 午夜激情免费在线观看 | 欧美午夜一区二区三区 | 色欧美日韩 | 精品国产91亚洲一区二区三区www | 欧美日韩精品久久久 | 欧美亚洲天堂 | 日韩电影免费在线观看中文字幕 | 一区二区三区四区免费观看 | 久久人人爽人人爽 | 欧洲亚洲视频 | 欧美日韩在线免费观看 | 国产精品99久久免费观看 | 国产成人精品av | 国产精品久久久久久久久久久久久久 | 91精品国产色综合久久 | 国产精品永久免费自在线观看 | 亚洲一区不卡 | 欧美激情一区二区 | 激情六月婷 | 国产欧美日韩综合精品一区二区 | 91视频网 | av免费网站在线观看 | 国产1页 | 精品久久网 | 久久国产精品首页 | 亚洲国产高清在线 | 日韩免费高清视频 | 一区二区日韩精品 | 污视频在线观看免费 | 国产精品精品 | 欧美日韩国产精品久久久久 | 亚洲成人精品久久久 | 一道本一区二区三区 | 一区二区三区自拍 | 天堂资源在线 | 91精品国产九九九久久久亚洲 | 韩日一区| 一级毛片免费观看 | 爱爱网av| 91免费视频 | 亚洲国产精品精华液com | 久久精品电影 | 国产精品国产 | 亚洲人成在线观看 | 免费大片黄在线观看 | 成人精品一区二区三区 | 激情五月婷婷综合 | 操人网站| 夜夜撸av| 天天操操| 日韩视频在线观看 | 亚洲香蕉视频 | 日韩福利在线观看 | 四虎影院最新地址 | 亚洲综合在线一区二区 | zzzwww在线观看免 | 伊人一区| 国产精品爱久久久久久久 | 国产精品原创av | 欧美综合激情 | 日日爱夜夜爽 | 国产99久久久久久免费看农村 | 黑人巨大精品欧美一区二区三区 | 久久久91精品国产一区二区三区 | 国产午夜精品一区二区三区视频 | a级毛片基地 | 亚洲国产欧美日韩 | 日韩草比 | 黄色网址大全在线观看 | 精品一区二区不卡 | 国产成人毛片 | 毛片一级 | 超碰97人人人人人蜜桃 | 国产精品久久久久久一区二区三区 | 成人久久久久久久久 | 偷拍电影一区二区三区 | 欧美在线观看免费观看视频 | 天天拍天天操 | 婷婷综合一区 | 色xx综合网 | 久久精品国产99国产精品 | 欧美色视 | 亚洲日日操 | 免费观看一级毛片 | 国产成人精品一区二区三区四区 | 亚洲综合色视频在线观看 | 久久久一区二区 | 日韩一区二区在线视频 | 国产一区二区在线免费观看 | 国产成人精品电影 | 欧美日韩不卡在线 | 天天躁日日躁狠狠躁av麻豆 | 99久久免费视频在线观看 | 亚洲成人一区二区三区 | 精品久久久久久亚洲精品 | 91精品国产福利在线观看 | 伊人网91 | 中文字幕二区 | 密室大逃脱第六季大神版在线观看 | 亚洲 欧美 激情 另类 校园 | 久久成人久久爱 | 国产剧情一区二区 | 成人三级视频 | 国产亚洲一区二区三区在线 | 涩涩导航| 国产日韩欧美一区二区 | 久久久久中文字幕 | 日b片| 欧美日韩免费看 | 国产性色 | 日韩不卡| 狠狠综合 | 91精品久久久久久久 | 波多野结衣一二三区 | 免费成人在线观看视频 | 国产精品日韩欧美一区二区三区 | 亚洲精品国品乱码久久久久 | 精品成人 | 亚洲欧洲一区二区三区 | 国产伦精品一区二区三区四区视频_ | 国产精品自产av一区二区三区 | 亚洲精品成人av | 日韩在线视频免费看 | 国产精品嫩草55av | 天堂中文在线视频 | 天天玩天天操天天射 | 色黄视频在线观看 | 国产精品一区二区三区在线看 | 成全视频免费观看在线看黑人 | 精品国产一区二区三区四 | 亚洲成人久久久 | 国产三级精品三级 | 欧美日韩在线电影 | 91在线免费视频 | 杏导航aⅴ福利网站 | 欧美日韩亚洲另类 | 一区二区在线视频 | 三级在线视频 | 91麻豆精品久久久久蜜臀 | 久久久看片 | 国产婷婷精品av在线 | 亚洲欧美v国产一区二区 | 久久久久久久久久久久久久久久久久久 | 日本免费在线视频 | 1000部羞羞视频在线看视频 | 男女视频免费在线观看 | heyzo在线观看 | 欧美午夜一区二区福利视频 | 久久1区| 黄色片网站 | 久久精品一区二区三区四区 | 欧美极品一区二区 | 91久久久久久久久久久久久久久久 | 自拍一区视频 | 欧美激情精品久久久久 | 欧美激情网 | 97久久精品午夜一区二区 | 亚洲精品久久久久久一区二区 | 国产一区二区三区在线免费 | 91精品国产综合久久久久久丝袜 | 国产91综合一区在线观看 | 一区二区三区亚洲 | 久久精品欧美 | 特大毛片| 日韩视频免费在线 | 日韩成人| 久久久免费视频播放 | 丝袜+亚洲+另类+欧美+变态 | 欧美一级做性受免费大片免费 | 亚洲精品国产二区 | 久久蜜桃视频 | 99久久久免费视频 | 国产成人精品综合 | 精品久久一二三区 | 男女网站在线观看 | 亚洲一区二区三区在线 | 韩日精品 | 日本a视频 | 男女精品视频 | 久久免费视频观看 | 黄色电影天堂 | 一级a性色生活片毛片 | 国产精品免费观看 | 免费久久久 | 九九r热| 免费一区二区三区 | 成人av高清在线观看 | 欧美激情一区二区三区蜜桃视频 | 欧美精品被 | 午夜视频在线免费观看 | 亚洲精品国产综合区久久久久久久 | 久久久精品一区二区三区 | 久久久www成人免费无遮挡大片 | 美女精品视频在线 | 一级在线观看 | 人人艹人人爽 | 国产拍揄自揄精品视频麻豆 | 一区二区三区av | 中文字幕一区二区三区精彩视频 | 中文字幕在线视频免费观看 | 日韩欧美一区二区三区免费观看 | 亚洲综合欧美日韩 | 国产精品久久久久久久久 | 91精品国产综合久久婷婷香蕉 | 亚洲精品一区二三区 | 在线观看毛片网站 | 一区二区三区国产好 | 日韩一区免费在线观看 | 在线中文字幕观看 | 男人超碰| 欧美日韩一区二区三区在线观看 | 国产视频黄在线观看 | 日韩欧美在线免费观看 | 欧美国产日韩一区 | 亚洲一区在线视频 | 国产美女高潮一区二区三区 | 国产成人精品亚洲日本在线观看 | 成年人综合网 | 久久久久国产一区二区三区 | 精品久久一区二区 | 色偷偷888欧美精品久久久 | 国产精品高潮呻吟久久av野狼 | 国产一区二区三区在线 | 日韩成人一区二区 | 亚洲一在线 | 狠狠做深爱婷婷综合一区 | 欧美亚洲视频在线观看 | 国产亚洲精品久久久久久青梅 | 久在线观看 | 动漫羞免费网站中文字幕 | 久久久精品一区二区 | 亚洲精品免费在线观看 | 一区二区三区无码高清视频 | japan23xxxxhd乱| 日本在线观看一区二区 | 欧美精品入口蜜桃 | 韩国av一区二区 | 福利视频网址导航 | 91精品国产高清久久久久久久久 | 日韩欧美一区二区三区免费观看 | 国产亚洲精品精品国产亚洲综合 | 国产精品欧美一区二区三区 | 亚洲高清精品视频 | 精品日韩一区 | 国产不卡在线 | 久久久久无码国产精品一区 | 日韩中文字幕免费在线播放 | 成人免费一区二区三区视频网站 | 狠狠ri| 国产女人爽到高潮免费视频 | 久久精品中文字幕一区 | 日韩国产在线播放 | www日韩| 拍拍无遮挡人做人爱视频免费观看 | 久久com| 亚洲精品一区二区网址 | 精品久 | 亚洲视频一区在线播放 | 精品欧美一区二区三区 | 欲色av| 婷婷桃色网 | 中文字幕在线观看第一页 | 国产精品99久久 | 日韩一二三区视频 | 成人在线播放 | 天天曰天天干 | 久久综合中文字幕 | 热久久这里只有精品 | 久久线视频 | 2012中文版免费观看 | 99这里只有精品视频 | 亚洲成人在线观看视频 | 亚洲欧美精品久久 | 黄版视频在线观看 | 久草新免费 | 国产视频久久精品 | 久久精品国产亚洲 | 欧美视频二区 | www操com| 国产综合精品一区二区三区 | 欧美精品成人一区二区三区四区 | 国产农村妇女精品 | 日本在线观看 | 龙珠z普通话国语版在线观看 | 久久久成人精品 | 欧美爱爱视频 | 在线观看日韩 | 中文字幕视频在线 | 精品av| 久久久国产精品 | 亚洲夜幕久久日韩精品一区 | 在线成人av | h视频在线观看免费 | 国产精品欧美一区二区三区 | 先锋资源久久 | 亚洲色图在线播放 | 奇米成人 | 91在线资源 | 久久成人免费视频 | 国产激情 | 国产成人亚洲综合 | 日夜夜精品视频 | 色视频网站在线观看 | 国产第一区二区三区 | 成人福利av | 国产成人精品一区二区三区网站观看 | 中文字幕婷婷 | 久久久人成影片一区二区三区 | 久久成人综合 | 亚洲精品电影在线观看 | 欧美99热 | 亚洲视频一区二区三区四区 | 欧美一级视频在线观看 | 国产精品久久久久久久粉嫩 | 日韩一区在线视频 | 国产日韩一区二区 | 亚洲成人一区二区三区 | 亚洲不卡 | 国产精品免费一区二区 | 久久午夜电影 | 欧美一级精品片在线看 | 日韩欧美在线观看视频网站 | 女人爽到高潮aaaa电影 | 小草av | 欧美日韩国产不卡 | 一区自拍 | 男女深夜网站 | 日韩欧美在线视频 | 国产精品久久久久久久久久久新郎 | 成人精品在线 | 日韩一级大片 | 久久精品成人 | 精品日韩欧美一区二区三区在线播放 | 一区二区三区免费网站 | 啪啪网免费| www.久久精品 | 欧美一级毛片免费看 | 黄色小视频在线观看 | www久久久久 | 小泽玛丽娅| av一区二区三区四区 | 久久com | 久久精品免费 | 亚洲综合视频 | 九色在线播放 | 男女18免费网站视频 | 在线观看中文字幕 | 日韩专区一区二区三区 |