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

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

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

瀏覽:114日期:2022-08-14 13:39:24
Shiro簡(jiǎn)介 Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理 三個(gè)核心組件:Subject, SecurityManager 和 Realms Subject代表了當(dāng)前用戶的安全操作 SecurityManager管理所有用戶的安全操作,是Shiro框架的核心,Shiro通過SecurityManager來管理內(nèi)部組件實(shí)例,并通過它來提供安全管理的各種服務(wù)。 Realm充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說,當(dāng)對(duì)用戶執(zhí)行認(rèn)證(登錄)和授權(quán)(訪問控制)驗(yàn)證時(shí),Shiro會(huì)從應(yīng)用配置的Realm中查找用戶及其權(quán)限信息。 Realm實(shí)質(zhì)上是一個(gè)安全相關(guān)的DAO:它封裝了數(shù)據(jù)源的連接細(xì)節(jié),并在需要時(shí)將相關(guān)數(shù)據(jù)提供給Shiro。當(dāng)配置Shiro時(shí),你必須至少指定一個(gè)Realm,用于認(rèn)證和(或)授權(quán)。配置多個(gè)Realm是可以的,但是至少需要一個(gè)。 Shiro快速入門

導(dǎo)入依賴

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version></dependency><!-- configure logging --><!-- https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j --><dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>2.0.0-alpha1</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>2.0.0-alpha1</version></dependency><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>

配置log4j.properties

log4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n# General Apache librarieslog4j.logger.org.apache=WARN# Springlog4j.logger.org.springframework=WARN# Default Shiro logginglog4j.logger.org.apache.shiro=INFO# Disable verbose logginglog4j.logger.org.apache.shiro.util.ThreadContext=WARNlog4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN

配置Shiro.ini(在IDEA中需要導(dǎo)入ini插件)

[users]# user ’root’ with password ’secret’ and the ’admin’ roleroot = secret, admin# user ’guest’ with the password ’guest’ and the ’guest’ roleguest = guest, guest# user ’presidentskroob’ with password ’12345’ ('That’s the same combination on# my luggage!!!' ;)), and role ’president’presidentskroob = 12345, president# user ’darkhelmet’ with password ’ludicrousspeed’ and roles ’darklord’ and ’schwartz’darkhelmet = ludicrousspeed, darklord, schwartz# user ’lonestarr’ with password ’vespa’ and roles ’goodguy’ and ’schwartz’lonestarr = vespa, goodguy, schwartz# -----------------------------------------------------------------------------# Roles with assigned permissions## Each line conforms to the format defined in the# org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc# -----------------------------------------------------------------------------[roles]# ’admin’ role has all permissions, indicated by the wildcard ’*’admin = *# The ’schwartz’ role can do anything (*) with any lightsaber:schwartz = lightsaber:*# The ’goodguy’ role is allowed to ’drive’ (action) the winnebago (type) with# license plate ’eagle5’ (instance specific id)goodguy = winnebago:drive:eagle5

快速入門實(shí)現(xiàn)類 quickStart.java

import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.config.IniSecurityManagerFactory;import org.apache.shiro.mgt.DefaultSecurityManager;import org.apache.shiro.realm.text.IniRealm;import org.apache.shiro.session.Session;import org.apache.shiro.subject.Subject;import org.apache.shiro.util.Factory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class quickStart { private static final transient Logger log = LoggerFactory.getLogger(quickStart.class); /*Shiro三大對(duì)象:Subject: 用戶SecurityManager:管理所有用戶Realm: 連接數(shù)據(jù) */ public static void main(String[] args) {// 創(chuàng)建帶有配置的Shiro SecurityManager的最簡(jiǎn)單方法// realms, users, roles and permissions 是使用簡(jiǎn)單的INI配置。// 我們將使用可以提取.ini文件的工廠來完成此操作,// 返回一個(gè)SecurityManager實(shí)例:// 在類路徑的根目錄下使用shiro.ini文件// (file:和url:前綴分別從文件和url加載)://Factory<SecurityManager> factory = new IniSecurityManagerFactory('classpath:shiro.ini');//SecurityManager securityManager = factory.getInstance();DefaultSecurityManager securityManager = new DefaultSecurityManager();IniRealm iniRealm = new IniRealm('classpath:shiro.ini');securityManager.setRealm(iniRealm);// 對(duì)于這個(gè)簡(jiǎn)單的示例快速入門,請(qǐng)使SecurityManager// 可作為JVM單例訪問。大多數(shù)應(yīng)用程序都不會(huì)這樣做// 而是依靠其容器配置或web.xml進(jìn)行// webapps。這超出了此簡(jiǎn)單快速入門的范圍,因此// 我們只做最低限度的工作,這樣您就可以繼續(xù)感受事物.SecurityUtils.setSecurityManager(securityManager);// 現(xiàn)在已經(jīng)建立了一個(gè)簡(jiǎn)單的Shiro環(huán)境,讓我們看看您可以做什么:// 獲取當(dāng)前用戶對(duì)象 SubjectSubject currentUser = SecurityUtils.getSubject();// 使用Session做一些事情(不需要Web或EJB容器!!!Session session = currentUser.getSession();//通過當(dāng)前用戶拿到Sessionsession.setAttribute('someKey', 'aValue');String value = (String) session.getAttribute('someKey');if (value.equals('aValue')) { log.info('Retrieved the correct value! [' + value + ']');}// 判斷當(dāng)前用戶是否被認(rèn)證if (!currentUser.isAuthenticated()) { //token : 令牌,沒有獲取,隨機(jī) UsernamePasswordToken token = new UsernamePasswordToken('lonestarr', 'vespa'); token.setRememberMe(true); // 設(shè)置記住我 try {currentUser.login(token);//執(zhí)行登陸操作 } catch (UnknownAccountException uae) {//打印出 用戶名log.info('There is no user with username of ' + token.getPrincipal()); } catch (IncorrectCredentialsException ice) {//打印出 密碼log.info('Password for account ' + token.getPrincipal() + ' was incorrect!'); } catch (LockedAccountException lae) {log.info('The account for username ' + token.getPrincipal() + ' is locked. ' +'Please contact your administrator to unlock it.'); } // ... 在此處捕獲更多異常(也許是針對(duì)您的應(yīng)用程序的自定義異常? catch (AuthenticationException ae) {//unexpected condition? error? }}//say who they are://print their identifying principal (in this case, a username):log.info('User [' + currentUser.getPrincipal() + '] logged in successfully.');//test a role:if (currentUser.hasRole('schwartz')) { log.info('May the Schwartz be with you!');} else { log.info('Hello, mere mortal.');}//test a typed permission (not instance-level)if (currentUser.isPermitted('lightsaber:wield')) { log.info('You may use a lightsaber ring. Use it wisely.');} else { log.info('Sorry, lightsaber rings are for schwartz masters only.');}//a (very powerful) Instance Level permission:if (currentUser.isPermitted('winnebago:drive:eagle5')) { log.info('You are permitted to ’drive’ the winnebago with license plate (id) ’eagle5’. ' + 'Here are the keys - have fun!');} else { log.info('Sorry, you aren’t allowed to drive the ’eagle5’ winnebago!');}//all done - log out!currentUser.logout();//注銷System.exit(0);//退出 }}

啟動(dòng)測(cè)試

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

SpringBoot-Shiro整合(最后會(huì)附上完整代碼)

前期工作

導(dǎo)入shiro-spring整合包依賴

<!-- shiro-spring整合包 --><dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.1</version></dependency>

跳轉(zhuǎn)的頁(yè)面index.html

<html lang='en' xmlns:th='http://www.w3.org/1999/xhtml'><head> <meta charset='UTF-8'> <title>首頁(yè)</title></head><body><h1>首頁(yè)</h1><p th:text='${msg}'></p><a th:href='http://www.gepszalag.com/bcjs/@{/user/add}' rel='external nofollow' rel='external nofollow' rel='external nofollow' >add</a>| <a th:href='http://www.gepszalag.com/bcjs/@{/user/update}' rel='external nofollow' rel='external nofollow' rel='external nofollow' >update</a></body></html>

add.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>add</title></head><body><p>add</p></body></html>

update.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>update</title></head><body><p>update</p></body></html>

編寫shiro的配置類ShiroConfig.java

package com.example.config;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.LinkedHashMap;import java.util.Map;@Configurationpublic class ShiroConfig { //3. ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean getshiroFilterFactoryBean(@Qualifier('SecurityManager') DefaultWebSecurityManager defaultWebSecurityManager){ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();//設(shè)置安全管理器factoryBean.setSecurityManager(defaultWebSecurityManager);return factoryBean; } //2.創(chuàng)建DefaultWebSecurityManager @Bean(name = 'SecurityManager') public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier('userRealm') UserRealm userRealm){DefaultWebSecurityManager SecurityManager=new DefaultWebSecurityManager();//3.關(guān)聯(lián)RealmSecurityManager.setRealm(userRealm);return SecurityManager; } //1.創(chuàng)建Realm對(duì)象 @Bean(name = 'userRealm') public UserRealm userRealm(){return new UserRealm(); }}

編寫UserRealm.java

package com.example.config;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;public class UserRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println('授權(quán)');return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println('認(rèn)證');return null; }}

編寫controller測(cè)試環(huán)境是否搭建好

package com.example.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class MyController { @RequestMapping({'/','/index'}) public String index(Model model){model.addAttribute('msg','hello,shiro');return 'index'; } @RequestMapping('/user/add') public String add(){return 'user/add'; } @RequestMapping('/user/update') public String update(){return 'user/update'; }}

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

實(shí)現(xiàn)登錄攔截

在ShiroConfig.java文件中添加攔截

Map<String,String> filterMap = new LinkedHashMap<>();//對(duì)/user/*下的文件只有擁有authc權(quán)限的才能訪問filterMap.put('/user/*','authc');//將Map存放到ShiroFilterFactoryBean中factoryBean.setFilterChainDefinitionMap(filterMap);

這樣,代碼跑起來,你點(diǎn)擊add或者update就會(huì)出現(xiàn)404錯(cuò)誤,這時(shí)候,我們?cè)倮^續(xù)添加,讓它跳轉(zhuǎn)到我們自定義的登錄頁(yè)

添加登錄攔截到登錄頁(yè)

//需進(jìn)行權(quán)限認(rèn)證時(shí)跳轉(zhuǎn)到toLoginfactoryBean.setLoginUrl('/toLogin');//權(quán)限認(rèn)證失敗時(shí)跳轉(zhuǎn)到unauthorizedfactoryBean.setUnauthorizedUrl('/unauthorized');

login.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>登錄</title></head><body><form action=''> 用戶名:<input type='text' name='username'><br> 密碼:<input type='text' name='password'><br> <input type='submit'></form></body></html>

視圖跳轉(zhuǎn)添加一個(gè)login頁(yè)面跳轉(zhuǎn)

@RequestMapping('/toLogin') public String login(){return 'login'; }

上面,我們已經(jīng)成功攔截了,現(xiàn)在我們來實(shí)現(xiàn)用戶認(rèn)證

首先,我們需要一個(gè)登錄頁(yè)面

login.html

<!DOCTYPE html><html lang='en' xmlns:th='http://www.w3.org/1999/xhtml'><head> <meta charset='UTF-8'> <title>登錄</title></head><body><p th:text='${msg}' style='color: red'></p><form th:action='@{/login}'> 用戶名:<input type='text' name='username'><br> 密碼:<input type='text' name='password'><br> <input type='submit'></form></body></html>

其次,去controller編寫跳轉(zhuǎn)到登錄頁(yè)面

@RequestMapping('/login') public String login(String username,String password,Model model){//獲得當(dāng)前的用戶Subject subject = SecurityUtils.getSubject();//封裝用戶數(shù)據(jù)UsernamePasswordToken taken = new UsernamePasswordToken(username,password);try{//執(zhí)行登陸操作,沒有發(fā)生異常就說明登陸成功 subject.login(taken); return 'index';}catch (UnknownAccountException e){ model.addAttribute('msg','用戶名錯(cuò)誤'); return 'login';}catch (IncorrectCredentialsException e){ model.addAttribute('msg','密碼錯(cuò)誤'); return 'login';} }

最后去UserRealm.java配置認(rèn)證

//認(rèn)證 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println('認(rèn)證');String name = 'root';String password = '123456';UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;if (!userToken.getUsername().equals(name)){ return null;//拋出異常 用戶名錯(cuò)誤那個(gè)異常}//密碼認(rèn)證,shiro自己做return new SimpleAuthenticationInfo('',password,''); }

運(yùn)行測(cè)試,成功!!!

附上最后的完整代碼

pom.xml引入的依賴

pom.xml

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.4</version><relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springboot-08-shiro</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-08-shiro</name> <description>Demo project for Spring Boot</description> <properties><java.version>1.8</java.version> </properties> <dependencies><!-- shiro-spring整合包 --><dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.1</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><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> </dependencies> <build><plugins> <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId> </plugin></plugins> </build></project>

靜態(tài)資源

index.html

<html lang='en' xmlns:th='http://www.w3.org/1999/xhtml'><head> <meta charset='UTF-8'> <title>首頁(yè)</title></head><body><h1>首頁(yè)</h1><p th:text='${msg}'></p><a th:href='http://www.gepszalag.com/bcjs/@{/user/add}' rel='external nofollow' rel='external nofollow' rel='external nofollow' >add</a>| <a th:href='http://www.gepszalag.com/bcjs/@{/user/update}' rel='external nofollow' rel='external nofollow' rel='external nofollow' >update</a></body></html>

login.html

<!DOCTYPE html><html lang='en' xmlns:th='http://www.w3.org/1999/xhtml'><head> <meta charset='UTF-8'> <title>登錄</title></head><body><p th:text='${msg}' style='color: red'></p><form th:action='@{/login}'> 用戶名:<input type='text' name='username'><br> 密碼:<input type='text' name='password'><br> <input type='submit'></form></body></html>

add.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>add</title></head><body><p>add</p></body></html>

update.html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>update</title></head><body><p>update</p></body></html>

controller層

MyController.java

package com.example.controller;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.IncorrectCredentialsException;import org.apache.shiro.authc.UnknownAccountException;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class MyController { @RequestMapping({'/','/index'}) public String index(Model model){model.addAttribute('msg','hello,shiro');return 'index'; } @RequestMapping('/user/add') public String add(){return 'user/add'; } @RequestMapping('/user/update') public String update(){return 'user/update'; } @RequestMapping('/toLogin') public String toLogin(){return 'login'; } @RequestMapping('/login') public String login(String username,String password,Model model){//獲得當(dāng)前的用戶Subject subject = SecurityUtils.getSubject();//封裝用戶數(shù)據(jù)UsernamePasswordToken taken = new UsernamePasswordToken(username,password);try{//執(zhí)行登陸操作,沒有發(fā)生異常就說明登陸成功 subject.login(taken); return 'index';}catch (UnknownAccountException e){ model.addAttribute('msg','用戶名錯(cuò)誤'); return 'login';}catch (IncorrectCredentialsException e){ model.addAttribute('msg','密碼錯(cuò)誤'); return 'login';} }}

config文件

ShiroConfig.java

package com.example.config;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.LinkedHashMap;import java.util.Map;@Configurationpublic class ShiroConfig { //4. ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean getshiroFilterFactoryBean(@Qualifier('SecurityManager') DefaultWebSecurityManager defaultWebSecurityManager){ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();//5. 設(shè)置安全管理器factoryBean.setSecurityManager(defaultWebSecurityManager);/* shiro內(nèi)置過濾器 anon無需授權(quán)、登錄就可以訪問,所有人可訪。 authc 需要登錄授權(quán)才能訪問。 authcBasicBasic HTTP身份驗(yàn)證攔截器 logout退出攔截器。退出成功后,會(huì) redirect到設(shè)置的/URI noSessionCreation不創(chuàng)建會(huì)話連接器 perms授權(quán)攔截器,擁有對(duì)某個(gè)資源的權(quán)限才可訪問 port端口攔截器 restrest風(fēng)格攔截器 roles角色攔截器,擁有某個(gè)角色的權(quán)限才可訪問 sslssl攔截器。通過https協(xié)議才能通過 user用戶攔截器,需要有remember me功能方可使用 */Map<String,String> filterMap = new LinkedHashMap<>();//對(duì)/user/*下的文件只有擁有authc權(quán)限的才能訪問filterMap.put('/user/*','authc');//將Map存放到ShiroFilterFactoryBean中factoryBean.setFilterChainDefinitionMap(filterMap);//需進(jìn)行權(quán)限認(rèn)證時(shí)跳轉(zhuǎn)到toLoginfactoryBean.setLoginUrl('/toLogin');//權(quán)限認(rèn)證失敗時(shí)跳轉(zhuǎn)到unauthorizedfactoryBean.setUnauthorizedUrl('/unauthorized');return factoryBean; } //2.創(chuàng)建DefaultWebSecurityManager @Bean(name = 'SecurityManager') public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier('userRealm') UserRealm userRealm){DefaultWebSecurityManager SecurityManager=new DefaultWebSecurityManager();//3.關(guān)聯(lián)RealmSecurityManager.setRealm(userRealm);return SecurityManager; } //1.創(chuàng)建Realm對(duì)象 @Bean(name = 'userRealm') public UserRealm userRealm(){return new UserRealm(); }}

UserRealm.java

package com.example.config;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;public class UserRealm extends AuthorizingRealm { //授權(quán) @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println('授權(quán)');return null; } //認(rèn)證 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println('認(rèn)證');String name = 'root';String password = '123456';UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;if (!userToken.getUsername().equals(name)){ return null;//拋出異常 用戶名錯(cuò)誤那個(gè)異常}//密碼認(rèn)證,shiro自己做return new SimpleAuthenticationInfo('',password,''); }}

但是,我們?cè)谟脩粽J(rèn)證這里,真實(shí)情況是從數(shù)據(jù)庫(kù)中取的,所以,我們接下來去實(shí)現(xiàn)一下從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)來實(shí)現(xiàn)用戶認(rèn)證

Shiro整合mybatis

前期工作

在前面導(dǎo)入的依賴中,繼續(xù)添加以下依賴

<!-- mysql --><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency><!-- log4j --><dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency><!-- 數(shù)據(jù)源Druid --><dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.5</version></dependency><!-- 引入mybatis --><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version></dependency><!-- lombok --><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency>

導(dǎo)入了mybatis和Druid,就去application.properties配置一下和DruidDruid

spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource # 自定義數(shù)據(jù)源 #Spring Boot 默認(rèn)是不注入這些屬性值的,需要自己綁定 #druid 數(shù)據(jù)源專有配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true #配置監(jiān)控統(tǒng)計(jì)攔截的filters,stat:監(jiān)控統(tǒng)計(jì)、log4j:日志記錄、wall:防御sql注入 #如果允許時(shí)報(bào)錯(cuò) java.lang.ClassNotFoundException: org.apache.log4j.Priority #則導(dǎo)入 log4j 依賴即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

mybatis

mybatis: type-aliases-package: com.example.pojo mapper-locations: classpath:mapper/*.xml

連接數(shù)據(jù)庫(kù)編寫實(shí)體類

package com.example.pojo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class User {private Integer id;private String name;private String pwd;}

編寫mapper

package com.example.mapper;import com.example.pojo.User;import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;@Repository@Mapperpublic interface UserMapper { public User getUserByName(String name);}

編寫mapper.xml

<?xml version='1.0' encoding='UTF8' ?><!DOCTYPE mapperPUBLIC '-//mybatis.org//DTD Mapper 3.0//EN''http://mybatis.org/dtd/mybatis-3-mapper.dtd'><mapper namespace='com.example.mapper.UserMapper'> <select parameterType='String' resultType='User'>select * from mybatis.user where name=#{name} </select></mapper>

編寫service

package com.example.service;import com.example.pojo.User;public interface UserService { public User getUserByName(String name);}

package com.example.service;import com.example.mapper.UserMapper;import com.example.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl implements UserService{ @Autowired UserMapper userMapper; @Override public User getUserByName(String name) {return userMapper.getUserByName(name); }}

使用數(shù)據(jù)庫(kù)中的數(shù)據(jù)

修改UserRealm.java即可

package com.example.config;import com.example.pojo.User;import com.example.service.UserService;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.springframework.beans.factory.annotation.Autowired;public class UserRealm extends AuthorizingRealm { @Autowired UserService userService; //授權(quán) @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println('授權(quán)');return null; } //認(rèn)證 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println('認(rèn)證');UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;//連接真實(shí)的數(shù)據(jù)庫(kù)User user = userService.getUserByName(userToken.getUsername());if (user==null){ return null;//拋出異常 用戶名錯(cuò)誤那個(gè)異常}//密碼認(rèn)證,shiro自己做return new SimpleAuthenticationInfo('',user.getPwd(),''); }}認(rèn)證搞完了,我們?cè)賮砜纯词跈?quán)

在ShiroConfig.java文件加入授權(quán),加入這行代碼: filterMap.put('/user/add','perms[user:add]');//只有擁有user:add權(quán)限的人才能訪問add,注意授權(quán)的位置在認(rèn)證前面,不然授權(quán)會(huì)認(rèn)證不了;

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

運(yùn)行測(cè)試:add頁(yè)面無法訪問

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

授權(quán)同理:filterMap.put('/user/update','perms[user:update]');//只有擁有user:update權(quán)限的人才能訪問update

自定義一個(gè)未授權(quán)跳轉(zhuǎn)頁(yè)面

在ShiroConfig.java文件設(shè)置未授權(quán)時(shí)跳轉(zhuǎn)到unauthorized頁(yè)面,加入這行代碼:factoryBean.setUnauthorizedUrl('/unauthorized'); 2. 去Mycontroller寫跳轉(zhuǎn)未授權(quán)頁(yè)面

@RequestMapping('/unauthorized') @ResponseBody//懶得寫界面,返回一個(gè)字符串 public String unauthorized(){return '沒有授權(quán),無法訪問'; }

運(yùn)行效果:

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

從數(shù)據(jù)庫(kù)中接受用戶的權(quán)限,進(jìn)行判斷

在數(shù)據(jù)庫(kù)中添加一個(gè)屬性perms,相應(yīng)的實(shí)體類也要修改

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

修改UserRealm.java

package com.example.config;import com.example.pojo.User;import com.example.service.UserService;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.subject.Subject;import org.springframework.beans.factory.annotation.Autowired;public class UserRealm extends AuthorizingRealm { @Autowired UserService userService; //授權(quán) @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println('授權(quán)');SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();//沒有使用數(shù)據(jù)庫(kù),直接自己設(shè)置的用戶權(quán)限,給每個(gè)人都設(shè)置了,現(xiàn)實(shí)中要從數(shù)據(jù)庫(kù)中取//info.addStringPermission('user:add');//從數(shù)據(jù)庫(kù)中得到權(quán)限信息//獲得當(dāng)前登錄的對(duì)象Subject subject = SecurityUtils.getSubject();//拿到User對(duì)象,通過getPrincipal()獲得User currentUser = (User) subject.getPrincipal();//設(shè)置當(dāng)前用戶的權(quán)限info.addStringPermission(currentUser.getPerms());return info; } //認(rèn)證 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println('認(rèn)證');UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;//連接真實(shí)的數(shù)據(jù)庫(kù)User user = userService.getUserByName(userToken.getUsername());if (user==null){ return null;//拋出異常 用戶名錯(cuò)誤那個(gè)異常}//密碼認(rèn)證,shiro自己做return new SimpleAuthenticationInfo(user,user.getPwd(),''); }}

Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)

有了授權(quán)后,就又出現(xiàn)了一個(gè)問題,我們是不是要讓用戶沒有權(quán)限的東西,就看不見呢?這時(shí)候,就出現(xiàn)了Shiro-thymeleaf整合

Shiro-thymeleaf整合

導(dǎo)入整合的依賴

<!-- https://mvnrepository.com/artifact/com.github.theborakompanioni/thymeleaf-extras-shiro --><dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.0.0</version></dependency>

在ShiroConfig整合ShiroDialect

//整合ShiroDialect: 用來整合 shiro thymeleaf @Bean public ShiroDialect getShiroDialect(){return new ShiroDialect(); }

修改index頁(yè)面

<html lang='en' xmlns:th='http://www.thymeleaf.org' xmlns:shiro='http://www.thymeleaf.org/thymeleaf-extras-shiro'><!-- 三個(gè)命名空間xmlns:th='http://www.thymeleaf.org'xmlns:sec='http://www.thymeleaf.org/extras/spring-security'xmlns:shiro='http://www.thymeleaf.org/thymeleaf-extras-shiro'--><head> <meta charset='UTF-8'> <title>首頁(yè)</title></head><body><h1>首頁(yè)</h1><p th:text='${msg}'></p><!--判斷是否有用戶登錄,如果有就不顯示登錄按鈕--><div th:if='${session.loginUser==null}'> <a th:href='http://www.gepszalag.com/bcjs/@{/toLogin}' rel='external nofollow' >登錄</a></div><div shiro:hasPermission='user:add'> <a th:href='http://www.gepszalag.com/bcjs/@{/user/add}' rel='external nofollow' rel='external nofollow' rel='external nofollow' >add</a></div><div shiro:hasPermission='user:update'> <a th:href='http://www.gepszalag.com/bcjs/@{/user/update}' rel='external nofollow' rel='external nofollow' rel='external nofollow' >update</a></div></body></html>

判斷是否有用戶登錄

//這個(gè)是整合shiro和thymeleaf用到的,讓登錄按鈕消失的判斷Subject subject = SecurityUtils.getSubject();Session session = subject.getSession();session.setAttribute('loginUser', user);

測(cè)試

以上就是Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)的詳細(xì)內(nèi)容,更多關(guān)于Java安全框架——Shiro的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 天堂久久久久 | 亚洲一区二区中文字幕 | 亚洲电影在线观看 | 日韩欧美精品一区二区三区 | 国产成人精品久久二区二区 | 青青久久 | 日韩欧美国产精品综合嫩v 亚洲欧美日韩在线 | www.99re | 99精品免费观看 | 国产99在线播放 | 中文精品久久久 | 精品一区二区在线观看 | 韩国av一区二区 | 中文字幕一区在线 | 涩涩999| 日本久久精品一区二区 | 亚洲第1页 | 久久久国产精品入口麻豆 | 免费av手机在线观看 | 欧美日一区 | 自拍偷拍一区二区三区 | 欧美一区二区免费在线 | 国产视频福利一区 | 欧美一级免费大片 | 美女又黄又免费 | 日韩不卡一区二区三区 | 操操网| 天天摸夜夜摸爽爽狠狠婷婷97 | 九色在线 | 精品国产三级 | 日韩精品一区二区三区第95 | 国产精品二区三区 | 欧美中文字幕一区二区 | av中文字幕网 | 成年人黄色一级毛片 | 成人在线视频一区 | 国产欧美久久久久久 | 国产成人高清视频 | 日韩午夜视频在线观看 | 亚洲国产成人精品女人久久久 | 国产精品久久久久久久福利院 | 97精品国产 | 狠久久| 成人精品电影 | 久久99国产精品久久99大师 | 综合一区二区三区 | 国产视频中文字幕 | 久久伊人操 | 久久欧美高清二区三区 | 日韩成人影院 | 久久精品一 | 国产中文字幕在线 | 毛片网站在线 | 欧美亚洲国产一区二区三区 | 日日网| 人人鲁人人莫一区二区三区 | 国产欧美日韩精品一区二区三区 | av片免费 | 久久xxx | 2012中文版免费观看 | 久久精品| 99热在线播放 | 久久九| 久草 在线 | 亚洲一区二区三区四区在线观看 | 亚洲欧美日韩国产综合 | 国产一区二区在线观看视频 | 欧美一级片在线 | 欧美一区二区 | 久久成人精品一区二区三区 | 久久av一区| 色橹橹欧美在线观看视频高清 | 91视频在线看 | 第一福利丝瓜av导航 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 国产精品乱码一区二区三区 | 国产精品一区电影 | 日韩在线 | 国产乱码精品一品二品 | 免费国产一区 | 综合激情av| 欧美日韩一区二区三区四区 | 亚洲国产精品一区二区第一页 | a在线观看 | 免费看的毛片 | 亚洲成av人乱码色午夜 | 国产精品女教师av久久 | 欧美日本免费 | 亚洲一区二区三区在线视频 | 亚洲第一页中文字幕 | 久久久国产一区二区三区 | 日韩精品无码一区二区三区 | 国产91网址| 国产va| 免费观看黄视频 | 国产综合视频在线观看 | 91九色在线 | 午夜看片在线观看 | 天天操网| а天堂中文最新一区二区三区 | 蜜桃久久av | 日本a视频 | 欧美亚洲国产一区 | 久久久资源 | 亚洲性视频网站 | 国产视频一区二区在线观看 | 97国产精品 | 精品国产精品三级精品av网址 | 在线观看中文字幕 | 精品国产一区二区三区不卡蜜臂 | 亚洲二区在线 | 天天精品 | 色精品视频 | 国产精品久久久久久吹潮 | 久久精品99 | 午夜视频一区二区 | 国产精品久久久久久久竹霞 | 国产乱码精品一区二区三 | 超碰在线天天 | 91视频www| 每日更新av | 久久精品网| 日韩在线免费 | 国产私拍视频 | 欧美在线播放一区 | 999精品视频 | 国产传媒一区 | 亚洲成av人片一区二区梦乃 | 午夜视频| 亚洲精品欧美精品 | 一区在线看| 国产精品一区二区三区免费视频 | 国产精品一区二区三区在线看 | 欧美午夜在线 | 成人亚洲视频在线观看 | 亚洲色图偷拍视频 | 色婷婷亚洲国产女人的天堂 | 欧美一级黄视频 | 国产一区二区精品久久岳 | 99久久婷婷国产精品综合 | 国产综合视频在线播放 | 男女羞羞视频网站18 | 一区二区三区视频免费 | 免费v片在线观看 | 日本不卡视频 | 免费观看欧美一级 | 欧美亚洲日本 | 日韩欧美在线视频免费观看 | 欧美日韩亚洲一区二区 | 精品国产一区二区三区久久影院 | 天天摸天天看 | 久久99精品久久久 | 欧美视频免费在线 | 国产精品久久久久久一区二区三区 | 日韩精品视频在线 | 综合一区二区三区 | 午夜在线观看免费 | 午夜精品福利网 | 天天夜夜操 | 国产精品永久在线观看 | 中文字幕一区二区三 | 日韩欧美在线播放视频 | 中文字幕在线观看第一页 | 日本免费www| 日韩毛片在线视频 | 国产精品爱久久久久久久 | 欧美一区久久 | 国产精品九九久久99视频 | 女同久久另类99精品国产 | 精品国产乱码一区二区三区 | 欧美一区二区免费 | 久久国产午夜 | 天天曰天天曰 | 亚洲精品久久久一区二区三区 | 国产视频99| 青草视频网站 | www.亚洲成人网 | 精品久久久久久久久久久院品网 | 国产另类ts人妖一区二区 | 日韩精品一区二区三区第95 | 日韩欧美网 | 欧美精品 在线观看 | 成人免费视频网 | 性做久久久 | 91亚洲在线 | 香蕉av777xxx色综合一区 | 伊人网视频 | 日韩视频在线免费观看 | 国产一区二区三区不卡在线观看 | 日韩视频精品 | 欧美 日韩 国产 成人 在线 | 国产视频久久 | 中文字幕一区二区在线观看 | 精品久久久久久亚洲综合网 | 国产精品九九九 | 久久99久久久久 | 欧美激情一区二区三区 | 中文av字幕 | 国产99久久久久久免费看农村 | 91视频一88av| 精品久久久久久亚洲综合网站 | 91中文在线| 亚洲精品电影在线观看 | av在线一区二区三区 | 国产精品久久久久久中文字 | 久久久久久久av | 免费特级黄毛片 | 欧美不卡一区二区三区 | 国产九九精品 | 精品一区二区三区免费 | 免费国产网站 | 欧美一区二区三区精品免费 | 日穴视频在线观看 | 日韩视频一区在线观看 | 亚洲综合国产 | 国产高清不卡 | 国内精品国产成人国产三级粉色 | 亚洲欧美在线观看 | 在线观看精品自拍私拍 | 成人网久久| 日韩成人av在线 | 精品一区视频 | 免费看a| 亚洲国产精品久久久久 | 国产伦精品一区二区三区在线 | 成人一级片在线观看 | 欧美日韩黄色一级片 | 在线一区二区三区 | 女人夜夜春 | 亚洲高清精品视频 | 一区二区中文 | 最新黄色网址在线播放 | 中文字幕第一页在线视频 | 日韩精品一二三 | 国产人妖一区二区 | 成人片免费看 | 久久国产精品久久久久久电车 | 久久人爽| 一级在线观看 | 一区久久 | 狠狠搞狠狠干 | 欧美3区 | 亚洲欧美精品 | 久久99精品久久久久久琪琪 | 国产一区二区三区精品久久久 | 97在线免费视频 | www.av欧美| 黄网站涩免费蜜桃网站 | 亚洲精品乱码久久久久久按摩观 | 亚洲乱码二区 | 精久久| av在线免费播放 | av一区二区三区四区 | 日韩成人在线视频 | 亚洲美乳中文字幕 | 日韩精品一区二区三区中文在线 | 亚洲免费网站 | 四虎影院网 | 精品久久久久久久久久久久 | 国产精品久久久久aaaa九色 | 久久精品一区二区三区不卡牛牛 | 97人人做人人人难人人做 | 天天干天天摸 | 免费一级片 | 欧美久久久久久久久久久久 | 欧美成人一区二区三区片免费 | 国产成人高清在线 | 精品久久久久久久久久久久久久久 | 99在线免费视频 | 欧美自拍视频 | 欧美日韩一区二区三区在线电影 | 亚洲视频在线免费观看 | 欧美激情视频一区二区三区在线播放 | 国产91色 | 国产一区在线免费 | 一级高清视频 | 福利视频一区二区三区 | 欧美日韩国产一级片 | 羞羞视频在线免费观看 | 青青久视频| 一级黄色录像在线观看 | 国产精品色一区二区三区 | 日本高清中文字幕 | 日韩欧美在线一区二区 | 精品xxxx户外露出视频 | 99视频在线看| 国产一区二区在线免费观看 | 亚洲二区在线 | 精品国产一区二区 | 日韩精品中文字幕一区二区三区 | 日韩综合视频在线观看 | 不卡的一区二区 | 色一色网站| 九九热这里只有精品6 | 久久久久久黄 | 亚洲福利av | 国产精品揄拍一区二区久久国内亚洲精 | 国产精品日本欧美一区二区三区 | 精品一区二区久久 | 久久久91精品国产一区二区三区 | 在线观看亚洲专区 | 国产亚洲欧美一区二区三区 | 亚洲欧美日韩在线一区二区三区 | 毛片精品 | a免费在线观看 | 成人一区二区三区在线观看 | 九九在线精品 | 久久精品国产99精品国产亚洲性色 | 欧美在线播放一区 | 亚洲高清视频在线观看 | 欧美国产日韩视频 | 精精国产xxxx视频在线 | 精品视频一区二区三区 | 久久网日本 | 欧美欧美欧美 | 亚洲情网站 | www.av欧美 | 日本欧美久久久久免费播放网 | 亚洲最大av网站 | 青青草网 | 国产精品国产成人国产三级 | 啪啪的网站 | 国产精品国产精品国产专区不片 | av自拍| 一区二区不卡视频 | a在线v| 欧美色性| 男女视频网站 | 一区二区三区国产视频 | 色一情一乱一伦一区二区三区 | 搞黄视频在线观看 | 黄色毛片视频网站 | 国产伦精品一区二区 | 91精品国产欧美一区二区 | 久久综合社区 | 亚洲高清在线观看 | 午夜激情av| 色接久久 | 在线欧美亚洲 | 一区二区不卡 | 中文字幕久久综合 | 欧美激情 在线 | 国产日韩欧美亚洲 | 91在线看| 国产精品久久久久久网站 | 99国产精品99久久久久久 | 中文字幕日韩一区二区 | 国产欧美一区二区三区在线看 | 精品久久久久一区二区三区 | 国产一区二区三区免费 | 一级毛片在线播放 | 国产成人精品一区二区视频免费 | 欧美精品一二三 | 国产探花在线看 | 日本免费一区二区三区 | 亚洲欧美国产精品久久 | 国产精品一区二区在线观看 | 精品一二三区 | 国产亚洲成av人片在线观看桃 | 国产精品日本一区二区在线播放 | 国产在线一 | 先锋影音av资源站 | 免费国产一区二区 | 国产高清一区 | 亚洲精品视频在线看 | 日韩欧美视频一区 | 一区二区视频在线 | 校园春色av| 免费在线一区二区 | 日韩视频―中文字幕 | 风间由美一区二区三区在线观看 | 成人久久精品 | 97在线观看 | 国产精品免费在线 | 亚洲综合区 | 亚洲国产精品久久人人爱 | 国产成人综合一区二区三区 | 激情欧美一区二区三区中文字幕 | 欧美极品一区二区 | 久久电影国产 | 久久男人 | 国产成人精品a视频一区www | 成人在线一区二区三区 | 天天操天天插天天干 | 一级黄色爱爱视频 | 激情欧美一区二区三区中文字幕 | 中文在线视频 | 国产裸体bbb视频 | 一区视频在线 | 国产日产欧美a级毛片 | 欧美久草 | 中文字幕精品一区二区三区精品 | 精品久久久久久久久久久久 | 中文字幕亚洲一区 | 久久久久久成人 | 国产乱码久久久久久一区二区 | 黄色片免费观看网站 | 国产精品入口久久 | 日日综合 | 国产一区二区精品 | 成人精品视频免费在线观看 | 超碰在线91 | 欧美成人精品激情在线观看 | 亚洲国产成人精品女人久久久 | 国产成人99久久亚洲综合精品 | 国产欧美日韩综合精品 | 啪啪免费网站 | 欧美日韩在线观看一区二区三区 | 青青草人人| 亚洲一区二区精品视频 | 91成人免费看 | 久久久久久久久久久久久九 | 欧美午夜精品久久久久久浪潮 | 亚洲精品9999 | 99久久久国产精品 | 精品久久久久久久久久久院品网 | 欧美日韩一区二区视频在线观看 | 欧美99 | 国产精品第一国产精品 | 五月天电影网 | 国产亚洲视频在线观看 | 欧美一级艳情片免费观看 | 国内精品一级毛片国产99 | 国产视频久久 | 成人午夜在线观看 | 国产激情久久久久久 | 久久9国产偷伦 | 97成人精品视频在线观看 | 中文字幕一区二区三区在线视频 | 亚洲 欧美 综合 | 精品中文字幕在线 | 午夜爽| 国外成人在线视频网站 | 91久久精品一区二区别 | 欧美在线a | 中文字幕在线观看免费视频 | 在线观看免费的网站www | 在线亚洲不卡 | 精品中文字幕在线 | 一区二区不卡视频在线观看 | 日韩精品在线网站 | 99re热精品视频 | 成年人网站国产 | 国产精久久一区二区三区 | 日韩一二三区在线观看 | 麻豆产精国品免费入口 | av在线三级 | 99久热在线精品视频观看 | 国产成人精品一区二区三区视频 | 成人性视频免费网站 | 午夜久久久久 | 国产精品一区免费在线观看 | 6080夜射猫| 精品一区二区三区免费毛片爱 | 久久国产成人 | 国产免费一区二区 | 国产精品美女久久久久久免费 | 91成人免费在线观看 | chinese中国真实乱对白 | 欧美成人a∨高清免费观看 在线视频成人 | 亚洲成人久久久 | 中文字幕三区 | 午夜天堂精品久久久久 | 一区二区三区精品 | 精品欧美一区二区三区久久久 | 成人日韩 | 久草新视频在线观看 | 亚洲成人高清 | 久久亚洲精品国产一区 | 成人精品免费视频 | 日韩一区电影 | 亚洲综合二 | www.干| a∨在线观看 | 日韩午夜激情视频 | jizz在亚洲 | 99精彩视频 | 欧美在线观看视频 | 精品国产91乱码一区二区三区 | 日韩精品一区二区三区免费观看视频 | 精品免费视频 | 婷婷激情在线 | 成人小视频在线观看 | 色综合久久久久 | av一级毛片 | 国产一区二区三区不卡在线观看 | 欧美99热| 黄色网址大全在线观看 | 青草视频网站 | 91 在线观看| 国产精品视频播放 | 国产精品a免费一区久久电影 | 狠狠操夜夜操 | av中文字幕网 | 亚洲不卡在线 | 少妇久久久 | 亚洲成人伦理 | 精品香蕉一区二区三区 | 久久久久国产精品视频 | 91视频精选| 国产精品成人国产乱一区 | 91视频免费观看 | 国产精品久久久久久久久久久久午夜片 | 国产日韩精品在线观看 | 久久99视频精品 | 日本精品视频网站 | 亚洲免费一区二区 | 久久青青 | 91亚洲一区| www.99精品 | 99视频免费 | 国产色视频网站 | 成人欧美一区二区三区黑人孕妇 | 日韩精品一区二区在线观看视频 | 在线观看黄免费 | 天天干夜操 | 欧美一级在线观看 | 欧美日韩视频一区二区 | 亚洲网站在线观看 | 亚洲国产一区二区三区四区 | 亚洲欧美一区二区精品中文字幕 | 久草高清在线 | av在线官网| aaa在线 | 亚洲视频中文字幕 | www久久精品 | 国产精品久久久久久久午夜 | 成年人网站在线免费观看 | 大吊一区二区 | www.久久久久久久 | 日韩欧美一区二区三区四区 | 午夜精品久久久久久久星辰影院 | 99精品视频在线 | 粉嫩在线| 精品免费视频 | 久久人人爽人人爽人人片av不 | 国产精品一区二区在线 | 叶山小百合av一区二区 | 成人在线一区二区三区 | 欧美激情在线播放 | 亚洲精品视频一区 | 精品久久久久久久久久久久 | 中文字幕99 | 中文字幕成人免费视频 | 日韩三级视频 | 国产91成人在在线播放 | 国产精品久久久久久久久久免费看 | 国产一级毛片电影 | 免费在线观看av | 中文字幕国产 | 免费av在线网 | 97综合色 | 免费成人av在线 | 欧美一区二区三区在线观看视频 | 午夜免费剧场 | 久久综合久久久 | 九九亚洲视频 | 日本一级毛片免费看 | 国产欧美精品一区二区色综合朱莉 | 午夜电影 | 黄色毛片看看 | 97久久久 | 欧美精品网站 | 国产美女一区 | 黄色一级片在线看 | 亚洲免费观看视频 | 久久精品久久久久久久久久久久久 | 色爱区综合| 日韩欧美国产精品 | 午夜大片在线观看 | 日本特黄特色aaa大片免费 | 国产毛片毛片 | 精品九九 | 在线二区 | 国产精品久久 | 黄色精品 | 久久久久久av | 成人一区二区在线 | 中文字幕av在线 | 黄免费观看 | 欧美一区二区三区 | 国产精品久久久久婷婷二区次 | 亚洲二区视频 | 特级黄一级播放 | 69av.com | 亚洲视频中文字幕 | 亚洲国产成人精品女人 | 爱爱免费视频网站 | 一二三区字幕免费观看av | 黄色在线免费看 | 成人网在线 | 成人av在线网 | 成人免费网站www网站高清 | 一级淫片免费 | 亚洲国产精品久久久 | 欧美一区二区 | 看片wwwwwwwwwww| 第一色网站 | 一级女性全黄久久生活片免费 | 日b片 | 成人免费一区二区三区视频网站 | 一区二区在线看 | 一区二区免费在线播放 | 欧美一区二区 | 午夜av影院| 一级篇 | 91捆绑91紧缚调教91 | 日韩中文字幕电影 | 欧美久久一区二区三区 | 国产精品久热 | 精品国产一区二区三区成人影院 | 成年人免费在线视频 | 视频一区在线播放 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | 久久久国产一区二区三区 |