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

您的位置:首頁技術(shù)文章
文章詳情頁

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

瀏覽:5日期:2023-05-14 15:15:06

如今,互聯(lián)網(wǎng)項(xiàng)目對于安全的要求越來越嚴(yán)格,這就是對后端開發(fā)提出了更多的要求,目前比較成熟的幾種大家比較熟悉的模式,像RBAC 基于角色權(quán)限的驗(yàn)證,shiro框架專門用于處理權(quán)限方面的,另一個(gè)比較流行的后端框架是Spring-Security,該框架提供了一整套比較成熟,也很完整的機(jī)制用于處理各類場景下的可以基于權(quán)限,資源路徑,以及授權(quán)方面的解決方案,部分模塊支持定制化,而且在和oauth2.0進(jìn)行了很好的無縫連接,在移動互聯(lián)網(wǎng)的授權(quán)認(rèn)證方面有很強(qiáng)的優(yōu)勢,具體的使用大家可以結(jié)合自己的業(yè)務(wù)場景進(jìn)行選取和使用

下面來說說關(guān)于單點(diǎn)登錄中目前比較流行的一種使用方式,就是springsecurity+jwt實(shí)現(xiàn)無狀態(tài)下用戶登錄;

JWT

在之前的篇章中大致提到過,使用jwt在分布式項(xiàng)目中進(jìn)行用戶信息的認(rèn)證很方便,各個(gè)模塊只需要知道配置的秘鑰,就可以解密token中用戶的基本信息,完成認(rèn)證,很方便,關(guān)于使用jwt的基本內(nèi)容可以查閱相關(guān)資料,或者參考我之前的一篇;

整理一下思路

1、搭建springboot工程2、導(dǎo)入springSecurity跟jwt的依賴3、用戶的實(shí)體類,dao層,service層(真正開發(fā)時(shí)再寫,這里就直接調(diào)用dao層操作數(shù)據(jù)庫)4、實(shí)現(xiàn)UserDetailsService接口5、實(shí)現(xiàn)UserDetails接口6、驗(yàn)證用戶登錄信息的攔截器7、驗(yàn)證用戶權(quán)限的攔截器8、springSecurity配置9、認(rèn)證的Controller以及測試的controller

項(xiàng)目結(jié)構(gòu)

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

pom文件

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2 --><dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId><version>2.3.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-jwt --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-jwt</artifactId><version>1.0.10.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.security.oauth.boot/spring-security-oauth2-autoconfigure --><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-autoconfigure</artifactId><version>2.1.4.RELEASE</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- mybatis依賴 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- redis依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>

application.properties

server.port=8091#數(shù)據(jù)庫連接spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=truespring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.username=rootspring.datasource.password=root#mybatis配置mybatis.type-aliases-package=com.congge.entitymybatis.mapper-locations=classpath:mybatis/*.xml#redis配置spring.session.store-type=redisspring.redis.database=0spring,redis.host=127.0.0.1spring.redis.port=6379spring.redis.pool.min-idle=10000spring.redis.timeout=30000

為模擬用戶登錄,這里提前創(chuàng)建了一個(gè)測試使用的表,user

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

實(shí)體類User

public class User { private Integer id; private String username; private String password; private String role; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } @Override public String toString() { return 'User{' +'id=' + id +', username=’' + username + ’’’ +', password=’' + password + ’’’ +', role=’' + role + ’’’ +’}’; }}

Jwt工具類,用于管理token相關(guān)的操作,可以單測使用

public class TestJwtUtils {public static final String TOKEN_HEADER = 'Authorization'; public static final String TOKEN_PREFIX = 'Bearer ';public static final String SUBJECT = 'congge';public static final long EXPIRITION = 1000 * 24 * 60 * 60 * 7;public static final String APPSECRET_KEY = 'congge_secret'; private static final String ROLE_CLAIMS = 'rol'; public static String generateJsonWebToken(Users user) {if (user.getId() == null || user.getUserName() == null || user.getFaceImage() == null) {return null;}Map<String,Object> map = new HashMap<>();map.put(ROLE_CLAIMS, 'rol');String token = Jwts.builder().setSubject(SUBJECT).setClaims(map).claim('id', user.getId()).claim('name', user.getUserName()).claim('img', user.getFaceImage()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)).signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact();return token;}/** * 生成token * @param username * @param role * @return */public static String createToken(String username,String role) {Map<String,Object> map = new HashMap<>();map.put(ROLE_CLAIMS, role);String token = Jwts.builder().setSubject(username).setClaims(map).claim('username',username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRITION)).signWith(SignatureAlgorithm.HS256, APPSECRET_KEY).compact();return token;}public static Claims checkJWT(String token) {try {final Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody();return claims;} catch (Exception e) {e.printStackTrace();return null;}}/** * 獲取用戶名 * @param token * @return */public static String getUsername(String token){ Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims.get('username').toString(); }/** * 獲取用戶角色 * @param token * @return */ public static String getUserRole(String token){ Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims.get('rol').toString(); } /** * 是否過期 * @param token * @return */ public static boolean isExpiration(String token){ Claims claims = Jwts.parser().setSigningKey(APPSECRET_KEY).parseClaimsJws(token).getBody(); return claims.getExpiration().before(new Date()); }public static void main(String[] args) {String name = 'acong';String role = 'rol';String token = createToken(name,role);System.out.println(token);Claims claims = checkJWT(token);System.out.println(claims.get('username'));System.out.println(getUsername(token));System.out.println(getUserRole(token));System.out.println(isExpiration(token));}/** * eyJhbGciOiJIUzI1NiJ9. * eyJzdWIiOiJjb25nZ2UiLCJpZCI6IjExMDExIiwibmFtZSI6Im51b3dlaXNpa2kiLCJpbWciOiJ3d3cudW9rby5jb20vMS5wbmciLCJpYXQiOjE1NTQ5OTI1NzksImV4cCI6MTU1NTU5NzM3OX0. * 6DJ9En-UBcTiMRldZeevJq3e1NxJgOWryUyim4_-tEE * * @param args *//*public static void main(String[] args) {Users user = new Users();user.setId('11011');user.setUserName('nuoweisiki');user.setFaceImage('www.uoko.com/1.png');String token = generateJsonWebToken(user);System.out.println(token);Claims claims = checkJWT(token);if (claims != null) {String id = claims.get('id').toString();String name = claims.get('name').toString();String img = claims.get('img').toString();String rol = claims.get('rol').toString();System.out.println('id:' + id);System.out.println('name:' + name);System.out.println('img:' + img);System.out.println('rol:' + rol);}}*/}

操作數(shù)據(jù)庫的類

,這里主要是提供用戶注冊的一個(gè)save用戶的方法,

@Servicepublic class UserService {@Autowiredprivate UserDao userDao;public void save(User user) {user.setId(1);userDao.save(user);}}

JwtUser

該類封裝登錄用戶相關(guān)信息,例如用戶名,密碼,權(quán)限集合等,需要實(shí)現(xiàn)UserDetails 接口,

public class JwtUser implements UserDetails { private Integer id; private String username; private String password; private Collection<? extends GrantedAuthority> authorities; public JwtUser() { } // 寫一個(gè)能直接使用user創(chuàng)建jwtUser的構(gòu)造器 public JwtUser(User user) { id = user.getId(); username = user.getUsername(); password = user.getPassword(); authorities = Collections.singleton(new SimpleGrantedAuthority(user.getRole())); } public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; } public String getPassword() { return password; } public String getUsername() { return username; } public boolean isAccountNonExpired() { return true; } public boolean isAccountNonLocked() { return true; } public boolean isCredentialsNonExpired() { return true; } public boolean isEnabled() { return true; } @Override public String toString() { return 'JwtUser{' +'id=' + id +', username=’' + username + ’’’ +', password=’' + password + ’’’ +', authorities=' + authorities +’}’; }}

配置攔截器

JWTAuthenticationFilter

JWTAuthenticationFilter繼承于UsernamePasswordAuthenticationFilter該攔截器用于獲取用戶登錄的信息,只需創(chuàng)建一個(gè)token并調(diào)用authenticationManager.authenticate()讓spring-security去進(jìn)行驗(yàn)證就可以了,不用自己查數(shù)據(jù)庫再對比密碼了,這一步交給spring去操作。 這個(gè)操作有點(diǎn)像是shiro的subject.login(new UsernamePasswordToken()),驗(yàn)證的事情交給框架。

/** * 驗(yàn)證用戶名密碼正確后,生成一個(gè)token,并將token返回給客戶端 * 該類繼承自UsernamePasswordAuthenticationFilter,重寫了其中的2個(gè)方法 , * attemptAuthentication:接收并解析用戶憑證。 * successfulAuthentication:用戶成功登錄后,這個(gè)方法會被調(diào)用,我們在這個(gè)方法里生成token并返回。 */public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private AuthenticationManager authenticationManager; public JWTAuthenticationFilter(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; super.setFilterProcessesUrl('/auth/login'); } @Override public Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException { // 從輸入流中獲取到登錄的信息 try { LoginUser loginUser = new ObjectMapper().readValue(request.getInputStream(), LoginUser.class); return authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginUser.getUsername(), loginUser.getPassword()) ); } catch (IOException e) { e.printStackTrace(); return null; } } // 成功驗(yàn)證后調(diào)用的方法 // 如果驗(yàn)證成功,就生成token并返回 @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { JwtUser jwtUser = (JwtUser) authResult.getPrincipal(); System.out.println('jwtUser:' + jwtUser.toString()); String role = ''; Collection<? extends GrantedAuthority> authorities = jwtUser.getAuthorities(); for (GrantedAuthority authority : authorities){ role = authority.getAuthority(); } String token = TestJwtUtils.createToken(jwtUser.getUsername(), role); //String token = JwtTokenUtils.createToken(jwtUser.getUsername(), false); // 返回創(chuàng)建成功的token // 但是這里創(chuàng)建的token只是單純的token // 按照jwt的規(guī)定,最后請求的時(shí)候應(yīng)該是 `Bearer token` response.setCharacterEncoding('UTF-8'); response.setContentType('application/json; charset=utf-8'); String tokenStr = JwtTokenUtils.TOKEN_PREFIX + token; response.setHeader('token',tokenStr); } @Override protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException { response.getWriter().write('authentication failed, reason: ' + failed.getMessage()); }}

JWTAuthorizationFilter

驗(yàn)證成功當(dāng)然就是進(jìn)行鑒權(quán)了,每一次需要權(quán)限的請求都需要檢查該用戶是否有該權(quán)限去操作該資源,當(dāng)然這也是框架幫我們做的,那么我們需要做什么呢?很簡單,只要告訴spring-security該用戶是否已登錄,是什么角色,擁有什么權(quán)限就可以了。JWTAuthenticationFilter繼承于BasicAuthenticationFilter,至于為什么要繼承這個(gè)我也不太清楚了,這個(gè)我也是網(wǎng)上看到的其中一種實(shí)現(xiàn),實(shí)在springSecurity苦手,不過我覺得不繼承這個(gè)也沒事呢(實(shí)現(xiàn)以下filter接口或者繼承其他filter實(shí)現(xiàn)子類也可以吧)只要確保過濾器的順序,JWTAuthorizationFilter在JWTAuthenticationFilter后面就沒問題了。

/** * 驗(yàn)證成功當(dāng)然就是進(jìn)行鑒權(quán)了 * 登錄成功之后走此類進(jìn)行鑒權(quán)操作 */public class JWTAuthorizationFilter extends BasicAuthenticationFilter { public JWTAuthorizationFilter(AuthenticationManager authenticationManager) { super(authenticationManager); } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { String tokenHeader = request.getHeader(TestJwtUtils.TOKEN_HEADER); // 如果請求頭中沒有Authorization信息則直接放行了 if (tokenHeader == null || !tokenHeader.startsWith(TestJwtUtils.TOKEN_PREFIX)) { chain.doFilter(request, response); return; } // 如果請求頭中有token,則進(jìn)行解析,并且設(shè)置認(rèn)證信息 SecurityContextHolder.getContext().setAuthentication(getAuthentication(tokenHeader)); super.doFilterInternal(request, response, chain); } // 這里從token中獲取用戶信息并新建一個(gè)token private UsernamePasswordAuthenticationToken getAuthentication(String tokenHeader) { String token = tokenHeader.replace(TestJwtUtils.TOKEN_PREFIX, ''); String username = TestJwtUtils.getUsername(token); String role = TestJwtUtils.getUserRole(token); if (username != null){ return new UsernamePasswordAuthenticationToken(username, null, Collections.singleton(new SimpleGrantedAuthority(role)) ); } return null; }}

配置SpringSecurity

到這里基本操作都寫好啦,現(xiàn)在就需要我們將這些辛苦寫好的“組件”組合到一起發(fā)揮作用了,那就需要配置了。需要開啟一下注解@EnableWebSecurity然后再繼承一下WebSecurityConfigurerAdapter就可以啦,

@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired @Qualifier('userDetailsServiceImpl') private UserDetailsService userDetailsService; @Bean public BCryptPasswordEncoder bCryptPasswordEncoder(){ return new BCryptPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable().authorizeRequests()// 測試用資源,需要驗(yàn)證了的用戶才能訪問.antMatchers('/tasks/**').authenticated().antMatchers(HttpMethod.DELETE, '/tasks/**').hasRole('ADMIN')// 其他都放行了.anyRequest().permitAll().and().addFilter(new JWTAuthenticationFilter(authenticationManager())).addFilter(new JWTAuthorizationFilter(authenticationManager()))// 不需要session.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().exceptionHandling().authenticationEntryPoint(new JWTAuthenticationEntryPoint()); } @Bean CorsConfigurationSource corsConfigurationSource() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration('/**', new CorsConfiguration().applyPermitDefaultValues()); return source; }}

AuthController

測試類,模擬用戶注冊,

@RestController@RequestMapping('/auth')public class AuthController { @Autowired private UserService userService; @Autowired private BCryptPasswordEncoder bCryptPasswordEncoder; @PostMapping('/register') public String registerUser(@RequestBody Map<String,String> registerUser){ User user = new User(); user.setUsername(registerUser.get('username')); user.setPassword(bCryptPasswordEncoder.encode(registerUser.get('password'))); user.setRole('ROLE_USER'); userService.save(user); return 'success'; }}

注冊是有了,那登錄在哪呢?我們看一下UsernamePasswordAuthenticationFilter的源代碼

public UsernamePasswordAuthenticationFilter() { super(new AntPathRequestMatcher('/login', 'POST')); }

可以看出來默認(rèn)是/login,所以登錄直接使用這個(gè)路徑就可以啦~當(dāng)然也可以自定義只需要在JWTAuthenticationFilter的構(gòu)造方法中加入下面那一句話就可以啦

public JWTAuthenticationFilter(AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; super.setFilterProcessesUrl('/auth/login'); }

所以現(xiàn)在認(rèn)證的路徑統(tǒng)一了一下也是挺好的~看起來相當(dāng)舒服了注冊:/auth/register登錄:/auth/login

TaskController

提供一個(gè)外部訪問的API資源接口,即用戶要訪問該類下面的接口必須要先通過認(rèn)證,后面的測試中也可以看出來,直接貼代碼,

@RequestMapping('/tasks')public class TaskController { @GetMapping('/getTasks') @ResponseBody public String listTasks(){ return '任務(wù)列表'; } @PostMapping @PreAuthorize('hasRole(’ADMIN’)') public String newTasks(){ return '創(chuàng)建了一個(gè)新的任務(wù)'; } }

下面我們來測試一下,為了模擬效果比較直觀點(diǎn),我們使用postMan進(jìn)行測試,

1、首先,我們調(diào)用注冊的方法注冊一個(gè)用戶,

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

注冊成功之后,我們看到數(shù)據(jù)庫已經(jīng)有了一個(gè)用戶,

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

2、使用該用戶進(jìn)行登錄,我們希望的是登錄成功之后,后臺生成一個(gè)token并返回給前端,這樣后面的接口調(diào)用中直接帶上這個(gè)token即可,

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

可以看到登錄成功,后臺反返回了token,下面我們使用這個(gè)token請求其他的接口,測試一下getTasks這個(gè)接口,注意需要在postMan的請求header里面帶上token信息,這里是全部的token,即包含Bearer 的整個(gè)字符串,

Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例

這時(shí)候,成功請求到了接口的數(shù)據(jù),大家可以測試一下將過期時(shí)間調(diào)整的短一點(diǎn),然后再去請求看看會有什么樣的效果,這里就不做演示了。

本篇到這里基本就結(jié)束了,關(guān)于springsecurity其實(shí)內(nèi)容還是很多的,里面的用法也比較復(fù)雜,大家抽空可以做深入的研究,篇幅原因不做過多介紹了。最后感謝觀看。

附上源碼地址:boot-ssoserver_jb51.rar

到此這篇關(guān)于Springboot+SpringSecurity+JWT實(shí)現(xiàn)用戶登錄和權(quán)限認(rèn)證示例的文章就介紹到這了,更多相關(guān)Springboot SpringSecurity JWT內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 操人网 | 免费黄色在线观看 | 午夜视频在线观看免费视频 | www国产亚洲精品久久网站 | 国产精品亚洲综合 | 日本亚洲精品一区二区三区 | 久久免费国产精品 | 一级欧美一级日韩 | 日韩国产一区二区 | www.久久久| 久久精品色欧美aⅴ一区二区 | 亚洲1区2区在线 | 欧美精品一二三 | 无码少妇一区二区三区 | 欧美日韩国产一区二区三区不卡 | 亚洲成人av | 中文字幕一区二区三区乱码在线 | 日韩精品一区二区三区 | 欧美黄色精品 | 日韩中文字幕在线看 | www.黄网| 日本全黄裸体片 | 国产一区二区在线免费观看 | 福利视频网址导航 | 超碰天天 | 91精品国产综合久久国产大片 | 国产成人在线视频 | 国产精品影院在线观看 | 999成人网 | 成人高清视频在线 | 久久久久综合狠狠综合日本高清 | 日韩一区高清视频 | 四虎欧美 | 精品在线不卡 | 亚洲成av| 一区二区三区视频免费 | 亚洲一区二区在线 | 日韩成人精品在线观看 | www.久久伊人 | 国产高清视频在线 | 欧美日韩综合精品 | 成人欧美一区二区三区在线播放 | av免费观看网站 | 亚洲aⅴ天堂av在线电影软件 | 国产99精品 | 九色在线 | 国产成人av一区二区 | 亚洲精品免费在线观看 | 亚洲国产成人久久一区二区三区 | 国产欧美一区二区三区在线看 | 国产精品久久久久久久久福交 | 毛片免费观看网址 | 91视频精选 | 天天拍天天草 | 欧美激情精品久久久久久 | 最新免费av网站 | 国产精品久久 | 亚洲欧洲精品视频在线观看 | 欧美日韩不卡在线 | 国产福利在线免费 | www.久久久久 | 欧美一区二区在线视频 | 欧美日韩在线不卡 | 国产精品久久久久久久久久久久久 | 日韩素人在线 | 自拍视频在线观看免费 | 美女精品视频 | 精品久久久久久久 | 亚洲免费在线观看 | 国产成人高清精品免费5388 | 日韩1区 | 天天精品在线 | 亚洲精品免费视频 | 久久国产欧美日韩精品 | 国产精品久久久久久久久久99 | 精品96久久久久久中文字幕无 | 欧洲一级毛片 | 国产精品久久久久久久久久久免费看 | 日韩在线中文字幕 | 成人在线影视 | 日韩日韩日韩日韩日韩日韩 | 日韩一区二区三区在线观看 | 少妇久久久 | 欧美精品亚洲精品 | 啪啪tv网站免费入口 | 日韩一及片 | 欧美另类亚洲 | 久一久久 | 国产日韩精品一区二区 | 9l蝌蚪porny中文自拍 | 亚洲在线一区二区 | 久热中文字幕 | 亚洲精彩视频在线观看 | 久久精品亚洲精品国产欧美 | 久草高清 | 午夜精品久久久久久久99黑人 | 国产欧美一区二区三区在线看 | 一区在线播放 | 亚洲高清免费视频 | 涩涩视频在线看 | 国产精品久久久久久久久久大牛 | 色综合久久天天综合网 | 国产专区一区 | 黑人巨大精品欧美一区二区三区 | 国产精品中文字幕在线 | 国产欧美综合在线 | 免费观看的av | 草草视频在线免费观看 | 国产精品国产三级国产aⅴ入口 | 久久天堂热 | 成人在线免费视频 | 久久影院一区 | 国产精品不卡视频 | 亚洲精品一区在线观看 | 国产伦精品一区二区 | 欧美视频免费 | 亚洲精品一区二区三区 | 白浆视频在线观看 | 成人伊人 | 伊人伊人| 国产成人精品免费 | 亚洲综合色自拍一区 | 91国内外精品自在线播放 | 成人精品视频一区二区三区 | 久久久久国产精品午夜一区 | 日韩欧美视频 | 来个毛片 | 色婷婷久久久久swag精品 | 成人免费网站视频 | 亚洲一区二区三区 | 一区久久| 亚洲一区二区三区免费视频 | 操人网 | 一级片国产 | 男女做爰高清无遮挡免费视频 | 欧美一区二区三区男人的天堂 | 欧美一区二区免费 | 日本精品一区二区在线观看 | 亚洲视频精品一区 | 亚洲成av人片在线观看 | 欧美综合在线观看 | 久久99热精品免费观看牛牛 | 日操视频| 国产区在线 | 美女一区 | 亚洲免费在线视频 | 成人av网站在线观看 | 亚洲三区在线观看 | 在线免费看黄视频 | 国产精品久久久久久久久久久久久久 | 久久久.com | www.com久久 | 两性午夜视频 | 国产福利视频在线观看 | 成人a毛片| 在线视频一二区 | 久久精品这里热有精品 | www.99re| 亚洲欧美日韩电影 | 一级特黄毛片 | 99精品欧美一区二区三区综合在线 | 中文字幕一区二区三区免费视频 | 午夜精品久久久 | 久久蜜桃av| 日日操夜夜操免费视频 | 成人精品电影 | 亚洲精品电影在线一区 | 欧美精品亚洲精品 | 中文字幕久久久 | 亚洲国产精品一区二区久久 | 中文字幕免费看 | 中文字幕高清一区 | 免费成人在线观看视频 | 亚洲精品视频在线观看免费 | 午夜精 | 久久久久久中文字幕 | 欧美乱码久久久久久蜜桃 | 麻豆久久久久久 | 欧美一级免费播放 | 久久加勒比 | 高清久久 | youjizz欧美 | 国产成人视屏 | 99在线观看| 在线观看国产日韩欧美 | 精品综合 | 国产精品美女www爽爽爽软件 | gav成人免费播放视频 | 成人日批 | 国产毛片在线 | 久久久国产精品视频 | 久久精品在线视频 | 在线日韩欧美 | 国产精品中文字幕在线播放 | 国产免费一区 | 久久国内精品 | 国产成人精品午夜视频免费 | 在线观看欧美一区二区三区 | 四虎884a | 国产男人天堂 | 中文字幕av在线播放 | 国产成人精品免高潮在线观看 | 亚洲一区二区三区在线观看免费 | 午夜私人影院在线观看 | 国产精品久久久久久久久久妇女 | 国产精品成人观看视频国产奇米 | 亚洲欧美另类在线 | 日韩在线视频资源 | 日韩欧美国产一区二区三区 | 草久在线观看 | 91免费在线播放 | www.中文字幕| 日韩一区不卡 | 国产精品久久久久久久久动漫 | 国产精品天天干 | aaa级片| 色精品 | 婷婷色国产偷v国产偷v小说 | 亚洲综合婷婷 | 黄色片网站视频 | 久久久国产一区二区三区 | 欧美亚洲一区二区三区 | 久久高清亚洲 | 免费一二区 | 国产成人精品一区二区三区网站观看 | 色一色视频 | 97在线视频免费 | 亚洲免费一区 | 欧美1区| 国产精品影视 | www.一区二区| 亚洲精品视频一区二区三区 | 国精品一区二区三区 | 久久午夜视频 | 精品二三区 | 狠狠色狠狠色合久久伊人 | av福利在线观看 | 激情网在线观看 | 国产精品毛片久久久久久 | 亚洲色图综合 | www.狠狠干| 成人av在线网 | 欧美日韩中文国产一区发布 | 亚洲精品乱码久久久久久蜜桃91 | 欧洲精品在线观看 | 欧美视频免费在线 | 91天堂在线观看 | 国产视频亚洲 | 一级片av | 伊人激情综合网 | 日韩av一区二区在线观看 | 日本在线看| 成人精品视频在线观看 | 成av在线| 最新黄色网页 | 伊人久麻豆社区 | 激情欧美一区二区 | 成人影院www在线观看 | 日本一区二区高清不卡 | 午夜视频在线免费观看 | 99久久久久国产精品免费 | 欧美日在线 | 99国产精品99久久久久久 | 精品亚洲一区二区三区四区五区 | 国产精品日韩 | 成人免费一区二区三区视频软件 | 97人人草| 久久久久久国产精品 | 亚洲三级网站 | 日韩特黄一级欧美毛片特黄 | 天堂动漫| 成视频年人免费看黄网站 | 免费观看视频www | 欧美午夜精品久久久久免费视 | 亚洲精品国产9999久久久久 | 久久久天堂国产精品女人 | 成人在线看片网站 | 欧美日韩在线二区 | 欧美性猛交一区二区三区精品 | 久久久国色 | sis001亚洲原创区 | 成人久久久 | 亚洲国产精品成人无久久精品 | 在线观看a视频 | 成人在线视频播放 | 五月天婷婷社区 | 夜夜爽99久久国产综合精品女不卡 | 天天曰| 一区二区三区精品视频免费看 | 免费观看成人性生生活片 | 久久久天天 | 国产 欧美 日韩 一区 | 亚洲激情 欧美 | 狠狠爱网站 | 在线播放国产一区二区三区 | 国产乱码精品一区二区三区忘忧草 | 狼人狠狠干| 亚洲人成人一区二区在线观看 | 亚洲成av| 亚洲在线免费观看 | 久久久国产精品x99av | 成人中文视频 | 99视频在线 | 亚洲综合无码一区二区 | 成人不卡视频 | 自拍在线| 午夜国产精品视频 | 中文字幕日韩欧美 | 热久久这里只有精品 | 999精品免费 | 久久久婷| 国产一区二区三区在线看 | 老黄网站在线观看 | 国产一区二区三区在线免费观看 | 毛片a在线 | 久久久久av | av免费在线观看网站 | 在线视频成人 | 一区二区免费在线观看 | 欧美一级片免费在线观看 | 国产精品久久久久久久 | 国产一区二区精品久久岳 | 国产精品视频一区二区三区四蜜臂 | www欧美| 1级毛片 | 成人在线观看av | 成人h视频在线观看 | 在线日韩视频 | 亚洲精品一区二区三区 | 91精品国产综合久久国产大片 | 一区二区在线看 | 亚洲视频免费网站 | 日韩在线电影 | 97国产一区二区精品久久呦 | 日韩乱码中文字幕 | 午夜三区 | av超碰在线 | 欧美日韩中文字幕 | 欧美日韩在线一区 | 少妇一级淫片免费放 | 久久国产成人 | 欧美夜夜爽| 日韩欧美中文字幕在线视频 | 欧美一级二级视频 | 欧美一区二区精品 | 中文字幕91 | 麻豆91在线观看 | 久久国产精品99久久久久久牛牛 | 国产亚洲成av人片在线观看桃 | 日韩欧美久久 | 久久人人网 | 成人免费淫片aa视频免费 | 老司机深夜福利视频 | 国产精品成人一区二区三区 | 国产精品免费久久 | 国产亚洲精品精品国产亚洲综合 | 成人激情视频在线观看 | 久在线视频播放免费视频 | 日本一区二区三区在线视频 | 精品久久久久久久久久 | 91久久精品久久国产性色也91 | 国产一区二区三区91 | 欧美理论片在线 | 福利视频网址导航 | 亚洲精品福利在线 | 日韩精品一区二区三区视频播放 | 亚洲国产精品第一区二区 | 午夜精品网站 | 精品国产乱码久久久久久1区2区 | 99精品欧美一区二区蜜桃免费 | 欧美一二区| 国产999精品久久久影片官网 | aa级毛片毛片免费观看久 | 在线成人免费视频 | 亚洲第一网站 | 精品二区视频 | 伊人一二三区 | 亚洲色图p | 免费在线成人 | 国产高潮呻吟久久渣男片 | 久久国产精品一区 | 免费久久久久 | 在线一区视频 | 伊人青青草 | 成人久久18免费观看 | 久久国产精品久久久久久电车 | 一级毛片黄 | 久久精品免费观看 | 韩国精品| 黄色片网站在线看 | 欧美一级二级三级视频 | 色黄视频在线观看 | 欧美人牲 | 成人午夜视频在线观看 | www.com欧美| 狠狠操夜夜操天天操 | 啵啵羞羞影院 | 正在播放国产精品 | 欧美在线三级 | 久久久999精品视频 欧美老妇交乱视频 | 国产精品久久综合 | 国产精品无码久久久久 | 亚洲精品日韩激情欧美 | 欧美一级一区 | 国产亚洲精品久久久 | 久久久精品网 | 亚洲精品一区在线观看 | 国产人成精品一区二区三 | 国产精品福利网站 | 欧美久久一级特黄毛片 | 欧美一区不卡 | 91精品国产日韩91久久久久久 | 日本免费一区二区在线观看 | 日韩欧美在线视频 | 在线免费观看av片 | 亚洲品质自拍视频网站 | 偷拍自拍第一页 | 国产片在线观看 | 9色porny自拍视频一区二区 | 华人黄网站大全 | 亚洲美女网站 | 久久99这里只有精品 | 免费在线观看av | av免费网站在线观看 | 一级久久久 | 亚洲国产成人久久 | av免费网站在线观看 | www中文字幕 | 精品久久一区 | 午夜精品一区二区三区在线播放 | 在线观看毛片视频 | 亚洲精品久久久久久一区二区 | 国产精品18久久久久久首页狼 | 国产高清视频一区二区 | 欧美精品一区二区三区一线天视频 | 六月丁香av | 中文字幕观看 | 黄版视频在线观看 | 国产精品视频一区二区三区不卡 | 国产精品久久久久久久娇妻 | 狠狠爱天天操 | 一级欧美一级日韩片 | 91精品国产一区二区三区蜜臀 | 北条麻妃国产九九九精品小说 | 香蕉久久一区二区不卡无毒影院 | 精品成人在线 | 国产视频久久久久久久 | 国产乱码精品一区二区三区手机版 | 亚洲精品成人av | 欧美日韩精品网站 | 日韩av免费在线观看 | 看亚洲a级一级毛片 | 国产91免费在线 | 真人一级毛片 | 超碰8| 国偷自产av一区二区三区 | 亚洲国内精品 | 极品久久 | 亚洲精品66| 亚洲视频在线观看一区二区三区 | 国产亚洲一区二区三区 | 91精品久久久久久久久中文字幕 | 黄色大片网站 | 人一级毛片| 国产欧美一区二区三区国产幕精品 | 亚洲精品在线免费 | 亚洲成人精品av | 欧美aaaaa | 国产综合欧美 | 久热av中文字幕 | 亚洲精品一区二区网址 | 日本日韩中文字幕 | 久草久草久草 | 久久国产精品无码网站 | 一级电影院 | 久久综合九九 | 欧美精品欧美激情 | 网址av| 午夜精品一区二区三区免费视频 | 亚洲综合精品 | 91国内| 日韩在线短视频 | 亚洲自拍偷拍欧美 | 99精品一级欧美片免费播放 | 看片地址| 欧美理伦片在线播放 | 日韩免费视频一区二区 | 亚洲天天 | 精品一区二区三区三区 | 91欧美激情一区二区三区成人 | 久久成人毛片 | 成人国产 | 四虎影院免费网址 | 午夜天| 国内外成人在线视频 | a毛片在线免费观看 | 亚洲一区二区免费视频 | 瑟瑟视频在线看 | 国产精品入口久久 | 51国产午夜精品免费视频 | 国产 日韩 欧美 中文 在线播放 | 五月婷婷天 | www.夜夜操.com | 国产视频久久久 | 精品成人在线 | 91.com在线 | 超碰国产一区 | 91精品国产乱码久久久久久 | av中文字幕网 | www.久久久久 | 91春色 | 爱啪导航一精品导航站 | 精品久久久久久久久久久久久久 | 欧美人体一区二区三区 | 天堂中文av | 欧美精产国品一二三区 | 日本三级欧美三级 | 久久久久久亚洲 | 中文字幕视频二区 | 一区二区三区视频在线观看 | 91欧美激情一区二区三区成人 | 福利视频一区二区 | 一级毛片电影 | 亚洲高清在线 | 国产剧情一区二区 | 欧美性影院 | 国产一区二区三区四区三区 | 日韩欧美在线观看视频 | 色婷婷亚洲国产女人的天堂 | 国产一级一级特黄女人精品毛片 | 一级国产视频 | 久久999免费视频 | 一区二区三区视频播放 | 亚洲大片免费观看 | 国产精品一二三区视频 | 久久1区| 国产一区二区免费 | 九九99九九精彩46 | www夜夜操| 97av在线视频 | 成人性生交大片免费看中文带字幕 | 成人a在线视频免费观看 | 日本一区二区三区四区 | 日本亚洲精品一区二区三区 | 中文字幕日韩一区二区三区 | 国产成人精品久久久 | 久久伊人av| av免费在线播放 | 国产九九精品视频 | 精品久久久av | 欧美视频三级 | 91福利电影在线观看 | 欧美中文字幕在线 | 精品亚洲一区二区三区在线观看 | 午夜少妇av| 欧美精品一区二区在线观看 | 密室大逃脱第六季大神版在线观看 | 欧美色欧美亚洲另类七区 | 在线a视频 | 在线视频久 | 国产无区一区二区三麻豆 | 国产毛片aaa | 日韩在线成人 | 一级片在线观看网站 | 亚洲精品在线免费 | 精品国产一区二区三区久久久 | 欧美日韩在线一区二区三区 | jizz欧美最大 | 国产精品影视 | 91.xxx.高清在线 | 国产91亚洲精品 | 精品国产乱码久久久久久久软件 | 九九人人 | 在线天堂av | 亚洲性在线 | 久久精品国产99国产精品 | 久久噜噜噜精品国产亚洲综合 | 久久久久久久久久久久91 | 午夜精品久久久久久久男人的天堂 | 国产在线拍揄自揄拍视频 | 91国产精品 | 国产一区精品电影 | 国产精品三级久久久久久电影 | 中文字幕成人在线 | 欧美成人免费在线观看 | 久久综合久久久 | 欧美黑人一级毛片 | 亚洲欧美日韩天堂 | 午夜影院在线观看免费 | 亚洲激情在线 | 日日操视频 | 日韩一区在线视频 | 成人av免费 | 国产精品美女久久久久久久网站 | 久久久亚洲成人 | 国产视频二 | 日韩精品极品视频在线 | 国内精品一区二区 | 日韩a| 中文字幕99 | 日韩精品 | 青青99| 久久久国产精品入口麻豆 | 欧美久久一区二区三区 | 天天操天天操 | 亚洲国产精品久久久久久女王 | 毛片91| 一区二区在线 | 国产亚洲欧美一区二区 | 奇米av在线 | 成人天堂资源www在线 | 色婷婷综合网 | 国产免费视频在线 | 欧美性猛交一区二区三区精品 | 古装三级在线播放 |