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

SpringSecurity +Jwt 實現(xiàn)權(quán)限管理

共 29907字,需瀏覽 60分鐘

 ·

2021-04-03 21:25

公眾號關(guān)注 “GitHub今日熱榜
設(shè)為 “星標”,帶你挖掘更多開發(fā)神器!






為了方便,未采用是從數(shù)據(jù)庫讀取的方式。工具類都是別人那偷的(滑稽。


原理架構(gòu)圖



demo的項目結(jié)構(gòu)



  • JwtTokenUtil : JwtToken生成的工具類

  • RestAuthenticationEntryPoint : 當未登錄或者token失效訪問接口時,自定義的返回結(jié)果

  • RestfulAccessDeniedHandler : 當訪問接口沒有權(quán)限時,自定義的返回結(jié)果

  • JwtAuthenticationTokenFilter : JWT登錄授權(quán)過濾器

  • SecurityConfig:SpringSecurity 的配置類

  • User : 實現(xiàn) UserDetails 接口 ,主要功能是 保存用戶的賬號密碼以及角色列表

  • MyUserDetailsService:實現(xiàn)了 UserDetailsService 接口的 loadUserByUsername 方法 ,主要是進行登錄信息驗證,在輸入賬戶密碼進行登錄的時候,會進入這個類進行驗證信息。


由于類比較多,一般建議創(chuàng)建的流程:


1、創(chuàng)建 JwtTokenUtil

2、創(chuàng)建 RestAuthenticationEntryPoint 和 RestfulAccessDeniedHandler

3、創(chuàng)建 MyUserDetailsService

4、創(chuàng)建 JwtAuthenticationTokenFilter

5、配置 Security信息 SecurityConfig


JwtTokenUtil


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: JwtToken生成的工具類
 * @Author: zlf
 * @Date: 2021/3/30
 */

@Component
public class JwtTokenUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class);
    private static final String CLAIM_KEY_USERNAME = "sub";
    private static final String CLAIM_KEY_CREATED = "created";
    @Value("${jwt.secret}")
    private String secret;
    @Value("${jwt.expiration}")
    private Long expiration;

    /**
     * 根據(jù)負責生成JWT的token
     */

    private String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(generateExpirationDate())
                .signWith(SignatureAlgorithm.HS512, secret)
                .compact();
    }

    /**
     * 從token中獲取JWT中的負載
     */

    private Claims getClaimsFromToken(String token) {
        Claims claims = null;
        try {
            claims = Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            LOGGER.info("JWT格式驗證失敗:{}",token);
        }
        return claims;
    }

    /**
     * 生成token的過期時間
     */

    private Date generateExpirationDate() {
        return new Date(System.currentTimeMillis() + expiration * 1000);
    }

    /**
     * 從token中獲取登錄用戶名
     */

    public String getUserNameFromToken(String token) {
        String username;
        try {
            Claims claims = getClaimsFromToken(token);
            username = claims.getSubject();
        } catch (Exception e) {
            username = null;
        }
        return username;
    }

    /**
     * 驗證token是否還有效
     *
     * @param token 客戶端傳入的token
     * @param userDetails 從數(shù)據(jù)庫中查詢出來的用戶信息
     */

    public boolean validateToken(String token, UserDetails userDetails) {
        String username = getUserNameFromToken(token);
        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
    }

    /**
     * 判斷token是否已經(jīng)失效
     */

    private boolean isTokenExpired(String token) {
        Date expiredDate = getExpiredDateFromToken(token);
        return expiredDate.before(new Date());
    }

    /**
     * 從token中獲取過期時間
     */

    private Date getExpiredDateFromToken(String token) {
        Claims claims = getClaimsFromToken(token);
        return claims.getExpiration();
    }

    /**
     * 根據(jù)用戶信息生成token
     */

    public String generateToken(UserDetails userDetails) {
        Map<String, Object> claims = new HashMap<>();
        claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername());
        claims.put(CLAIM_KEY_CREATED, new Date());
        return generateToken(claims);
    }

    /**
     * 判斷token是否可以被刷新
     */

    public boolean canRefresh(String token) {
        return !isTokenExpired(token);
    }

    /**
     * 刷新token
     */

    public String refreshToken(String token) {
        Claims claims = getClaimsFromToken(token);
        claims.put(CLAIM_KEY_CREATED, new Date());
        return generateToken(claims);
    }
}


RestAuthenticationEntryPoint 和 RestfulAccessDeniedHandler


import cn.hutool.json.JSONUtil;
import com.zlf.Api.CommonResult;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* @Description: 當未登錄或者token失效訪問接口時,自定義的返回結(jié)果
* @Author: zlf
* @Date: 2021/3/30
*/

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        System.out.println("--- --- 未登錄");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        response.getWriter().println(JSONUtil.parse(CommonResult.unauthorized("失敗")));
        response.getWriter().flush();
    }
}


import cn.hutool.json.JSONUtil;
import com.zlf.Api.CommonResult;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* @Description: 當訪問接口沒有權(quán)限時,自定義的返回結(jié)果
* @Author: zlf
* @Date: 2021/3/30
*/

@Component
public class RestfulAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request,
                       HttpServletResponse response,
                       AccessDeniedException e)
 throws IOException, ServletException
{
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        response.getWriter().println(JSONUtil.parse(CommonResult.forbidden(e.getMessage())));
        response.getWriter().flush();
    }
}


MyUserDetailsService


import org.springframework.security.core.GrantedAuthority;
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.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: zlf
 * @Date: 2021/03/30/23:38
 * @Description:
 */

@Component
public class MyUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      // 這邊可以通過username去獲取數(shù)據(jù)庫中的用戶信息 如果沒有拋出異常
        List<GrantedAuthority> authorityList = new ArrayList<>();
        /* 此處查詢數(shù)據(jù)庫得到角色權(quán)限列表,這里可以用Redis緩存以增加查詢速度 */
        System.out.println("--- ---- 判斷");
        authorityList.add(new SimpleGrantedAuthority("ROLE_USER")); // 角色 需要以 ROLE_ 開頭
        return new org.springframework.security.core.userdetails.User(username, new BCryptPasswordEncoder().encode("123456"), authorityList);
    }
}


JwtAuthenticationTokenFilter


import com.zlf.utils.JwtTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

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.List;


/**
* @Description: JWT登錄授權(quán)過濾器
* @Author: zlf
* @Date: 2021/3/30
*/

@Component
@Slf4j
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {

    //@Autowired
    //private UserDetailsService userDetailsService;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Value("${jwt.tokenHeader}")
    private String tokenHeader;
    @Value("${jwt.tokenHead}")
    private String tokenHead;

    @Autowired
    private MyUserDetailsService userDetailsService;

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain chain)
 throws ServletException, IOException
{
        String authHeader = request.getHeader(this.tokenHeader);
        if (authHeader != null && authHeader.startsWith(this.tokenHead)) {
            String authToken = authHeader.substring(this.tokenHead.length());// The part after "Bearer "
            String username = jwtTokenUtil.getUserNameFromToken(authToken);
            log.info("checking username:{}", username);
            if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
                UserDetails userDetails = userDetailsService.loadUserByUsername(username);
                if (jwtTokenUtil.validateToken(authToken, userDetails)) {
                    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, new BCryptPasswordEncoder().encode("123456"), userDetails.getAuthorities());
                    authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                    log.info("authenticated user:{}", username);
                    SecurityContextHolder.getContext().setAuthentication(authentication);
                }
            }
        }
        chain.doFilter(request, response);
    }

// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// List<GrantedAuthority> authorityList = new ArrayList<>();
// /* 此處查詢數(shù)據(jù)庫得到角色權(quán)限列表,這里可以用Redis緩存以增加查詢速度 */
// authorityList.add(new SimpleGrantedAuthority("ROLE_USER")); // 角色 需要以 ROLE_ 開頭
// return new org.springframework.security.core.userdetails.User(username, "123456", true, true,
// true, true, authorityList);
// }
}


SecurityConfig


import com.zlf.component.JwtAuthenticationTokenFilter;
import com.zlf.component.MyUserDetailsService;
import com.zlf.component.RestAuthenticationEntryPoint;
import com.zlf.component.RestfulAccessDeniedHandler;
import com.zlf.entity.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
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.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: zlf
 * @Date: 2021/03/30/20:45
 * @Description:
 */

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {



    @Autowired
    private MyUserDetailsService userDetailsService;

    @Autowired
    private RestfulAccessDeniedHandler restfulAccessDeniedHandler;
    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Autowired
    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;


    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf()// 由于使用的是JWT,我們這里不需要csrf
                .disable()
                .sessionManagement()// 基于token,所以不需要session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET, // 允許對于網(wǎng)站靜態(tài)資源的無授權(quán)訪問
                        "/",
                        "/*.html",
                        "/favicon.ico",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js",
                        "/swagger-resources/**",
                        "/v2/api-docs/**"
                )
                .permitAll()
                .antMatchers("/admin/login", "/register")// 對登錄注冊要允許匿名訪問
                .permitAll()
                .antMatchers(HttpMethod.OPTIONS)//跨域請求會先進行一次options請求
                .permitAll()
// .antMatchers("/**")//測試時全部運行訪問
// .permitAll()
                .anyRequest()// 除上面外的所有請求全部需要鑒權(quán)認證
                .authenticated();
        // 禁用緩存
        httpSecurity.headers().cacheControl();
        // 添加JWT filter
        httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
        //添加自定義未授權(quán)和未登錄結(jié)果返回
        httpSecurity.exceptionHandling()
                .accessDeniedHandler(restfulAccessDeniedHandler)
                .authenticationEntryPoint(restAuthenticationEntryPoint);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
                .passwordEncoder(new BCryptPasswordEncoder());
    }

// @Bean
// public PasswordEncoder passwordEncoder() {
// return new BCryptPasswordEncoder();
// }



// @Bean
// public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter(){
// return new JwtAuthenticationTokenFilter();
// }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}


Controller


import com.zlf.entity.User;
import com.zlf.utils.JwtTokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: zlf
 * @Date: 2021/03/30/23:15
 * @Description:
 */

@RestController
public class LoginController {

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Value("${jwt.tokenHead}")
    private String tokenHead;

    @PostMapping("/admin/login")
    public String login(@RequestBody User user, HttpServletRequest request) {
        /* 在這里驗證用戶名和密碼,驗證成功則生成token返回 */
        System.out.println("--- -- -login");
        System.out.println(user);
        return  tokenHead+" "+jwtTokenUtil.generateToken(user); // 生成 Token,返回給客戶端
    }

    @PreAuthorize("hasAnyRole('USER')") // 對單個方法進行權(quán)限控制
    @GetMapping("/me")
    public String me() {
        // 從上下文中獲取 UserDetails
        UserDetails userDetails = (UserDetails) org.springframework.security.core.context.SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        return userDetails.getUsername() + "," + userDetails.getPassword();
    }
}


Postman 測試



我們將登錄獲取到的 Token ,放到請求頭中。



最后放出 JWT key的配置


# 自定義jwt key
jwt:
  tokenHeader: Authorization #JWT存儲的請求頭
  secret: mySecret #JWT加解密使用的密鑰
  expiration: 604800 #JWT的超期限時間(60*60*24)
  tokenHead: Bearer #JWT負載中拿到開頭


依賴


<!--Hutool Java工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.7</version>
        </dependency>
        <!--JWT(Json Web Token)登錄支持-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>





出處:https://blog.csdn.net/xiuyuandashen/article/details/115354629








關(guān)注GitHub今日熱榜,專注挖掘好用的開發(fā)工具,致力于分享優(yōu)質(zhì)高效的工具、資源、插件等,助力開發(fā)者成長!







點個在看 你最好看



瀏覽 61
點贊
評論
收藏
分享

手機掃一掃分享

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

手機掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 奇米av| 天天干天天添| 色男人色天堂| 日本成人性爱视频网站一区| 8x8拨牐拨牐拨牐永久免费| 奇米色网| 91狠狠色丁香婷婷综合久久精品 | 337P粉嫩大胆噜噜噜55569| www.高清无码| 婷婷五月天网| 亚洲精品国产成人AV在线| 无码视频一二三区| 大鸡巴日| 国产十八岁在线观看免费| 人人爽人人| 亚洲无码一卡二卡| 息子交尾一区二区三区| 国内自拍青青| 99九九网| 国产在线激情视频| 99热在线看| 成人小说一区二区三区| 国产21区| 国产熟女自拍| 大香蕉伊人影视| 天堂无码| 91成人影片| 亚洲视频天堂| 精品麻豆| 狠狠色色| 日韩综合在线观看| 男女啪啪啪网站| 国产高清AV无码| 日韩人妻无码一区二区三区七区| 88av在线| 人人摸人人干人人操| 成人亚洲在线| 在线免费观看无码视频| 国产成人精品一区二区三区视频| 激情五月天av| 大香蕉福利在线| 国产不卡网| 在线观看免费黄色视频| 国产亚洲色婷婷| 色哟哟国产精品| 大香蕉做爱| 91亚洲精选| 日本欧美一区二区三区| 国产亚洲网| 男人操女人网站| 黑人无码一二三四五区| 精品久久久久久久| 国产精品免费在线| 男人的天堂在线视频| 高清无码视频在线免费观看| 一级欧美日韩| 欧美成人手机在线| 欧美五月激情| 亚洲色图欧美另类| 五月天激情小说网| 97久久一区二区| 中文字幕亚洲第一| 荫蒂添到高潮免费视频| 日韩不卡av| 日日综合网| 国产成人毛片18女人18精品| 在线成人亚洲| 欧美成人片免费看| 亚洲AV白浆| 欲色av| 日本成人视频| 嫩草视频| 男女内射视频| 操逼影视| 怡春院av| 黄色成人视频在线免费观看| 午夜AV无码| 猛男大粗猛爽H男人味| 成人黄色免费观看| 国内自拍av| 欧美成人高清视频| 综合天天| 国产亚洲欧美精品综合在线| 午夜啊啊啊| 91三级电影| 国产精品无码中文在线| 夜夜操夜夜| 三级无码片| 三级网址在线| 一级黄色录像视频| 在线视频99| 欧美精品秘一区二区三区蜜臀| 日韩黄| 婷婷五月综合中文字幕| 日韩三级精品| 日韩精品无码AV| 亚欧精品久久久| 欧美日韩在线观看中文字幕| 日韩日批| 国产精品成人在线视频| 国产aaaa| www.AV在线| 宅男噜噜噜66一区二区| 大鸡巴久久久久久| 新中文字幕| 日本亚洲中文字幕| 国产毛片久久久久久久| ww毛片| 亚洲精品成人无码AV在线| 东京热无码一区| 日韩欧美成人网站| 91精品电影| 91人妻人人澡人人爽人人精| 婷婷丁香五月综合| 黄色日逼片| 日韩AV高清| 污污污www精品国产网站| 黑人久久| 无码在线免费观看视频| 大香蕉视频在线观看| 久操免费视频| 亚洲AV官方网站| 日韩一级一片内射视频4K| 欧美国产综合在线| 人妻少妇一区二区| 97综合久久| 大逼影院| 成人H视频| 吃奶做爱视频| 在线成人AV| 欧美色逼逼| 99九九热| av黄片| www.亚洲精品| 在线操逼| 苍井空一区| 亚洲在线中文字幕| 亚洲成人少妇老妇a视频在线| 北条麻妃无码精品AV怎么看 | 成人怡红院| 少妇一区二区三区| 美日韩视频欧美一区二区视频 | 福利在线看| 一级黄色A片视频| 成人图片小说| 成人久久久久一级大黄毛片中国 | 成人做爰黄级A片免费看土方| 久久久久久久久久久久国产精品| 动漫无码视频| 91黑人丨人妻丨国产丨| 亚洲一区欧美| 四虎成人精品无码永久在线的客服| 天天爽夜夜爽人人爽| 国产成人91| 亚洲无码性爱| 天天射综合| 日本一区二区网站| 性爱xxxxx| 成av人片一区二区三区久久| 黑人巨大翔田千里AⅤ| 欧美a区| 亚洲一区在线免费观看| 伊人导航| 波多野结衣无码高清| 加勒比黑人和翔田千里在线播放| 一区二区高清无码视频| 一级内射片在线网站观看| 亚洲综合激情网| 福利国产在线| 一区二区三区四区高清无码| 东京热视频网| 欧美日韩国产在线| 性爱午夜视频| 国产男女无套免费| 国产avwww| 日韩天堂网| 国产精品一区二区性色AV| 久久草草热国产精品| 91香蕉视频18| 91精品老司机| 中文√在线天堂8| 100国产精品人妻无码| 天码人妻一区二区三区在线看| 手机av免费| 国产成人精品在线| 婷婷午夜| 这里视频很精彩免费观看电视剧最新| 久操免费在线观看| 精品动漫3D一区二区三区免费版| 欧美日韩爱爱| 精精品人妻一区二区三区| 狼友在线视频| 亚洲av无码精品| 中文字幕日韩有码| 欧美AⅤ在线| 国产精品二区高清在线苍井空| 黃色一级A片一級片| 国产亚洲午夜久久久成人电影| 天天干网址| 中文字幕日韩AV| 成人欧美在线观看| 五月丁香大香蕉| 亚洲天堂自拍| 99久久精品一区二区成人| 99re在线精品| 欧美一级特黄AAAAAA片| 日韩欧美成人在线| 韩国无码视频| 特级西西444www高清大胆免费看 | 韩日av| 日韩免费中文字幕A片| 波多野结衣东京热| 日韩黄色电影网址| 99热er| 久久久久人妻| 按摩性高湖婬AAA片A片中国| 免费A片在线看| 永久免费无码中文字幕| 久久国产精品网站| 大鸡巴黄色视频免费观看| av影音先锋| 色色激情五月天| 日韩中文字幕在线观看视频| 嫩BBB嫩BBB嫩BBB| 久久日av| 蜜臀AV在线观看| 北条麻妃人妻中文字幕91影视| 91中文在线| 欧美熟妇精品一二三区| 国产精品男女| 成人无码免费看| 亚洲AV无码成人精品区欧洲| 嫩BBB嗓BBBB榛BBBB| 91久久精品一区二区三区| 日韩三级网| 操b视频在线观看| 超碰自拍| 天天干夜夜操| 中文在线免费看视频| 国产无码中文| 欧美不卡一区| 国产三级AV在线观看| 操BBB操BBB| 91精品国产aⅴ一区二区| 精品无码一区二区三| 婷婷天天干| 国内精品久久久久久久久久变脸 | 学生妹一级J人片内射视频| 国产日韩性爱视频| 另类TS人妖一区二区三区| 中文字幕在线国产| 一区二区三区视频免费| 国产51视频| 刘玥一级婬片A片AAA| www.91com| 中文字幕AV在线观看| 国产操女人| 国产欧美日韩在线播放| 色综合一区二区三区| 久久久一区二区三区| 麻豆视频在线播放| 成人福利午夜A片公司| 大地二中文在线观看免费鲁大师| 日本在线不卡一区| 97精品欧美91久久久久久久| 午夜操逼视频| 丁香婷婷五月综合影院| 欧洲AV在线| 精品99视频| 精品视频一区二区三区| 成人影片在线观看18| 在线亚洲色图| 国产无码高清视频| 国产伦子伦一级A片免费看老牛| 美女视频毛片| 亚洲免费成人| 成人日韩精品| 中文字幕人妻系列| 操逼导航| 大荫蒂精品另类| 亚洲成人一级片| 91蜜臀| 亚洲AV永久无码国产精品久久| 特级西西444www精品视频| 毛片网站在线观看| 东京热av一区二区| av天堂中文在线| 男女拍拍视频| 玖玖爱这里只有精品| 亚洲色一区二区| 日韩人妻无码一区二区三区七区 | 三级黄,色| 免费91视频| 日韩一级| 天天色粽合合合合合合合| 无码人妻精品一区二区三| 88海外华人免费一区| 午夜视频在线看| 岛国免费av| 精品乱子伦一区二区三区,亚洲国产成 | 北条麻妃在线视频| 大鸡巴久久| 青草成人在线| 婷婷天堂网| 午夜成人福利| 日韩一级片在线| 韩日精品视频| 天堂网中文在线| 日韩免费中文字幕| 九色PORNY国产成人蝌蚪| 超碰97人人爱| 人人澡人人干| 91插插插插| 日韩成人一区二区| 青青草资源站| 一级大片免费看| 啪啪免费网站| 日韩一区二区三区四区久久久精品有吗 | 精品国产偷拍| 操B网站| 亚洲另类图片小说| 日韩在观看线| 91大神精品| 亚洲制服在线观看| 五月六月丁香激情视频| 国产午夜视频在线| 欧美精品一二三| 大香蕉福利在线| a天堂8在线资源| 成人av小说网站| 久久成人无码| 亚洲一区av| 翔田千里在线观看| 99精品视频在线观看免费| 日本少妇中文字幕| 操逼电影网| 亚洲wwwwww| 偷拍二区| 看一级黄色毛片| 中文字幕在线中文| 91成人做爰A片| 狠狠色噜噜狠狠狠888米奇视频| 91偷拍视频| 97精品超碰一区二区三区| A片视频免费看| 内射学生妹J亅| 微拍福利一区| 欧美精品18videosex性欧美| 熟女综合| 手机看片福利一区二区| 91av免费在线观看| 亚洲日本黄色网址| 久草视频免费看| 啪啪啪网站| 日韩激情在线观看| www.天天干| 五月天婷婷影院影院| 日本不卡二区| 夜夜干天天操| 黄色片在线播放| 日韩最新高清无码| 免费在线观看a| 亚洲性爱大全| 中文日韩字幕| 国产欧美精品一区二区三区| 成人特级毛片| 亚洲中文AV在线| 狠狠撸在线观看| 日韩无码2024| 东京热视频网| 日逼免费| 精品小视频| 波多野结衣久久精品| 一级免费视频| 桃花岛tⅴ+亚洲品质| 午夜天堂精品久久| HEZ-502搭讪绝品人妻系列| A片在线免费播放| 18禁黄色免费网站| 操综合| 久久精品视频99| 国产一二三区在线| 人妻人人操人人爽| 91精品国产乱码久久久久| 少妇在线| 亚洲国产精品精JIZZ老师| 中文字幕中文字幕| 激情播播网| 91久久爽久久爽爽久久片| 黄色A片免费观看| 亚洲一级黄色片| 无码日韩人妻精品久久蜜桃| A一级黄色| 丁香五月天在线视频| 国产精品一区二区三区四区| 中文字幕黄色片| 欧美精品成人免费片| 久久久夜夜夜| 激情婷婷av| 久久99精品久久久水蜜桃| 青青草视频免费观看| 久久丝袜| 91麻豆视频在线观看| 五月丁香啪啪啪| 97天天干| 人人爽网站| 四川少妇BBBB槡BBBB槡| 老女人肏屄视频| 涩涩99| 色福利视频| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV| 美日韩免费视频| 天天夜夜狠狠| 加勒比色综合| 无码免费在线观看视频| 狠狠干狠狠操| 亚洲无码手机在线观看| 一区二区三区四区日韩| 亚洲骚逼| 中文字幕超清在线观看| 日韩字幕久久| 北条麻妃被躁57分钟视频在线| 天堂在线观看AV| www.人人操| 亚洲日韩一级| 毛片A级成人片| 欧美激情另类| 午夜日屄| 免费在线观看A片| 综合激情AV| 999成人电影| 免费观看操逼| 51一区二区三区| 99成人国产精品视频| 伊人成人在线视频观看| 欧美中文字幕| 中文有码视频| 女人BBBB| 天天综合久久| 91夜夜| 不卡AV在线播放| 加勒比综合| 三浦恵子一级婬片A片| 久久精品禁一区二区三区四区五区| 无码免费视频观看| 国产欧美综合三级伦| 手机AV在线| 大香蕉男人天堂| 久久久久无码精品国产91福利| 亚洲高清视频在线| 欧美91视频| 亚洲国产精品久久久久婷婷老年 | 亚洲人妻一区二区| 欧美五区| 在线视频中文字幕| 成人三级毛片| 中国操逼电影| 精品视频在线播放| 激情五月婷婷五月| 黃色毛片A片AAAA级20| 国产一级18片视频| 日本一区二区三区免费观看| 操逼地址| 亚洲成人无码在线| 久操成人| 狠狠艹狠狠干| 黄色毛片,男人天堂| 久久学生妹| 欧美成人精品A片免费一区99| 国产色av| 国产女人18毛片水18精品| 夜夜撸天天日| 中文字幕成人电影| 青娱乐av在线| 91嫖妓站街埯店老熟女| 91激情| 亚洲成人AV在线观看| 亚洲AV无码乱码国产精品黑人| 视频一视频二在线视频| 18国产免费视频在线观看| 日本黄色片视频| 在线成人小视频| 久久婷婷国产| 肏屄视频网站| 人人色人人草| 亚洲黄色AV| 欧美日本在线观看| A片啪啪| 日韩va亚洲va欧美va高清 | 99热99精品| AAA成人| 91精品国产综合久久久蜜臀图片| 婷婷天堂| 亚洲最大视频| 亚洲少妇人妻| 91爱看| 特级西西444WWW大精品视频 | 中文字幕精品在线视频| 97精产国品久久蜜桃臀| 日韩精品在线播放| 日韩无码免费播放| 国产高清无码一区| 毛片黄片| www.色老板| 亚洲乱| 激情五月天色色| 亚洲激情在线| 亚洲无码制服| 草草浮力院| 五月黄片| 日本高清色清di免费观看| 亚洲va国产天堂va久久en| 人人干天天操| 亚洲免费观看在线观看| 麻豆天美传媒AV果冻传媒| 国产永久免费| 超碰在线视| 屁屁影院CCYYCOM发布地| 中文字幕日本欧美| 91大片| 热久久9| 五月六月丁香| 久久99无码| 亚洲中文在线视频| 精品一区二区三区免费| 久久永久视频| 牛牛aV| 亚洲成人大香蕉视频| 久久黄网| 欧美日韩东京热| 国产精品毛片视频| 国产噜噜噜噜噜久久久久久久久| 韩日美女性爱| 97人妻无码一区二区| 久久蝌蚪窝| 黄色国产网站| 老女人操屄| 亚洲天堂AB| 操b在线| 2025av天堂网| 激情综合视频| 国产免费AV片在线无码| 色999在线播放视频| 色猫av| 人妻熟妇乱子伦精品无码专区毛片 | 一级黄色在线观看| 欧美一区二区三区视频| 一级黄色免费电影| 国产丝袜在线视频| 风间由美大荫蒂无码AV| 3DAV一区二区三区动漫| 黄网站在线观看| 成人黄片18| 国产无码播放| 男女av免费| 久久久久久久久久久久高清毛片一级 | 国内操B电影| 九九热精品在线视频| 黄片午夜| 9l视频自拍蝌蚪9l成人| 欧美一级免费A片| 欧美日韩加勒比| 芳芳的骚逼| 操逼综合| 久久93| 日本国产在线观看| 嫩小槡BBBB槡BBBB槡免费-百度 | 特级西西444WWW大精品视频 | 久久成人导航| AA丁香综合激情| 黄色香蕉视频| 午夜无码久久| 无套内射在线免费观看| 欧美日韩在线免费观看| 污网址| 婷婷色在线视频| 亚洲女人视频| 超碰人人操97| 十八无码成人免费网站| 免费黄色Av| 视色视频在线观看| 黄色A级片| A片在线免费看| 国产第一夜| 久久视频免费在线观看| 久久久老熟女一区二区三区91| 91色视频在线观看| 操逼无码| 日本无码嫩草一区二区| 99热在线看| 黄片免费看视频| 熟女综合| 精品无码人妻一区二区媚黑| 欧美天天撸| AV国产精品| 中文字幕无码精品| 欧美不卡在线视频| 91九色丨国产丨爆乳| 蜜柚AV| av无码网站| 日产无码久久久久久| 高清无码中文字幕在线观看| 中文字幕在线不卡视频| 欧美日韩在线视频免费| 国语一区| 人人干天天操| 伊人色色色| 天天日夜夜撸| 精品国产免费观看久久久_久久天天| 大鸡吧在线| 无码人妻一区二区| 九九色影院| 青青草原在线| AV免费在线播放| 国产Aⅴ| 999大香蕉| 插插插菊花综合网| 亚洲高清无码网站| 日韩在线观看网址| 久久福利视频导航| 青春草在线视频免费观看| 久久六六| 亚洲视频入口| 一道本无码免费视频| 丁香四月婷婷| 成人aV免费观看| 一区二区三区精品| 无码成人AV在线看免费| 婷婷日韩| 亚洲中文字幕网| 久久美女视频| AV无码网站| av资源在线播放| 色色色777| 337p西西人体大胆瓣开下部 | AV在线小说| 成人黄网在线观看| 国产人妻人伦精品一区| 中日美朝美女一级片免费看 | 国内自拍网站| 天天夜夜狠狠| 草av| 人人艹人人艹| 三级高清无码视频| 久操手机在线| 色图插插插| 国产一毛a一毛a在线观看| 女同三区| 爱插美女网| 中文字幕免| 国产欧美激情| 欧美日韩一区二区三区在线电影| 一级黄片学生妹| 黄色3A片在线观看| 美国操逼片| 健身房被教练3p喷水了| 鸭子AV| 欧美性猛交一区二区三区精品| 国产牛牛在线| 国产精品乱码毛片在线人与| 草逼美女| 欧美不卡在线视频| A片在线免费播放| 国内综合久久| 亚洲美女网站在线观看| 精品视频久| 九九热精品视频99| 西西西444www无码视频| 久久日韩无码| 热久久在线| 精品吃奶一区二区三区视频| 天堂成人网站| 嘿嘿午夜影院| 天天视频入口| 操BBB操BBB| 亚洲人免费视频| 奇米色网| 成年人免费视频在线观看| 三级片网站在线观看| 91亚洲综合| AV午夜| 草B视频| 国产在线拍偷自揄拍无码一区二区| 天天综合网久久综合网| 四川少扫搡BBBBB搡B| 一区二区视频在线观看| 操人人| 壹屌探花| 嫩草视频在线观看| 8050午夜| 操逼三级视频| 久草一区二区三区| 三级黄色小视频| 久久九九视频| 操人在线观看| 国产在线拍揄自揄拍无码男男| 成人免费视频一区二区三区| 18啪啪网站| 国产A片网站| 午夜蜜桃| 伊人久久中文字幕| 一级欧美日韩| 青青草成人网| 影音先锋亚洲无码| 91在线视频| 四虎影院中文字幕| 中国毛片网站| 中日韩黄色视频| 色综合色综合色综合| 亚洲成人不卡| 亚洲无码AV片| 久久久久久久久国产精品| 黑人人妻黑人ThePorn| 超碰操逼| 波多野结衣成人视频| 亚洲中文字幕av| 国产欧美激情| 午夜老湿机| 日韩人妻久久| av无码精品一区| 超碰免费91| www四虎com| 91香蕉在线观看| 日韩在线中文| 国产精品不卡| 国产手机AV在线| 国产精品久久免费视频| 精品国产AV无码一区二区三区| 欧美插菊花综合网| 亚洲第一视频在线观看| 熟女嗷嗷叫高潮合集91| 亚洲人妻无码在线| 国产高清无码免费| 亚洲天堂网站| 青娱乐亚洲精品视频| 霸道总裁雷总各种姿势白浆爱情岛论坛 | 91九色口爆吞精| 日韩无码中文字幕| 最新国产毛片| 精品中文字幕视频| 国产乱论视频| 小h片| 午夜福利在线视频| 亚洲va国产va天堂va久久| 亚洲高清中文字幕| 最新久欠一区二区免费看| 大BBBw大BBBW另类| 国产亚洲精品午夜福利巨大软件| 欧美黄色片网站| 亚洲午夜久久久久久久久红桃| AV在线无码| 午夜婷婷| 強暴人妻一区二区三区| 欧美色图狠狠干| 亚洲一卡二卡三卡四卡免| 俺去俺来WWW色官方| 99热国产免费| 无码电影网| 亚洲高清无码久久| 免费观看成人毛片A片直播千姿| 午夜成人网站在线观看| 亚州操逼片| 伊人激情五月天| 亚洲av电影在线观看| 久草一区二区三区| 亚洲电影免费观看| 婷婷综合一区| 欧美性受XXXX黑人XYX性爽冫 | 一级无码高清| 一区二区三区亚洲| a亚洲天堂| 午夜精品久久久久久久99热精东| AV无码一区二区三区| 青青操逼网| 四川少扫搡BBw搡BBBB| 久草视频在线播放| 大香蕉在线99| 特级西西西88大胆无码| 热久久这里只有精品| 日本一区二区三区在线视频| 久久三级| 无码精品人妻一区二区欧美| 免费看黄色AV| 亚洲欧美成人在线观看| 国内成人精品| 无码国产精品一区二区| 亚洲欧美激情小说另类| 国产乱伦内射视频| 亚洲激情视频在线观看| 一级黄色电影网站| 中文字幕乱码免费综合久久| 欧洲AV片| 性中国熟妇| 欧美成人三级在线观看| 天天日天天草| 一道本视频在线免费观看| 色欲色欲一区二区三区| av无码免费在线观看| 日韩免费高清| 成人无码三级| 男女视频91| 亚洲一级a片| 一区二区三区四区日韩| 台湾无码| 欧美性爱一区二区三区| 插菊花综合网站| 日韩三级在线播放| 91av在线观看视频| 亚洲在线无码| 2014AV天堂网| 国产黄网| YOUjiZZ欧美大全| 亚洲黄色免费观看| 加勒比精品在线| 欧美性爱在线观看| 激情婷婷亚洲| 182在线视频| 中文字幕无码高清| 91青青草| 黑人在线播放| 亚洲无码91| 欧美精品在线播放| 菊花综合网| 国产小视频在线免费观看| www一级片| 天天日综合| AV在线小说| www俺来也com| 亚洲精品乱码久久久久久蜜桃91| 色情一级A片成人片| 午夜亚洲视频| 亚州操逼片| 久久久9999| 免费看特别黄色视频| 人与禽一级A片一区二区三区| www.777av| 人人操人人色| 欧美日韩一级二级三级| 久久久精品午夜人成欧洲亚洲韩国| 国产一级特黄A片| 成人免费内射视频| 女人18片毛片90分钟免费明星| 中文字幕观看在线| 蜜桃在线视频| 蜜桃精品一区二区| 无套免费视频欧美| 婷婷在线播放| 国产欧美第一页| 超碰人人操在线| 亚洲无码在线播放| 水蜜桃视频网站在线观看| 特一级黄色视频| 亚洲狼人综合| 手机AV网站| 亚洲无码视频在线免费观看| 一级A片免费视频| 日本三级片在线| 欧美污视频在线观看| 九色PORNY蝌蚪视频| 国产高清自拍| 久久久久久久久黄色| 另类老太婆性BBWBBw| 黄色一级大片| 91乱了伦国产乱子伦| 一级黄色毛片视频| 高清无码毛片| 五月天久久久久久久| 一级一A片一a免费看| AA片在线观看视频在线播放| 四川性BBB搡BBB爽爽爽小说| 欧美国产日韩在线观看| 五月丁香啪| 91麻豆电影| 国产在线无码观看| 国产高清自拍| 久草大香蕉视频| 91亚洲国产AⅤ精品一区二区| 女侠吕四娘第二部| 91高清无码视频| 中文国产字幕| 女人自慰网站在线观看| 日韩精品成人av| 国产www在线观看| 91亚洲在线观看| 亚洲精品国偷拍自产在线观看蜜桃 | 中国美女一级黄片| 蜜桃av秘无码一区二区三欧| 久久久久久久久久久久久自慰小片| 女生自慰网站免费| 国产乱国产乱300精品| 国产18女人水真多免费看| 亚洲插菊花综合网| 一起操在线观看| 综合天堂| 91人妻人人澡人人爽人人精| 亚洲成人精品少妇| 国产高潮又爽又无遮挡又免费| av天堂亚洲| 91一区二区在线观看| 亚州一区|