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

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

共 28788字,需瀏覽 58分鐘

 ·

2021-04-28 19:36

程序員的成長之路
互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
關(guān)注


閱讀本文大概需要 9 分鐘。

來自:juejin.cn/post/6844903887871148039

1. 前言

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

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

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(權(quán)限)

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 '權(quán)限名稱',
  `desc` varchar(255CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '權(quán)限描述',
  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(角色-權(quán)限)

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. 前期準(zhǔn)備

4.1 導(dǎo)入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"賬號重復(fù)"),
    ACCOUNT_IS_DISABLED(13"賬號被禁用"),
    INCORRECT_CREDENTIALS(14"賬號或密碼錯誤"),
    NOT_LOGIN_IN(15"賬號未登錄"),
    UNAUTHORIZED(16"沒有權(quán)限")
    ;
    Integer code;
    String message;
}

4.6.2 ServerResponseVO.java

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

    // 描述信息
    private String message;

    // 響應(yīng)內(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      響應(yīng)碼
     * @return
     */

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

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

當(dāng)用戶身份認(rèn)證失敗時,會拋出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

/**
 * 負(fù)責(zé)認(rèn)證用戶身份和對用戶進(jìn)行授權(quán)
 */

public class UserRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    // 用戶授權(quán)
    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);
        // 放入權(quán)限信息
        List<String> permissionList = permissionService.findByRoleId(roleIds);
        authorizationInfo.setStringPermissions(new HashSet<>(permissionList));

        return authorizationInfo;
    }

    // 用戶認(rèn)證
    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");        // 進(jìn)行身份認(rèn)證后才能訪問
        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權(quán)限";
    }
}

6. 測試

6.1 用root用戶登錄

6.1.1 登錄

6.1.2 驗證是否登錄

6.1.3 測試角色權(quán)限

6.1.4 測試用戶操作權(quán)限

6.2 user用戶和vip用戶測試略

7. 總結(jié)

本文演示了SpringBoot極簡集成Shiro框架,實現(xiàn)了基礎(chǔ)的身份認(rèn)證和授權(quán)功能,如有不足,請多指教。
后續(xù)可擴(kuò)展的功能點有:
  • 集成Redis實現(xiàn)Shiro的分布式會話
  • 集成JWT實現(xiàn)單點登錄功能
<END>

推薦閱讀:

Git 這樣回退代碼,才足夠優(yōu)雅

靠,竟然有如此沙雕的代碼注釋!

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

獲取方式:點個「在看」,點擊上方小卡片,進(jìn)入公眾號后回復(fù)「面試題」領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

朕已閱 

瀏覽 39
點贊
評論
收藏
分享

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日本黄色大片| 国产欧美精品AAAAAA片| 日韩中文字幕无码| 五月激情丁香| 婷婷五月天网址| 麻豆乱伦视频| 亚洲色图欧美| 91丨九色丨蝌蚪丨对白| 91羞羞网站| 日韩视频在线免费观看| 亚洲人网站| 99人妻| 亚洲免费一级片| 少妇高潮一区二区三区99| 国产成人精品视频免费看| 亚洲日韩精品中文字幕| 99er视频| 午夜无码影院| 欧美国产三级| 大炕上公让我高潮了六次| 在线伊人网| 成年人性生活免费视频| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 黄色片在线| 婷婷精品国产a久久综合| 大肉大捧一出免费观看| 日本久久视频| 亚洲成人电影一区| 欧美日韩日逼视频| 69成人精品| 亚洲女人天堂AV| 国产免费一区二区三区网站免费| 日韩无码不卡| 国产一级AAAAA片免费| 亚洲免费视频播放| 国产精品无码在线| 先锋资源av在线| 一级性爱毛片| 国产aaaaaaaaaa| 尹人大香蕉网| 麻妃无码| 正在播放ADN156松下纱荣子| 女人A片一级黄色| 九九无码| av在线免费播放| 小處女末发育嫩苞AV| 国产激情片| 久久精品www人人爽人人| 亚洲成人视频在线免费观看| 亚洲网站免费观看| 伊人大香蕉视频在线观看| 成年人免费公开视频| 超碰在线免费播放| 国产日皮| 成人在线观看无码| 日韩在线观看网站| 无码免费一区二区三区| 国产一级一片免费播放放a| 蜜桃视频网站| 天天干,夜夜操| 日韩精品久久久久久久| 日逼黄色| 日韩欧美午夜成人无码| 少妇bbw搡bbbb搡bbbb| 久草视| 久久国产99| 黄色免费观看网站| 在线观看黄视频| 青青操成人在线视频| 黄色动漫在线免费观看| 一级a免一级a做免费线看内裤| 99久久亚洲精品日本无码| 亚洲无码在线资源| 伊人网视频在线播放| 亚洲欧美日韩不卡| 一区二区三区四区日韩| 五月天堂婷婷| 西西444WWW无码视频软件| 444444免费高清在线观看电视剧的注意 | 亚洲中文字幕一区二区| 97人人草| 亚洲人网站| 黄色小视频在线免费观看| 亚洲成人精品在线| 操天天操| 国产成人免费观看| 婷婷五月天无码| 亚洲无码视频网站| 免费精品视频| 欧美一区视频| 日本一区二区三区在线视频| 亚洲色欧美| 国产高清一区二区| 69人妻人人澡人人爽人人精品| av无码中文字幕| 亚洲综合视频在线观看| 一区二区色| 久久无码高清视频| 婷婷精品国产a久久综合| 精品成人电影| 国产福利网| 综合久久久| 欧美成人精品欧美一级乱黄| 91无码人妻| 青草福利视频| 精品一区二区三区三区| 久久黄色视频| 色色激情视频| 欧美熟女性爱| 亚洲综合免费| 作爱免费视频| 91精品国产综合久久久蜜臀粉嫩| 欧美五区| 一级一级a免一级a做免费线看内裤| 国产免费啪啪视频| AV黄色网| 日韩成人av在线| 内射熟妇| 欧美高清无码在线观看| 日韩三级成人| 日本十八禁网站| 无码人妻一区二区三区免费n狂飙 性猛交AAAA片免费看蜜桃视频 | 北条麻妃性爱视频| 黄页免费视频| 日本少妇网站| 一区二区三区四区久久| 在线视频91| 国产aa| 一级无码专区| A级黄色网| 日韩主播在线| 欧美三区四区| 高清无码视频免费| 国产精品不卡在线| 撒尿BBw搡BBwBBw| 亚洲免费成人视频| 欧美一级婬片免费视频华泰老添妇| 免费毛片+一区二区三区| 69视频网站| 一区二区在线视频| 老司机狠狠干| 日本不卡在线观看| 天天天做夜夜夜爽无码| 91丨九色丨老熟女探花| 操逼中文字幕| 婷婷丁香五月社区亚洲| 欧美色图另类| 国产毛片视频| 91一区二区| 亚洲第一香蕉视频| 天天射天天干天天| 小草一区| 无码人妻丰满熟妇精品| 丰满熟妇人妻中文字幕| 欧美日韩性爱| 波多野42部无码喷潮更新时间| 黄网站在线观看| 国产一级a毛一级a毛片视频黑人| 操碰人人操| 亚洲一二三四区| 羽月希奶水饱胀在线播放| av资源在线看| 欧美天堂在线观看| 亚洲成人A片| 亚洲字幕| 久操精品视频| 色五月电影| 超碰人人妻| 亚洲最大黄色视频| 婷婷AV在线| 透逼视频| 自拍偷拍免费| 亚洲一级无码视频| 理论在线视频| 日韩午夜电影| 99精品在线免费观看| 精品视频久久| 国产精品久久久久久久久久二区三区 | 午夜成人黄色| 少妇做爱特级AAA| 亚洲精选一区二区三区| 特逼视频| 日屄视频在线观看| AV成人| 国产小毛片| 97人妻精品一区二区三区免| 成人大片在线观看| 亚洲AV资源| 五月丁香在线视频| 亚洲中文字幕日韩在线| 综合AV在线| 日韩免费视频观看| 男女视频网站| 在线观看国产| 亚洲AV秘无码一区在线| 高清视频一区| 亚洲毛片在线| 国产精品TV| 色青草影院久久综合| 久久香蕉电影| 女人18片毛片90分钟免费明星| 日韩AⅤ| 亚州无码视频| 伊人成人视频在线观看| 伊人热久久| 一级在线播放| 中文在线a√在线8| 天堂网址激情网址| 亚洲日韩中文字幕无码| 大香蕉综合在线观看| 精品无码一区二区三区的天堂| 麻豆mdapp03.tⅴ| 日比视频| 亚洲色男人天堂| 欧美国产综合在线| 日韩欧美一| 亚洲天堂久久| 亚洲成人福利电影| 日本黄色色情视频| 安徽妇搡BBBB搡BBBB| 亚洲性爱在线观看| 亚洲AV综合色区无码国产播放| 国产成人无码精免费视频| 亚洲精品无码a片| 国产传媒在线观看| 国内精产品一二区秘| 亚洲无码乱码av| 欧美视频a| 在线无码免费观看| 欧美视频综合| 国产精品成人在线视频| 婷婷色色网| 成人h在线| 91操视频| 可以免费看的黄色| 97国产精品视频| 辽宁模特张雪馨视频最新| 国产白嫩精品久久久久久| 欧美日韩高清一区二区三区| 成人欧美大片黄18| 欧美人妻视频在线| 亚洲综人网| 欧美性猛交XXXX乱大交| 韩国AV在线| 国产欧美精品AAAAAA片| 国产精品内射视频| 岛国无码在线观看| 天天谢天天干| 青青草免费在线观看| AV黄色在线观看| 插菊花综合| 性爱A级视频| 亚洲av自拍| 91国产爽黄| 18禁网站在线看| 丰满人妻一区二区三区四区53 | av资源在线看| 久久久国产精品视频| 国产51视频| 久久综合操| 久久国产劲爆∧v内射| 亚洲国产精品成人va在线观看| 中文精品在线| 91人妻无码精品蜜桃| 色AV高清| 亚洲在线一区二区| 国产精品国产精品国产专区不| 另类老妇奶性生BBwBB| 超碰在线观看免费版| 黄色免费看| 成人黄色免费| 国产精品2| 亚洲精品视频免费看| 日韩精品区| 男女一区| 国产美女全裸网站| 另类老妇奶性生BBwBB| 老熟女搡BBBB搡BBBB视频| 狠狠干天天干| 亚洲乱伦| 精品一二三四| 国产亚洲中文字幕| 搡BBBB搡BBB搡五十粉嫩| 国产美女福利| 四虎AV| 色大香蕉伊人| 在线18禁| 久9热| 亚洲天堂三级片| 无码视频一区二区三区| 日本的黄色视频| 黄色A片免费观看| 欧美后门菊门交| www.黄色在线| 一起草在线视频| 性爱免费视频| 天天舔天天操| 五月激情六月丁香| 精品无码二区| 婷婷在线电影| 中文字幕免费观看| 亚洲免费人妻| 国产在线黄片| 久久艹精品视频| 欧美三级美国一级| 日本少妇午夜福利| 日韩在线你懂的| 中日韩一级片| 成人中文字幕无码| 大陆一级片| 在线观看日韩三级片av| 天堂网av2025| 福利视频网站| 亚洲最新在线观看| AV一区二区三区四区| 91大神在线资源观看无广告| 日韩中文字幕精品| 果冻传媒A片一二三区| 成人免费啪啪视频| 在线观看你懂得| 欧美日韩国| 日韩家庭乱伦| 欧美色一级| 国产成人无码AⅤ片免费播放| 嫩BBB嗓BBBB榛BBBB| 无码人妻少妇| 操逼福利| 久久99久久视频| 9l视频自拍蝌蚪9l成人| 另类老妇奶性生BBwBB| 91亚洲精品视频在线| 成人网站在线免费| 中文字幕精品1| 色九九九| 无码熟妇人妻无码AV在线天堂| 婷婷视频在线观看| 成人视频毛片| 久草加勒比| 人妻懂色av粉嫩av浪潮av| 五月在线视频| 丝袜东京热AV高清| 老湿机福利视频| 大香蕉网站在线观看| 天天色天天色天天色| 综合站欧美精品| 国产不卡在线观看| 日韩AAA在线| 91热久久| 操久久久久久| 特级婬片AAAAAAA级| 999久久精品| JULIA超乳JULIA无码| AV无码精品| 婷婷性爱五月天| 欧洲三级片网站| 尤物视频官网| 欧美久久一区二区三区四区视频| www四虎| 俺来也影院| 欧美在线免费观看| 天天综合网久久| 91免费| 国外操逼视频| 久久久无码精品亚洲| 亚洲乱乱| 黄色录像一级片| 一级黄色片免费观看| 在线无码免费观看| 国产精品99精品| 91成人影片| 五月天婷婷成人| 伊人大香蕉在线| 超碰人人操人人摸| 无码一区二区三区四季| 成人精品三级麻豆| 91丨豆花丨国产极品| 国产午夜在线视频| 伊人666| 国产成人av在线播放| 国产成人秘在线观看免费网站| 大地二中文在线观看免费鲁大师 | 日韩无码视频播放| 日韩中文字幕av| 中文字幕牛牛婷婷| 大鸡巴网站| 在线天堂19| 三级片在线观看网站| 在线播放无码| jizz18日本| 欧美综合色| 在线视频福利导航| 欧美自拍视频| AV在线一区二区三区| 国产性爱图| 日日碰日日摸| 亚洲AV无码成人H动漫| 亚洲影音先锋| yw视频在线观看| 91性爱嫩逼视频| 青春草在线观看国产| 大香蕉久久久久久久| 69成人精品国产| 在线视频福利导航| 日本东京热视频| 成人国产在线无码AV免费| 在线aⅴ| 色色9999| 草逼毛片| 日逼视频| 国产V在线观看| 亚洲AV久久无码| 无码AV在线播放| 久热re| 北条麻妃久久视频在线播放| 日韩欧美国产精品| 午夜一级| 日韩人妻一区二区| anwuye官方网站| 久久成人18免费网站波多野结衣| 激情AV| 久久久久久久免费无码| 欧美性爱在线| 国产精品国产精品| 日本白嫩的BBw| 国产成人精品一区二区| 在线观看中文字幕AV| 国产免费av在线观看| 国产精品国产精品国产专区不片| 国产精品XXX视频| 牛牛成人在线视频| 香蕉三级片| 国产三级性爱视频| 久热久| 暖暖在线视频| 人人爽人人爽人人| 亚洲激情在线| 精品成人一区二区三区| 欧美日韩a片| 黄色一级网站| 特大妓女BBwBBWBBw| 中文字幕无码免费| 婷婷综合在线| 无码国产一区二区三区四区五区| 7777精品伊人久久7777| 国产黄色视频在线| 9l视频自拍蝌蚪9l成人蝌蚪| 国产精品2| 中文字幕亚洲视频| 无码一区二区三区在线观看| 亚洲无码黄色片| 男人天堂影院| 久久黄色免费视频| 日韩无码人妻一区| 欧美韩日高清精彩视频| 91成人| 亚洲精品影视| 欧美熟女性爱| 一本色道久久综合熟妇| 亚洲成人精品一区二区| 四川妇搡BBBB搡BBBB| 久久久久久久国产精品| 久久久久久久免费| 国产一级A片免费播放| 91精品国产综合久久久不打电影| 色激情五月天| 俺去也在线播放| 殴美亚洲一流| 二区三区在线| 亚洲www视频| 东京热六区| 丁香五月激情视频| 高清成人无码| AV成人无码| 麻豆传媒视频观看| 四川乱子伦95视频国产| 青青草伊人大香蕉| 久久综合久久鬼色| 久久久久久av| 99热5| 一级AAAAA片裸体做受| 91精产国品一二| 国产在线a| 久草视频免费看| 日本在线不卡视频| 蜜桃视频在线观看18| 国产无码区| 色综合久久久| 肉色超薄丝袜脚交一区二区| 亚洲无码在线免费观看| 中文字幕在线观看不卡| 欧美性爱A| 西西www444无码大胆| 日韩欧美高清视频| 国产麻豆三级片| 国产小黄片在线| 操逼无码精品| 高潮喷水在线观看| 婷婷五月综合在线| 激情一级| 91人妻一区二区三区| 久操大香蕉| 午夜福利资源| 国产亚洲色婷婷久久99精品| 夜夜天天人人| 午夜福利不卡视频| 欧美一级免费| 国产视频一区二区在线观看 | 国产无遮挡又黄又爽又色学生软件 | 日韩小电影在线观看| wwwA片| 小黄片免费在线观看| 毛茸茸BBBBBB毛茸茸| 日韩成人无码影片| 麻豆传媒嫂子| 欧美黄色小视频| 激情成人五月天| 中文字幕+乱码+中文乱码视频在线观看| 国产精品久久久久久久久久二区三区 | 熟女少妇网站| 最近中文字幕免费mv第一季歌词強上 | 国产精品九九| 人人色视频| 波多野结衣一二三区| 国产看色免费| gogogo视频在线观看黑人| 日本AⅤ在线| 色噜噜AV| 黃色一級片黃色一級片尖叫声-百度-百 | 一级黄色免费看| 国产一级片免费视频| 牛牛精品视频一区二区| 精品国产乱子伦一区二区三区最新章 | 2022黄片| 另类老妇性BBwBBw图片| 伊人影院在线免费观看| 韩国日本久久| 久久久91| 成人三级视频在线观看| 中文字幕在线观看日本| 国产精品在线免费观看| 麻妃无码| mm131亚洲国产精品久久| 西西444www| 黄色视频网站在线免费观看| 97超碰资源总站| 操屄视频免费观看| 久久久免费黄色视频| 日本熟女视频| 伊人成色| 欧美精产国品一区二区区别| 永久精品| 五月天婷婷综合网| 成人性爱自拍| 操逼逼一区二区三区| 91高清视频| 少妇综合网| 麻豆AV无码| 欧美一级日韩| 欧美熟妇另类久久久久久不卡| 日韩激情无码视频精选| 在线观看免费黄色视频| 91精品综合| 九九操逼| 女生操逼网站| 日韩无码黄| 青草久久久久| 久久久精品久久| 色欲国产精品欧美在线密| 亚洲永久| 日韩五月天| 中文字幕无码视频在线观看| 一级黄影| www.AV在线| 久久99视频免费观看| 免费成人国产| 亚洲猛男操逼欧美国产视频| 黄片网站免费| 久久伊人影院| 小黄片免费在线观看| 欧美在线v| 色视频在线播放| 91国在线| 国产v亚洲| 96精品久久久久久久久久| 国产色婷婷一区二区| 99这里都是精品| 安徽妇搡BBBB搡BBBB按摩小说| 狠狠操综合| 午夜专区| 国产女同在线观看| 妓女不卡| 国产福利视频在线观看| 99re久久| 日韩欧美毛片| 无码秘人妻一区二区三-百度 | 婷婷深爱激情| 成人黄网站在线观看| 偷拍九九热| 无码免费视频| 亚洲欧洲在线视频| 丰满的人妻一区二区三区果冻 | 中文字幕A片无码免费看| 亚洲av中文| 香蕉三级片| 特级西西人体WWWWW| 444444在线观看免费高清电视剧木瓜一| 乳揉みま痴汉电车羽月希免费观看| 人妻大香蕉| 久久精品视频在线观看| 久久小视频| 美女黄色视频网站| 无码爱爱视频| 日韩高清无码一区二区三区| 2025av在线| 91无码秘蜜桃一区二区三区-百度 精品人妻一区二区三区在线视频不卡 | 精品人伦一区二区三区| 97精品一区二区三区A片| 亚洲日韩黄色| 国精产品一二三区| 久久视频99| www.有码99| 色五月婷婷小说| 国产一区二区三区视频在线| 亚洲成人福利电影| 俺来也影院| 青青娱乐亚洲无| 日本成人中文字幕在线观看| 伊人久久av| 18AV在线观看| 亚洲九区| 成人午夜在线观看| 九九九九九九精品| 另类视频在线| 国产91久久婷婷一区二区| 日本一级片免费看| 中文字幕理论片| 色婷婷欧美在线播放内射| 人人爱人人爽人人操| 伊人久久在线| 国精品无码人妻一区二区三区免费| 日韩成人电影| 伊人在线观看视频| 国产无遮挡| 人妻精品久久久久中文字幕69| 在线操B| 蜜桃视频在线观看视频| www.豆花视频成人版| 乌克兰性爱视频| 热久久伊人| 91一级特黄大片| 天堂资源在线观看| 99九九视频| 91狠狠色丁香婷婷综合久久精品 | 2021狠狠操| 水果派解说AV无码一区| 五月丁香色色| 欧美五区| 色婷婷狠狠操| 国产白浆一区二区三区| 99色国产| 免费黄色av网址| 嫩BBB搡BBBB搡BBBB-百度| 精品1区2区| 91人妻中文字幕| 亚洲AV无码乱码国产精品黑人| 性爱91视频| 一插菊花网| 日韩无码砖区| 手机看片福利永久| 91羞羞网站| 91人妻无码一区二区久久| 草久精品| 亚洲无码日| 豆花成人在线| 亚洲自拍天堂| 久久澡| 亚洲国产精品18久久久久久 | 欧美黄片AAA| 啪啪人妻| 久久午夜无码鲁丝午夜精品| 夜夜骑免费视频| 在线中出| 麻豆乱婬一区二区三区| 麻豆精品视频| 又a又黄高清无码视频| 97男人的天堂| 国产一精品| 亚洲第一a| 黄色片一级片| 激情小说在线观看| 一区二区三区不卡在线| 精品亚洲一区二区三区四区五区| 日韩久久人妻| av在线免费观看网站| 久久精品中文| 色呦呦中文字幕| 欧美在线一区二区三区| 黄色精品视频| 高清无码一区二区三区| 天堂网视频| 成人视频观看| 91白丝喷水自慰网站| 国产中文字幕在线免费观看| 天堂网婷婷| 日本中文视频| 无码国产一区二区三区四区五区| 国产欧美精品一区二区色综合 | 亚洲AV秘无码不卡在线观看| 三级成人在线| 亚洲精品视频免费看| 色丁香婷婷| 97久久一区二区| 欧美伊人在线| 国产日韩欧美一区| 专业操老外| 岛国无码在线观看| 少妇免费视频| 另类av| AV网站入口| 欧美在线日韩在线| 亚洲免费观看在线观看| 亚洲精品二| 久久综合操| 日韩大片在线观看| 特逼视频| 婷婷在线观看视频| 国产91无码网站在线观看| 欧美三级网站| 成人免费毛片果冻日本| 欧美性爱自拍| 伊人毛片| 久久精品国产亚洲AV麻豆痴男| 亚洲经典免费视频| 一区二区三区无码专区| 欧美一级欧美三级在线观看| 男人亚洲天堂| 97操碰| 无码一区二区三| 精品黄色毛片| 伊人成人网视频| 人人人人人人操| 操逼中文字幕| 日韩精品视频一区二区| 国产高清精品软件丝瓜软件| 亚洲第一黄色| 欧美人人插| 日韩一区二区三区四区久久久精品有吗| 91视频网站免费| 色婷网| 黄色小视频在线免费观看| 久久久999| 日韩中字无码黄片| 黄片WWW| 精品视频日韩| 激情综合婷婷久久| 日本一级黄色电影| 91视频一区| 污视频在线观看免费| 国产精品久久7777777精品无码 | 地表最强网红八月未央道具大秀 | 日韩AV高清无码| 手机看片1024国产| 一级AA毛片| 蜜桃免费视频| 老司机永久免费91| 欧美色逼| 亚洲AV人人夜夜澡人人| 国产免费av片| 午夜无码av| 亚洲日韩一区二区| 成人操B视频在线观看| 日韩欧美国产一区二区| 国产成人精品一区二区三区视频| 三级午夜在线无码| 欧美成人一级A片| 日韩视频在线免费观看| 18禁片网站| AV成人无码| 亚洲黄色三级| 欧美特黄AAAAAAAAA片| 牛牛精品一区二区| 51毛片| 免费在线黄片| 一级A片久久久免费直播间| 51妺嘿嘿午夜福利视频| 特级西西人体WWWWW| 午夜福利欧美| 亚洲视频日韩在线观看| 超碰色| 中文字幕在线视频第一页| 在线成人免费视频| 国产v片| 日韩精彩视频| 欧美天天撸| 大茄子熟女AV导航| 特级西西WWW888| 久草社区在线| 波多野结衣在线无码视频| 码人妻免费视频| 中文字幕在线观看AV| 人妻电影亚洲av| 国产一区二区三区四区五区六区七区 | 操操综合| 五月丁香亭亭| 欧美成人无码片免费看A片秀色| 伊人久久AV诱惑悠悠| 久久a视频| 色天使av| 国产美女操逼| 日韩一a| 一级AA视频| 免费黄色a片| 在线欧美亚洲| 激情AV在线| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 久久久久久久久久久久久自慰小片| 国产狼友| 91久久电影| 三级久久久| 91精品视频在线| 国产精品免费人成网站酒店| 日韩中文字幕网| 美女免费AV| 亚洲av免费看| 亚洲黄色视频网站| 天天日综合网| 欧美黄色精品| 久久久久久成人电影| 91视频美女内射| 国产又爽又黄视频在线看| 成人大香蕉网| 91精品无码| 超碰人人干人人操| 色网站在线| 一道本无吗一区| 成人乱码一区二区三区| 一区二区三区不卡在线| 操大爷影院| 日韩精品高清中文| 日韩中文字幕在线高清| 五月婷婷综合在线| 久久久麻豆| 妹子色综合| 91丝袜一区二区三区| 无码专区一区二区三区| 亚洲高清视屏| ChineSe露脸老女人| 大香蕉日逼| 日韩无码精品AV| 麻豆精品无码| 五月天国产精品| 在线中文字幕在线观看| 另类欧美| 国精产品一区一区三区四川| 加勒比黑人和翔田千里在线播放| 亚洲日韩字幕| 日韩性爱视频在线观看| 亚洲AV白浆| 欧美一级黃色A片免费看蜜桃熟了| 天天插天天狠天天透| 上海熟搡BBB搡BBBB| AV手机天堂| 国产情侣在线视频| 日韩成人精品| 超碰在线91| 亚洲操操操操| 久久免费视频1| 99视频免费观看| 在线不卡无码| 欧美成人三级精品| 日韩人妻一区二区| 亚洲美穴| 又大又粗又爽| 一区二区不卡视频| 亚洲天堂久久久| 999久久| 麻豆91麻豆国产传媒| 欧美熟妇擦BBBB擦BBBB| 北条麻妃在线一区| 久草视频免费在线观看| 丁香五月激情啪啪| 91久久久久国产一区二区| 免费一级A片| 北条麻妃亚洲无码| 激情五月天丁香| 亚州无码视频| 久久午夜福利视频| 日韩激情在线观看| 综合激情AV| 日韩成人综合| 夜夜天天人人| 亚洲a∨| 免费射精一二三区| A片视频播放| 天天操综合| 五月天丁香成人| 国产卡一卡二| 伊人免费| 人人妻日日摸狠狠躁视频| 一道本av|