国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

SpringBoot 集成 Shiro 極簡教程(實戰(zhàn)版)

共 28873字,需瀏覽 58分鐘

 ·

2021-04-23 15:37

來源:juejin.cn/post/6844903887871148039

1. 前言

Apache Shiro是一個功能強大且易于使用的Java安全框架,提供了認證,授權,加密,和會話管理。

Shiro有三大核心組件:

  • Subject: 即當前用戶,在權限管理的應用程序里往往需要知道誰能夠操作什么,誰擁有操作該程序的權利,shiro中則需要通過Subject來提供基礎的當前用戶信息,Subject 不僅僅代表某個用戶,與當前應用交互的任何東西都是Subject,如網(wǎng)絡爬蟲等。所有的Subject都要綁定到SecurityManager上,與Subject的交互實際上是被轉(zhuǎn)換為與SecurityManager的交互。
  • SecurityManager: 即所有Subject的管理者,這是Shiro框架的核心組件,可以把他看做是一個Shiro框架的全局管理組件,用于調(diào)度各種Shiro框架的服務。作用類似于SpringMVC中的DispatcherServlet,用于攔截所有請求并進行處理。
  • Realm: Realm是用戶的信息認證器和用戶的權限人證器,我們需要自己來實現(xiàn)Realm來自定義的管理我們自己系統(tǒng)內(nèi)部的權限規(guī)則。SecurityManager要驗證用戶,需要從Realm中獲取用戶??梢园裄ealm看做是數(shù)據(jù)源。

2. 數(shù)據(jù)庫設計

2.1 User(用戶)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20NOT NULL AUTO_INCREMENT,
  `password` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `username` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `account` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`USING BTREE
ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1'root''超級用戶''root');
INSERT INTO `user` VALUES (2'user''普通用戶''user');
INSERT INTO `user` VALUES (3'vip''VIP用戶''vip');

SET FOREIGN_KEY_CHECKS = 1;

2.2 Role(角色)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role`  (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `role` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `desc` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`USING BTREE
ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1'admin''超級管理員');
INSERT INTO `role` VALUES (2'user''普通用戶');
INSERT INTO `role` VALUES (3'vip_user''VIP用戶');

SET FOREIGN_KEY_CHECKS = 1;

2.3 Permission(權限)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for permission
-- ----------------------------
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission`  (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `permission` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '權限名稱',
  `desc` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '權限描述',
  PRIMARY KEY (`id`USING BTREE
ENGINE = MyISAM AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of permission
-- ----------------------------
INSERT INTO `permission` VALUES (1'add''增加');
INSERT INTO `permission` VALUES (2'update''更新');
INSERT INTO `permission` VALUES (3'select''查看');
INSERT INTO `permission` VALUES (4'delete''刪除');

SET FOREIGN_KEY_CHECKS = 1;

2.4 User_Role(用戶-角色)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role`  (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `user_id` int(11NULL DEFAULT NULL,
  `role_id` int(11NULL DEFAULT NULL,
  PRIMARY KEY (`id`USING BTREE
ENGINE = MyISAM AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed;

-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (111);
INSERT INTO `user_role` VALUES (222);
INSERT INTO `user_role` VALUES (333);

SET FOREIGN_KEY_CHECKS = 1;

2.5 Role_Permission(角色-權限)

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for role_permission
-- ----------------------------
DROP TABLE IF EXISTS `role_permission`;
CREATE TABLE `role_permission`  (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `role_id` int(11NULL DEFAULT NULL,
  `permission_id` int(255NULL DEFAULT NULL,
  PRIMARY KEY (`id`USING BTREE
ENGINE = MyISAM AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed;

-- ----------------------------
-- Records of role_permission
-- ----------------------------
INSERT INTO `role_permission` VALUES (111);
INSERT INTO `role_permission` VALUES (212);
INSERT INTO `role_permission` VALUES (313);
INSERT INTO `role_permission` VALUES (414);
INSERT INTO `role_permission` VALUES (523);
INSERT INTO `role_permission` VALUES (633);
INSERT INTO `role_permission` VALUES (732);
INSERT INTO `role_permission` VALUES (821);

SET FOREIGN_KEY_CHECKS = 1;

3. 項目結(jié)構(gòu)

4. 前期準備

4.1 導入Pom

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

<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
</dependency>

<dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.4.0</version>
</dependency>

4.2 application.yml

server:
  port: 8903
spring:
  application:
    name: lab-user
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/laboratory?charset=utf8
    username: root
    password: root
mybatis:
  type-aliases-package: cn.ntshare.laboratory.entity
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true

4.3 實體類

4.3.1 User.java

@Data
@ToString
public class User implements Serializable {

    private static final long serialVersionUID = -6056125703075132981L;

    private Integer id;

    private String account;

    private String password;

    private String username;
}

4.3.2 Role.java

@Data
@ToString
public class Role implements Serializable {

    private static final long serialVersionUID = -1767327914553823741L;

    private Integer id;

    private String role;

    private String desc;
}

4.4 Dao層

4.4.1 PermissionMapper.java

@Mapper
@Repository
public interface PermissionMapper {

    List<String> findByRoleId(@Param("roleIds") List<Integer> roleIds);
}

4.4.2 PermissionMapper.xml

<mapper namespace="cn.ntshare.laboratory.dao.PermissionMapper">
    <sql id="base_column_list">
        id, permission, desc
    </sql>

    <select id="findByRoleId" parameterType="List" resultType="String">
        select permission
        from permission, role_permission rp
        where rp.permission_id = permission.id and rp.role_id in
        <foreach collection="roleIds" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </select>
</mapper>

4.4.3 RoleMapper.java

@Mapper
@Repository
public interface RoleMapper {

    List<Role> findRoleByUserId(@Param("userId") Integer userId);
}

4.4.4 RoleMapper.xml

<mapper namespace="cn.ntshare.laboratory.dao.RoleMapper">
    <sql id="base_column_list">
        id, user_id, role_id
    </sql>

    <select id="findRoleByUserId" parameterType="Integer" resultType="Role">
        select role.id, role
        from role, user, user_role ur
        where role.id = ur.role_id and ur.user_id = user.id and user.id = #{userId}
    </select>
</mapper>

4.4.5 UserMapper.java

@Mapper
@Repository
public interface UserMapper {
    User findByAccount(@Param("account") String account);
}

4.4.6 UserMapper.xml

<mapper namespace="cn.ntshare.laboratory.dao.UserMapper">

    <sql id="base_column_list">
        id, account, password, username
    </sql>

    <select id="findByAccount" parameterType="Map" resultType="User">
        select
        <include refid="base_column_list"/>
        from user
        where account = #{account}
    </select>
</mapper>

4.5 Service層

4.5.1 PermissionServiceImpl.java

@Service
public class PermissionServiceImpl implements PermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    @Override
    public List<String> findByRoleId(List<Integer> roleIds) {
        return permissionMapper.findByRoleId(roleIds);
    }
}

4.5.2 RoleServiceImpl.java

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Override
    public List<Role> findRoleByUserId(Integer id) {
        return roleMapper.findRoleByUserId(id);
    }
}

4.5.3 UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User findByAccount(String account) {
        return userMapper.findByAccount(account);
    }
}

4.6. 系統(tǒng)返回狀態(tài)枚舉與包裝函數(shù)

4.6.1 ServerResponseEnum.java

@AllArgsConstructor
@Getter
public enum ServerResponseEnum {
    SUCCESS(0"成功"),
    ERROR(10"失敗"),

    ACCOUNT_NOT_EXIST(11"賬號不存在"),
    DUPLICATE_ACCOUNT(12"賬號重復"),
    ACCOUNT_IS_DISABLED(13"賬號被禁用"),
    INCORRECT_CREDENTIALS(14"賬號或密碼錯誤"),
    NOT_LOGIN_IN(15"賬號未登錄"),
    UNAUTHORIZED(16"沒有權限")
    ;
    Integer code;
    String message;
}

4.6.2 ServerResponseVO.java

@Getter
@Setter
@NoArgsConstructor
public class ServerResponseVO<Timplements Serializable {
    private static final long serialVersionUID = -1005863670741860901L;
    // 響應碼
    private Integer code;

    // 描述信息
    private String message;

    // 響應內(nèi)容
    private T data;

    private ServerResponseVO(ServerResponseEnum responseCode) {
        this.code = responseCode.getCode();
        this.message = responseCode.getMessage();
    }

    private ServerResponseVO(ServerResponseEnum responseCode, T data) {
        this.code = responseCode.getCode();
        this.message = responseCode.getMessage();
        this.data = data;
    }

    private ServerResponseVO(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 返回成功信息
     * @param data      信息內(nèi)容
     * @param <T>
     * @return
     */

    public static<T> ServerResponseVO success(T data) {
        return new ServerResponseVO<>(ServerResponseEnum.SUCCESS, data);
    }

    /**
     * 返回成功信息
     * @return
     */

    public static ServerResponseVO success() {
        return new ServerResponseVO(ServerResponseEnum.SUCCESS);
    }

    /**
     * 返回錯誤信息
     * @param responseCode      響應碼
     * @return
     */

    public static ServerResponseVO error(ServerResponseEnum responseCode) {
        return new ServerResponseVO(responseCode);
    }
}

4.7 統(tǒng)一異常處理

當用戶身份認證失敗時,會拋出UnauthorizedException,我們可以通過統(tǒng)一異常處理來處理該異常

@RestControllerAdvice
public class UserExceptionHandler {

    @ExceptionHandler(UnauthorizedException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    public ServerResponseVO UnAuthorizedExceptionHandler(UnauthorizedException e
{
        return ServerResponseVO.error(ServerResponseEnum.UNAUTHORIZED);
    }
}

5. 集成Shiro

5.1 UserRealm.java

/**
 * 負責認證用戶身份和對用戶進行授權
 */

public class UserRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    // 用戶授權
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        User user = (User) principalCollection.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        List<Role> roleList = roleService.findRoleByUserId(user.getId());
        Set<String> roleSet = new HashSet<>();
        List<Integer> roleIds = new ArrayList<>();
        for (Role role : roleList) {
            roleSet.add(role.getRole());
            roleIds.add(role.getId());
        }
        // 放入角色信息
        authorizationInfo.setRoles(roleSet);
        // 放入權限信息
        List<String> permissionList = permissionService.findByRoleId(roleIds);
        authorizationInfo.setStringPermissions(new HashSet<>(permissionList));

        return authorizationInfo;
    }

    // 用戶認證
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authToken;
        User user = userService.findByAccount(token.getUsername());
        if (user == null) {
            return null;
        }
        return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
    }
}

5.2 ShiroConfig.java

@Configuration
public class ShiroConfig {

    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }

    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm());
        return securityManager;
    }

    /**
     * 路徑過濾規(guī)則
     * @return
     */

    @Bean
    public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setSuccessUrl("/");
        Map<String, String> map = new LinkedHashMap<>();
        // 有先后順序
        map.put("/login""anon");      // 允許匿名訪問
        map.put("/**""authc");        // 進行身份認證后才能訪問
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
        return shiroFilterFactoryBean;
    }

    /**
     * 開啟Shiro注解模式,可以在Controller中的方法上添加注解
     * @param securityManager
     * @return
     */

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(@Qualifier("securityManager") DefaultSecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }

5.3 LoginController.java

@RestController
@RequestMapping("")
public class LoginController {

    @PostMapping("/login")
    public ServerResponseVO login(@RequestParam(value = "account") String account,
                                  @RequestParam(value = "password") String password) 
{
        Subject userSubject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(account, password);
        try {
            // 登錄驗證
            userSubject.login(token);
            return ServerResponseVO.success();
        } catch (UnknownAccountException e) {
            return ServerResponseVO.error(ServerResponseEnum.ACCOUNT_NOT_EXIST);
        } catch (DisabledAccountException e) {
            return ServerResponseVO.error(ServerResponseEnum.ACCOUNT_IS_DISABLED);
        } catch (IncorrectCredentialsException e) {
            return ServerResponseVO.error(ServerResponseEnum.INCORRECT_CREDENTIALS);
        } catch (Throwable e) {
            e.printStackTrace();
            return ServerResponseVO.error(ServerResponseEnum.ERROR);
        }
    }

    @GetMapping("/login")
    public ServerResponseVO login() {
        return ServerResponseVO.error(ServerResponseEnum.NOT_LOGIN_IN);
    }

    @GetMapping("/auth")
    public String auth() {
        return "已成功登錄";
    }

    @GetMapping("/role")
    @RequiresRoles("vip")
    public String role() {
        return "測試Vip角色";
    }

    @GetMapping("/permission")
    @RequiresPermissions(value = {"add""update"}, logical = Logical.AND)
    public String permission() {
        return "測試Add和Update權限";
    }
}

6. 測試

6.1 用root用戶登錄

6.1.1 登錄

6.1.2 驗證是否登錄

6.1.3 測試角色權限

6.1.4 測試用戶操作權限

6.2 user用戶和vip用戶測試略

7. 總結(jié)

本文演示了SpringBoot極簡集成Shiro框架,實現(xiàn)了基礎的身份認證和授權功能,如有不足,請多指教。

后續(xù)可擴展的功能點有:

  • 集成Redis實現(xiàn)Shiro的分布式會話
  • 集成JWT實現(xiàn)單點登錄功能

1. 以為精通Java 線程池,看到這些誤區(qū),還是年輕了...

2. Spring Boot 集成 WebSocket,輕松實現(xiàn)信息推送!

3. try-catch-finally 和 return 是怎么執(zhí)行的?

4. 在 SpringBoot 項目中,Spring Security 和 Shiro 該如何選擇?

最近面試BAT,整理一份面試資料Java面試BATJ通關手冊,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

獲取方式:點“在看”,關注公眾號并回復 Java 領取,更多內(nèi)容陸續(xù)奉上。

文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。

謝謝支持喲 (*^__^*)

瀏覽 30
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 97人妻人人澡人| 亚洲免费精品视频| 国产免费麻豆| 久久精品99久久久久久| 婷婷国产综合| 亚洲精品黄色电影| 国产伦精品一区二区三区色大师 | 婷婷精品秘进入| 日韩欧美不卡色不卡| 婷婷五月花| 大鸡巴视频在线观看| 五月天婷婷色色| 欧美激情四射| 黄色三级片视频| 黄色av免费看| 98在线++传媒麻豆的视频| 婷婷色导航| 亚洲九九九九| 一本一道无码免费看视频| 日本中文字幕免费| 九一av| 翔田千里无码免费播放| 国产一区视频18| 日本四级片| 99热最新| 亚洲天堂久久| 天天撸天天操| 熟女视频网站| 人妻熟妇乱子伦精品无码专区毛片| 麻豆成人精品国产免费| 波多野结衣在线观看一区二区| 国产伦精品一区二区三区妓女下载 | 亚洲AV无码精品成人| 仓井空一区二区| 91视频网站免费| 91啦丨熟女露脸| 天堂av中文字幕| av三级片在线播放| 三级AV在线免费观看| 黄色在线网站| 欧美一区二区三区四区视频| 久在线| av自拍| 男女啪啪| 亚洲国产精品成人久久蜜臀| 在线观看日韩AV| 江苏妇搡BBB搡BBBB| 特黄AAAAAAAAA真人毛片| 国产精品毛片一区二区在线看| 国产欧美另类| 91国在线视频| 亚州在线播放| 特级西西444www高清大胆免费看 | 最新一区二区| 少妇无码视频| 婷婷国产亚洲精品网站| 99啪啪| 91精品视频在线播放| 国产九色| 亚洲日韩影院| 欧美日韩无码| 色性网| www.蜜桃视频| 影音先锋国产资源| 日逼综合| 国产精品96久久久| 亚洲,制服,综合,中文| 狠狠视频| 制服丝袜强奸乱伦| 内射无码专区久久亚洲| 97人妻一区二区三区| 国产精品无码成人AV在线播放 | 国产免费AV在线观看| 成人黃色A片免费看| 国产精品伦子伦免费视频| 欧美日韩一区二区三区四区五区六区| 亚洲素人无码| 乱伦乱伦乱伦中文字幕| 免费视频一二区| 91精彩视频| 精品乱子伦一区二区在线播放| 色五月婷婷五月天激情| 中文字幕AV免费观看| 男女91| 一区二区三区麻豆| 久草视频资源| 99精品亚洲| 中文字幕乱在线| a片免费网址| 内射视频网| 久久免费视频3| aV一区二区三区| 东京热第一页| 国产八区| 自拍视频国产| 国产午夜视频在线| 国产无遮挡又黄又爽| 北条麻妃无码一区二区| 口爆吞精在线| av资源在线播放| 无码AV一区二区| 亚洲香蕉在线| www.麻豆网91成人久久久| 国产熟妇| 青青草原av| 玩弄大乳乳妾高潮乳喷视频| 精品中文字幕在线播放| 美日韩A片| 亚洲无码手机在线| 日韩美女性爱| 日韩性爱在线视频| 九一国产在线| 久草免费在线观看视频| 99精品色| 1024国产| 亚洲成人av在线观看| 国产特级毛片| 操逼操逼操逼| 国产精品电影大全| 色色色色色欧美网| 日色色色| 大香蕉尹人在线视频| 亚欧黄色| 秋霞福利影院| 人人澡超碰碰| 日韩免费看| 99热黄| 免费草逼视频| 99欧美| 木下凛凛子AV888AV在线观看 | 麻豆精品在线播放| 霸道总裁雷总各种姿势白浆爱情岛论坛| 午夜福利老司机| 久久久久999| 中文字幕日本无码| 国产不卡视频| 亚洲福利视频网| 99自拍视频| 日韩操逼片| 日本人妻中出| 无码做爰欢H肉动漫网站在线看| 在线日韩国产| 蜜桃av无码一区三区| 成人丁香| 成人看片黄a免费看视频| 国产一区二区三区免费播放| 影音先锋亚洲无码| 色就是色欧美成人网| 日韩一级性爱| 99热99re6国产线播放| 色哟哟一中文字慕| 青娱乐在线视频精品| 亚洲一区在线免费观看| 男人的天堂2019| 久久免费精品| 国产一级操逼| 日日夜夜天天综合| 麻豆精品国产传媒| 日本欧美一级| 欧美色色色色色色| 天天操综合网| 好吊视频一区二区三区红桃视频you | 92自拍视频| 久久久久亚洲AV无码网影音先锋| 88AV在线视频| 日韩无码人妻一区二区| 日韩在线毛片| 日本高清色清di免费观看| 水蜜桃视频网站在线观看| 久草五月| 国产精品无码在线播放| 久草网在线| 午夜无码福利| 少妇高潮视频| 中文字幕成人av| 日韩無码专区| 麻豆一区二区三区四区| 国产精品午夜福利| 国产综合久久久777777| 久久911| 成人免费AV| AV青青草| 青青草激情视频| 免费A级毛片| 91av电影网| av一卡二卡| 2021国产视频| 国产成人精品一区二区三区| 中文字幕在线观看第一页| 免费无码国产在线观看快色| 国产口爆| 五月天视频网| 影音先锋成人在线资源| 免费一级a| 91乱子伦国产乱子伦| 翔田千里被躁120分钟| 午夜视频18| 尿在小sao货里面好不好| 福利视频二区| 日韩一区二区三区四区| 成人色色视频| 综合色在线| 天堂在线www| 成人精品在线视频| 国外亚洲成AV人片在线观看| 国产主播专区| 午夜福利aaa| 蜜桃视频无码| 中文字幕码精品视频网站| 骚逼自拍| 在线内射视频| 国产精品一区二区视频| 一本视频| 黄色视频日本免费| 国产精品无码7777777| 少妇大战黑人46厘米| 精品孕妇一级A片免费看| 国产精品理论片| 亚洲精品久久久蜜桃| 欧美成人久久| 女公务员人妻呻吟求饶| 色婷婷18正码国产| 国产亚洲Av| 国产操逼片| 黄色网址在线观看视频| 中文字幕黄色片| 国产Av一区二区三区| 92午夜福利天堂视频2019| 91亚洲日韩| 国产日韩一区二区| 激情视频网站| 亚洲视频在线观看播放| 色视频在线播放| 欧美性爱免费网站| 久久久XXX| 中文无码高清视频| 久久99嫩草熟妇人妻蜜臀| 伊人毛片| 一级片国产| 黑人巨粗进入疼哭A片| 中文视频在线观看| 欧美日韩国产a| 91成人久久| 国产成人AV在线播放| 日日射人妻| 久久av影院| 熟妇人妻丰满久久久久久久无码| 91视频观看| 99视频自拍| 欧美色插| 东京热一区二区| 蜜臀av一区| 亚洲视频在线免费看| 成人在线一区二区| 国产一毛a一毛a在线观看| 日本狠狠干| 成人免费无码婬片在线观看免费| 最新国产毛片| 综合操逼网| 麻豆av无码| 一级a片在线| 迷情校园综合| 毛片久久| 欧美A片在线免费观看| 黄色视频毛片| 强伦轩农村人妻| 人人肏人人射| JlZZJLZZ亚洲美女18| 97超碰免费| 久久免费9| 国产乱伦对白| 亚洲三级在线观看| ThePorn精品无码| 神马午夜精品| 一级国产黄色视频| chinese搡老熟老妇人| 成人精品影视| 91精品国产乱码| 日韩精品免费无码视频| 一区二区不卡视频| 精品无人区无码乱码毛片国产| 欧美一区二区三区成人片下载| 91成人做爰A片| 人妻18无码人伦一区二区三区精品| 少妇超碰| 日韩无码人妻一区二区三区| 蜜臀久久99精品久久久久久婷婷| 西西特级无码444www| 噜噜噜噜射| 天天操电影| 国产精品123区| 操逼免费视频网站| 小视频+福利| 久草视频在线免费| 欧美浮力影院| 在线免费看黄色| 午夜精品久久久久久久91蜜桃 | 懂色AV| 欧美h在线观看| 高清无码免费观看| 亚洲无码成人AV| 久久五月丁香| 午夜亚洲国产一区视频网站| 99国产在线观看免费视频| 国产高清精品软件丝瓜软件| 黑人精品XXX一区一二区| 中文无码电影| 国产精品久久久久久久久A| 国产骚女| 91精品国产综合久久久久久| 日韩AV大片| 777久久久| 亚洲无码高清电影| 97人妻在线视频| 日韩操大屌| 亚洲黄色视频网站在线观看| 亚洲vs无码秘蜜桃少妇小说| 一区二区在线免费观看| 激情91| 亚洲AV女人18毛片水真多| 国产精品黄色电影| 欧美性爱在线网站| 中文字幕在线观看网址最新地址 | 国内自拍视频网站| 天天操中文字幕| 天天日天天日天天操| 一本道高清| 特级西西444www高清大胆免费看| Av一区二区三区| 久草A片| 日韩AV小电影| 亚洲天堂一级片| 亚洲第九页| 少妇在线观看| 中文字幕免费AV| 青青草视频在线观看| 亚洲福利免费观看| 操逼大全| 高清无码视频免费| 欧美一级操逼| 国产xxxx视频| 欧美级毛片一进一出| 在线国产激情视频| 亚洲v视频| 少妇的屄| 亚洲乱淫| 国产成人一区二区无码| 成人在线一区二区| 欧美偷拍一区| 久久黄色视频网站| av牛牛| 国产精品揄拍一区二区| 大香蕉98| 日韩AV在线免费观看| 3D动漫精品一区二区在线播放免费| 青草福利| 男人天堂免费视频| 国产一级一片免费播放放a| 天堂网在线播放| 99热这里有精品| 成人激情免费视频| 欧洲尤物不卡播放六区| 精品99999| 三级一区二区| 无码人妻精品一区二区三区蜜桃91| 午夜亚洲福利视频| 一区二区三区视频在线| 欧美日韩一级在线观看| 翔田AV无码秘三区| 精品网站| 国产91白丝在一线播放| 精品免费一区二区三区四区| 日韩无码中文字幕| 丁香六月婷婷综合激情欧美| 大香蕉啪啪| 日本aa视频| 天堂精品在线| 国产av毛片| 日本中文字幕乱伦| 日韩精品电影| 亚洲国产成人视频| 日韩高清AV| 亚洲精品国产成人AV在线| 搡BBBB推BBBB推BBBB| 欧美成人性爱图片| 婷婷色情网| 精品在线一区| 操逼视频91| 无码免费高清| 亚洲无码激情视频| AV在线不卡中文| 国产伊人在线| 亚洲影院第一页在线观看| 一级黄色a片| 午夜精品久久久久久久91蜜桃 | 爱爱电影无码| 成人无码区免费AV片| 加勒比无码视频| 亚洲高清在线观看| 亚州高清无码视频| 亚洲欧洲免费看| 九九热免费视频| 国产无码电影在线观看| 国产无码高清| 中文字幕丰满熟妇人妻| 亚洲日韩国产AV| 精品av| 亚洲日韩字幕| 亚洲香蕉视频| 东方a在线| 中文字幕H| 青青草免费公开视频| 国产嘿嘿| 天天操免费| 18av在线观看| 激情五月天激情网| 日韩三级毛片| 中文区中文字幕免费看| 成人国产精品秘欧美高清| 亚洲AV无码成人精品区欧洲| 国产精品同| 牛牛AV| 在线视频日本| 国产主播一区二区| 亚洲中文无码在线| 精品无码一区二区三区免费| 在线观看黄片网站| 国产毛片在线看| 操B视频免费看| 亚洲无码高清在线观看视频| 亚洲无码成人在线| 俺也要操| 38D蜜桃臀| 丰满人妻一区二区三区精品高| 操逼首页123| 国产九色91回来了| 超碰人人在线观看| 91ThePorn国产| 日日干日日操| 国产亚洲欧美精品综合在线| 人人操天天干| 日本免费爱爱视频| 日韩成人性爱| 1024大香蕉| 91在线精品秘一区二区黄瓜| 黄色无码电影| 国产永久在线| 三级久久| 奇米91| 国产激情无码免费| 欧美成人视频。| 欧美一级网| a片在线观看视频| 欧美一区二区丁香五月天激情 | www.色日本| 色色加勒比综合| 色欲av伊人久久大香线蕉影院 | 精品无套| 成人无码动漫A片| 69视频在线播放| 色五月婷婷丁香五月| www.狠狠撸| 国产aa片| 熟女人妻人妻の视频| 手机AV在线| 亚洲中文婷婷| 视频一区二| 国精久久久久| 一级理论片| 黄色一级片免费观看| 91久久精品国产91久久公交车 | 俺来也AV| 一本色道久久综合无码| a日韩| 伊人大香蕉视频| 色色影院| 一级黄色免费片| 蜜桃av久久久亚洲精品| 免费观看无码视频| 欧美一区二区三区成人片下载| 99热激情在线| 久久伊人春色| 外国一级片| 一本到无码| aV一区二区三区| 一级做a爰片毛片A片| 日韩人妻精品无码制服| 精品一区电影| 国产主播一区二区| 2019中文字幕在线免费观看| 欧美猛交| 亚洲成人免费观看| 欧美老妇另类BBwBBw| 老妇性BBWBBWBBWBBW| 污污污www精品国产网站| 91三级电影| 97免费视频在线观看| 中文字幕乱码免费综合久久| 成人AV毛片| 久久99精品久久久久久水蜜桃 | 东京热小视频| 东京热一区二区三区四区| 香蕉国产在线视频| AV资源在线| 日韩成人精品视频| 日韩爆乳一区二区三区| 久久久视频6r| 色欲影视插综合一区二区三区| 日韩免费网站| 91无码人妻一区二区| 中文字幕国产在线观看| 无码不卡视频在线| 精品视频在线播放| 91人人妻人人澡人人爽| 色乱视频| 国产系列精品AV| 11孩岁女精品A片BBB| 青草久久久| 呦小BBBB小小BBBB| 一级黄色视频免费观看| 青青日逼| 91在线无码精品国产三年| 安徽妇女BBBWBBBwm| 欧美成人精品在线| 久久精品波多野结衣| 一区二区三区四区日韩| 三级无码| 成人做爰黄A片免费看陈冠 | 超碰乱伦| 久草视频观看| 日韩高清无码片| 无码国产+白浆| 日韩高清无码成人| 亚洲无码天堂| 亚洲高清无码专区| 国产日韩欧美在线播放| 日韩免费不卡| 久一在线| 热无码av| 91视频在线看| 国产免费操逼视频| 久久久久久性爱| 蜜桃传媒视频| 欧美AAAAAAAAAA特级| 先锋影音男人| 亚洲在线观看| 国产三级片网址| 7777影视电视剧在线观看官网 | 日韩乱码| 天堂素人约啪| 亚洲天堂免费视频| 91av免费观看| 男女日逼网站| 亚洲AV秘成人久久无码海归| 996热re视频精品视频| 人人操人人超碰| 国产又爽又黄免费视频免费观看 | 久久久一级| 一级操逼黄色视频| 一级成人片| 丰满少妇在线观看网站| 久操视频网站| 3d动漫精品一区二区三区在线观看| 国产AV黄| 懂色一区二区二区在线播放视频| 午夜性爽视频男人的天堂| 免费观看无码视频| 国产一区二区三区免费播放| 国产91精品在线观看| 91超碰大香蕉| 成人色色| 色操逼网| 欧美操逼大全| 精品人妻中文字幕视频| 日本精品视频| 69成人网| 操屄视频在线观看| 国产一a毛一a毛A免费| 日韩一级片在线播放| 亚洲无码AV在线观看| 亚洲高清无码视频在线播放| 欧美日韩综合| 天天亚洲| 天堂素人| 无码高清在线观看| 日韩免费av| 四川少扫搡BBw搡BBBB| 毛片毛片毛片毛片毛片毛片| wwwa片| 五月婷婷色播| 国产一级AV免费观看| 996热re视频精品视频| 天天插综合| 欧美操B在线| Al激情欧美| 国产一级视频| 欧美视频一区二区| 少妇特黄A一区二区三区| 99爱在线观看| 18禁网站禁片免费观看| 亚洲无码一二区| 尤物精品在线| 天干天干天夜夜| 欧美性猛交ⅩXXX乱大交| 蜜桃无码在线| 中文字幕亚洲中文字幕| 中文字幕日韩无码片| 欧美成人A级片| gogogo高清在线观看免费直播中国 | 97成人人妻一区二区三区| 天天拍天天操| 亚洲区成人777777精品| 18禁av在线| 理论片无码| 俺也来www俺也色com| 黄av在线| 动漫无码视频| 日韩av无码电影| 无码观看视频| 日韩精品人妻| 蜜桃传媒在线| 人人爱人人操人人爽| 国产精品毛片一区视频播| 俺来也俺去也www色| 99青草在线视频| 亚洲高清无码视频| 99视频精品| 久久99精品国产| 国产激情AV| 91青青| 91麻豆精品国产91久久久熟女 | 高清无码视频在线免费观看| 久久艹视频| 91精品国产偷窥一区二区| 日老女人的逼| 国产又爽又黄免费网站在线看| 一道本高清无码视频| 久久精品99久久久久久| 哪里能看毛片| 超碰97在线免费观看| 国产成人精品久久久| 日韩欧美第一页| 亲子伦视频一区二区三区| 免费视频久久| 人人操人人摸人人看| 日韩AV无码一区二区三区| 亚洲日韩视频在线播放| 操操AV| 俺去俺来WWW色官方| 欧美在线大香蕉| 最新国产精品| 久久男人| 强伦轩人妻一区二区三区四区| 亚洲成色A片77777在线小说| 欧美色插| 三级片日韩| 无码看片| 九色PORNY蝌蚪视频| 免费做爱网站| 农村少妇久久久久久久| 67194熟女| 亚洲一区二区三| 日韩欧美中文在线| 不卡视频在线| 西西888WWW大胆无码| www操逼| 国产无遮挡又黄又爽又色学生软件 | 亚洲女人在线| 日韩黄片免费看| A片视频免费| 免费无码一区| 操久久久| 九九精品热| 久久婷婷秘精品日产538| 国产成人一区二区| 日本在线播放| 2015中文字幕黄色视频| 中文字幕淫乱视频欧美| 农村一级婬片A片| 少妇搡BBBB搡BBB搡毛片| 夜夜撸天天日| 91精品国产91久久久久久吃药| 精品视频免费在线| 国内视频一区| 伊人综合影院| 欧美黄色三级视频| 美女黄色网| 精品免费国产一区二区三区四区| 亚洲精品成人在线| 欧美强开小嫩苞| 免费无码国产在线观看| 亚洲无码视频免费观看| 天天干天天日天天操| 免费一级片视频| 黄色毛片av| 日韩A级视频| 日本一区中文字幕| 国产免费性爱| 亚洲国产成人在线视频| 草草视频在线观看| 国产麻豆精品成人毛片| 中文字幕在线日亚洲9| 激情五月丁香五月| 亚洲色五月| 一区二区高清无码| 日韩人妻无码一区二区三区中文 | 人妻av无码| 超碰操| 99福利视频| 大鸡巴视频在线观看| 日韩一二三| 国产精品一二三| 美女黄色视频永费在线观看网站| 亚洲免费在线看| 午夜激情操一操| 人人澡人人摸| 久久九九热| 天堂中文资源库| 欧美一级aa| 嫩草亚洲小泬久久夂| 黄色电影免费在线观看| 日韩av三级在线观看| 日韩高清无码成人| 91亚洲日韩| 丁香啪啪| 欧美级毛片一进一出夜本色| 亚洲第五页| 国产女人在线观看| 97人人艹| 精品国产一区二区三区性色AV| 色婷婷Av一区| 在线看v片| 亚洲免费视频网| 91精品婷婷国产综合久久| 中文字幕在线不卡| 五月婷婷丁香五月| 二区AV| 青青草在线观看免费| 国产香蕉视频在线播放| 嫩草久久| 91丨PORNY丨丰满人妻网站| 西西444WWW大胆无视频软件亮点 | 久热免费视频| 中文字幕视频一区| 日韩无码三级视频| 人人色在线观看| 天天玩天天操| 大鸡巴久久久| 人人干人人草| 国产主播精品在线| 伊人网导航| 性福利导航| 国产美女啪啪视频| 一道本无吗一区| 国产高清AV| 亚洲视频三区| 91.xxxx| 中文无码熟妇人妻| 免费看的毛片| 国产精品一区在线观看| 久久成人三级| 中文字幕在线播放第一页| 自拍超碰在线| 蜜桃网站在线观看| 91精品久久香蕉国产线看观看| 18禁网址| 五月丁香婷婷久久| 亚洲日逼网| 久久午夜福利电影| 亚洲三级在线播放| 天天狠狠| 久色入口| 免费在线观看无码| 日本免费不卡| 国产精品扒开腿做爽爽爽A片唱戏| 国产成人精品八戒| 夜夜撸天天日| 色情网站在线| 呦小BBBB小小BBBB| 韩国午夜福利| 乱子伦一区二区三区视频在线观看 | 日韩一级在线| 久久99精品久久久久| 国产精品美女在线观看| 超碰人人在线观看| 五月婷婷激情网| 极品美女扒开粉嫩小泬高潮一| 国产精品一区二区AV日韩在线| 九一亚洲精品| 精品视频免费| 日本三级片在线| 久久亚洲Aⅴ成人无码国产丝袜| 亚洲高清无码视频大全| 99er在线视频| 在线天堂视频| 日韩午夜欧美精品一二三区| 国产伦精品一区二区三区妓女下载 | 免费无码视频一区二区| 亚洲综合中文字幕在线播放| 亚洲精品久久久久久久久蜜桃| 岛国A片| 午夜小电影| 亚洲无码伊人| 亚洲91网站| 一级av片| 亚洲免费网站| 三级片AAAA| 四川少妇bbbbbbbbb| 成片免费观看视频大全| 久久无码电影| 免看一级a一片| 中文字幕日本精品5| 国产2区| AV成人| 在线国产激情视频| 天天爽天天搞| 欧美丰满人妻免费视频人| 亚洲免费观看高清视频| 國產精品777777777| 日韩视频精品| 在线观看黄| 青青激情视频| 午夜神马影院| 天天做天天爱天天爽| 日本精品电影| 国产色婷婷精品综合在线播放| 无码伊人| 欧美操B| 五月婷婷色色网| 日产精品久久久一区二区| www.天天操| 韩国色情中文字幕| 在线播放一区二区三区| 国产精品高潮无套内谢| 日韩高清AV| 日韩欧美一级A片| 坏男人内射老太太| 先锋影音AV资源网| 五月激情婷婷基地| www黄色在线观看| 欧美成人手机在线| 日韩成人在线观看| 国精品无码A区一区二区| 特级婬片A片AAA毛片AA做头| 国产伦精品一区二区三区妓女| 日韩黄色A片| 69亚洲精品| 強姧伦一区二区三区在线播放| 五月婷婷免费视频| 亚洲国产欧美日韩在线| 国产2区| 久久99精品国产.久久久久 | 麻豆一区在线| 7777AV| 强伦轩人妻一区二区三区最新版本更新内容| 东北老女人性爱视频| 午夜天堂网| 欧美成人视频18| 99热999| 无码囯无精品毛片大码| 成人自拍视频| 狠狠狠狠狠狠狠狠狠狠| 91人妻人人澡人人爽人人精品乱| 99偷拍| 黄色大片在线播放| 午夜久久| 国产人妻一区二区三区欧美毛片 | 国产欧美在线综合| 久久波多野结衣一区二区| 精品一区二区三区四区视频| 最美孕交vivoestv另类| 国产人人爱| 韩国精品无码一区二区三区18| 无码国产传媒精品一区| 人人看AV| 二区视频| 大鸡巴操小逼视频| 99久久99久久久精品棕色圆| 狼友视频在线观看| 99re视频在线播放| 99久久99九九九99九他书对| 日韩综合色视频导航| 91精品国产一区三一| 天堂操逼| 国产A级成人婬片1976| 成人自拍在线| 外国一级片| 欧美日韩视频免费观看| 91人妻最真实刺激绿帽| 国产熟妇码视频户外直播| 日屄电影| 激情五月天网| 五月婷婷免费视频| 中文字幕成人在线观看| 黄色三级片网站| 99热一区二区三区| 中文字幕精品无码一区二区| 屁屁影院国产第一页| 黄色天堂| 国产黄色自拍视频|