最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Security使用數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán)

 更新時(shí)間:2022年01月04日 16:44:21   作者:Charge8  
本文主要介紹了Spring?Security使用數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、搭建項(xiàng)目環(huán)境

1、創(chuàng)建 RBAC五張表

RBAC,即基于角色的權(quán)限訪(fǎng)問(wèn)控制(Role-Based Access Control),就是用戶(hù)通過(guò)角色與權(quán)限進(jìn)行關(guān)聯(lián)。
在這種模型中,用戶(hù)與角色之間,角色與權(quán)限之間,一般者是多對(duì)多的關(guān)系。

在 MySQL數(shù)據(jù)庫(kù)中,創(chuàng)建如下幾個(gè)表:

DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user(
    id BIGINT NOT NULL AUTO_INCREMENT  COMMENT '主鍵id' ,
    username VARCHAR(60)    COMMENT '用戶(hù)名' ,
    password VARCHAR(255)    COMMENT '密碼' ,
    status tinyint(1)    COMMENT '用戶(hù)狀態(tài),1-開(kāi)啟-0禁用' ,
    password_non_expired tinyint(1)    COMMENT '密碼是否失效,1-可用,0-失效' ,
    PRIMARY KEY (id)
)  COMMENT = '用戶(hù)表';

DROP TABLE IF EXISTS sys_role;
CREATE TABLE sys_role(
    id BIGINT NOT NULL AUTO_INCREMENT  COMMENT '主鍵id' ,
    role_name VARCHAR(64) NOT NULL   COMMENT '角色名' ,
    role_desc VARCHAR(64) NOT NULL   COMMENT '角色描述' ,
    PRIMARY KEY (id)
)  COMMENT = '角色表';

DROP TABLE IF EXISTS sys_permission;
CREATE TABLE sys_permission(
    id BIGINT NOT NULL AUTO_INCREMENT  COMMENT '主鍵id' ,
    parent_id BIGINT    COMMENT '父id' ,
    permission_name VARCHAR(64)    COMMENT '菜單名稱(chēng)' ,
    permission_url VARCHAR(255)    COMMENT '菜單地址' ,
    PRIMARY KEY (id)
)  COMMENT = '權(quán)限表';

DROP TABLE IF EXISTS sys_user_role;
CREATE TABLE sys_user_role(
    id BIGINT NOT NULL AUTO_INCREMENT  COMMENT '主鍵id' ,
    user_id BIGINT NOT NULL   COMMENT '用戶(hù)id' ,
    role_id BIGINT    COMMENT '角色id' ,
    enabled tinyint(1)   DEFAULT 1 COMMENT '是否有效' ,
    PRIMARY KEY (id)
)  COMMENT = '用戶(hù)角色關(guān)聯(lián)表';

DROP TABLE IF EXISTS sys_role_permission;
CREATE TABLE sys_role_permission(
    id BIGINT NOT NULL AUTO_INCREMENT  COMMENT '主鍵id' ,
    role_id BIGINT NOT NULL   COMMENT '角色id' ,
    permission_id BIGINT    COMMENT '權(quán)限id' ,
    PRIMARY KEY (id)
)  COMMENT = '角色權(quán)限表';

在這里插入圖片描述

2、創(chuàng)建項(xiàng)目

創(chuàng)建 Mavne 項(xiàng)目,Springboot + Spring Security + MyBatis + MySQL + jsp。

1)配置文件如下

server:
  port: 9090

# jsp配置
spring:
  mvc:
    view:
      prefix: /pages/
      suffix: .jsp
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/security_authority?useUnicode=true;characterEncoding=utf8;useSSL=true;serverTimezone=GMT
    username: root
    password: 123456

# mybatis配置
mybatis:
  configuration:
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mybatis/mapper/*.xml

logging:
  level:
    com.charge.learn.springsecurity.springboot.security.jsp.dao: debug

2)啟動(dòng)類(lèi)

@SpringBootApplication
@MapperScan("com.charge.learn.springsecurity.springboot.security.jsp.dao")
public class SpringSecurityApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringSecurityApplication.class, args);
    }
}

在這里插入圖片描述

二、整合 Spring Security實(shí)現(xiàn)用戶(hù)認(rèn)證

1、后端整合

1.1 用戶(hù)

Spring Security的用戶(hù)對(duì)象是 UserDetail類(lèi)型,Spring Security在認(rèn)證流程中只認(rèn) UserDetail用戶(hù)。

  • 通過(guò) UserDetailsService的 loadUserByUsername方法獲取 UserDetail用戶(hù)。
  • 認(rèn)證成功之后,調(diào)用的是這個(gè)帶有三個(gè)參數(shù)的 UsernamePasswordAuthenticationToken構(gòu)造方法,將 角色信息添加到了ArrayList<GrantedAuthority>集合中。
  • 在 successfulAuthentication 方法中,將認(rèn)證信息存儲(chǔ)到了SecurityContext中。

在這里插入圖片描述

UserDetail接口的方法(根據(jù)用戶(hù)業(yè)務(wù)來(lái)處理這幾個(gè)值)。

  • boolean enabled 賬戶(hù)是否可用
  • boolean accountNonExpired 賬戶(hù)是否失效
  • boolean credentialsNonExpired 賬戶(hù)密碼是否失效
  • boolean accountNonLocked 賬戶(hù)是否鎖定
  • Collection<? extends GrantedAuthority> getAuthorities() 獲取賬戶(hù)的所有權(quán)限(用戶(hù)角色)

注意:四個(gè)布爾類(lèi)型的參數(shù)都為 true時(shí),然后成功,否則,有一個(gè)為 false,就會(huì)認(rèn)證失敗。

所以,我們可以將我們的用戶(hù)封裝成 UserDetail對(duì)象。
這里我們讓用戶(hù)對(duì)象實(shí)現(xiàn) UserDetail接口,那么我們用戶(hù)就屬于 UserDetail類(lèi)型的用戶(hù),然后實(shí)現(xiàn)接口的方法。

public class SysUser implements UserDetails {

    private Long id;
    private String username;
    private String password;
    private Boolean status; //用戶(hù)狀態(tài),1-開(kāi)啟-0禁用
    private Boolean passwordNonExpired; //密碼是否失效,1-可用,0-失效
    /**
     * 用戶(hù)關(guān)聯(lián)的所有角色
     */
    private List<SysRole> roles = new ArrayList<>();

//get、set方法

    //標(biāo)記該字段不做json處理
    @JsonIgnore
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return roles;
    }

    @JsonIgnore
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @JsonIgnore
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @JsonIgnore
    @Override
    public boolean isCredentialsNonExpired() {
        return passwordNonExpired == null ? false : passwordNonExpired;
    }

    @JsonIgnore
    @Override
    public boolean isEnabled() {
        return status == null ? false : status;
    }

}

1.2 角色

Spring Security的權(quán)限對(duì)象是 GrantedAuthority類(lèi)型。通過(guò)它的值來(lái)實(shí)現(xiàn)權(quán)限管理的。

在這里插入圖片描述

所以,我們讓角色對(duì)象實(shí)現(xiàn)GrantedAuthority接口,那么我們角色就屬于 GrantedAuthority類(lèi)型,然后實(shí)現(xiàn)接口的方法。
上面用戶(hù)可以直接將 角色添加到 Collection<? extends GrantedAuthority>集合中。

public class SysRole implements GrantedAuthority {

    private Long id;
    private String roleName;
    private String roleDesc;

//get、set方法

    //標(biāo)記該字段不做json處理
    @JsonIgnore
    @Override
    public String getAuthority() {
        return roleName;
    }

}

1.3 SysUserService接受繼承UserDetailsService類(lèi)

Spring Security在認(rèn)證流程中通過(guò) UserDetailsService的 loadUserByUsername方法獲取 UserDetail用戶(hù)。

在這里插入圖片描述

所以,我們讓 UserService接口繼承 UserDetailsService類(lèi),然后重寫(xiě) loadUserByUsername方法。

在 loadUserByUsername方法中,獲取我們的用戶(hù)信息( UserDetail類(lèi)型),記得將用戶(hù)關(guān)聯(lián)的角色也賦值為用戶(hù)信息。

public interface SysUserService extends UserDetailsService {

    void save(SysUser user);
}
@Service
@Transactional
public class SysUserServiceImpl implements SysUserService {

	@Autowired
	private SysUserMapper sysUserMapper;

	@Autowired
	private SysRoleMapper sysRoleMapper;

	@Autowired
	private BCryptPasswordEncoder passwordEncoder;

	@Override
	public void save(SysUser sysUser) {
		// 將密碼加密入庫(kù)
		sysUser.setPassword(passwordEncoder.encode(sysUser.getPassword()));
		sysUserMapper.insert(sysUser);
	}

	/**
	 * 認(rèn)證業(yè)務(wù)
	 *
	 * @param username
	 *            - 用戶(hù)在瀏覽器輸入的用戶(hù)名
	 * @return UserDetails - Spring Security的用戶(hù)對(duì)象,返回 null表示認(rèn)證失敗!
	 * @throws UsernameNotFoundException
	 */
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		/**
		 * 用戶(hù)信息和角色信息可以一步關(guān)聯(lián)查詢(xún)到位得到SysUser,我這里分開(kāi)查詢(xún)
		 */
		// 1.查詢(xún)用戶(hù)
		SysUser sysUser = sysUserMapper.getByUsername(username);
		if (sysUser == null) {
			return null;
		}
		// 2.獲取用戶(hù)關(guān)聯(lián)的所有角色
		List<SysRole> sysRoles = sysRoleMapper.listAllByUserId(sysUser.getId());
		sysUser.setRoles(sysRoles);
		System.out.println("====> sysUser=" + sysUser.toString());
		return sysUser;
	}
}

mapper.xml中的幾個(gè)方法

  <select id="getByUsername" resultMap="BaseResultMap">
    select id, username, password, status, password_non_expired from sys_user where username = #{username}
  </select>

  <select id="listAllByUserId" resultMap="BaseResultMap">
    SELECT r.id, r.role_name role_name, r.role_desc role_desc
    FROM sys_role r, sys_user_role ur
    WHERE r.id = ur.role_id AND ur.user_id = #{userId}
  </select>

1.4 創(chuàng)建 SpringSecurity配置類(lèi)

自定義一個(gè)配置類(lèi),添加@EnableWebSecurity注解,并繼承WebSecurityConfigurerAdapter類(lèi)。然后就擁有了 SpringSecutiry的所有默認(rèn)配置。我們也可以修改配置。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private SysUserService userService;

    // 加密對(duì)象注入IOC容器
    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    // 1.指定認(rèn)證對(duì)象的來(lái)源(內(nèi)存或者數(shù)據(jù)庫(kù)),指定加密方式
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
    }

    //2. SpringSecurity配置相關(guān)信息
    @Override
    public void configure(HttpSecurity http) throws Exception {
        // 釋放靜態(tài)資源,指定攔截規(guī)則,指定自定義的認(rèn)證和退出頁(yè)面,csrf配置等
        http.authorizeRequests()
                // 指定攔截規(guī)則
                .antMatchers("/login.jsp", "failer.jsp", "/css/**", "/img/**", "/plugins/**").permitAll()  //釋放這些資源,不攔截
                .antMatchers("/**").hasAnyRole("USER", "ADMIN") //所有資源都需要這些角色中的一個(gè)
                .anyRequest().authenticated()  //其他請(qǐng)求,必須認(rèn)證通過(guò)之后才能訪(fǎng)問(wèn)
                .and()  // 表示新的一個(gè)配置開(kāi)始
                // 指定自定義的認(rèn)證頁(yè)面
                .formLogin()
                .loginPage("/login.jsp")
                .loginProcessingUrl("/login")
                .successForwardUrl("/index.jsp")
                .failureForwardUrl("/failer.jsp")
                .permitAll() // 釋放這些資源,不攔截登錄
                .and()
                // 指定自定義的退出頁(yè)面
                .logout()
                .logoutSuccessUrl("/logout")
                .invalidateHttpSession(true) // 清楚session
                .logoutSuccessUrl("/login.jsp")
                .permitAll()
                //.and()
//                禁用csrf配置,默認(rèn)開(kāi)啟的(一般不寫(xiě),頁(yè)面要加csrf),這里我們測(cè)試下
//                .and()
//                .csrf()
//                .disable()
                ;
    }

主要配置信息如下:

  • 指定認(rèn)證對(duì)象 SysUserService (UserDetailsService類(lèi)型)
  • 指定了用戶(hù)密碼使用的加密對(duì)象
  • SpringSecurity配置相關(guān)信息,比如:指定攔截規(guī)則,指定自定義的認(rèn)證頁(yè)面,csrf等。

2、前端整合

在 Spring Security 中,如果我們不做任何配置,默認(rèn)的登錄頁(yè)面和登錄接口的地址都是 /login,即默認(rèn)會(huì)存在如下兩個(gè)請(qǐng)求:

  • GET http://localhost:8080/login
  • POST http://localhost:8080/login

如果是 GET 請(qǐng)求表示你想訪(fǎng)問(wèn)登錄頁(yè)面,如果是 POST 請(qǐng)求,表示你想提交登錄數(shù)據(jù)。默認(rèn)的表單字段為 username和password。

SpringSecurity 默認(rèn) 是開(kāi)啟 csrf防護(hù)機(jī)制。
所以,在自定義的表單上添加上 _csrf隱藏input(必須要寫(xiě)在form表單里面)。

引入 security標(biāo)簽庫(kù)
<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
<security:csrfInput/>

啟動(dòng)項(xiàng)目,登錄認(rèn)證訪(fǎng)問(wèn)ok.

三、整合 Spring Security實(shí)現(xiàn)用戶(hù)授權(quán)

認(rèn)證過(guò)程獲取用戶(hù)信息時(shí),我們已經(jīng)把用戶(hù)關(guān)聯(lián)的角色信息設(shè)置到了 UserDetails中,所以,我們只需要分配 資源訪(fǎng)問(wèn)的角色就可以了。

1、后端

1.1 開(kāi)啟 Spring Security權(quán)限控制

Spring Security可以通過(guò)注解的方式來(lái)控制類(lèi)或者方法的訪(fǎng)問(wèn)權(quán)限。支持開(kāi)啟權(quán)限控制的注解類(lèi)型如下:

  • jsr250-annotations:表示支持 jsr250-api的注解
  • pre-post-annotations:表示支持 spring表達(dá)式注解
  • secured-annotations:這才是 Spring Security提供的注解

在這里插入圖片描述

在實(shí)際開(kāi)發(fā)中,用一類(lèi)即可,三個(gè)都開(kāi)啟也沒(méi)關(guān)系。
在 SpringSecurity配置類(lèi)上 添加 @EnableGlobalMethodSecurity注解,表示開(kāi)啟 Spring Security權(quán)限控制,這里我們?nèi)?lèi)都開(kāi)啟了。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled=true, prePostEnabled = true, jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    ...
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled=true, prePostEnabled = true, jsr250Enabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
...

1.2 在角色對(duì)應(yīng)類(lèi)或者方法上添加權(quán)限注解

1.2.1 使用 Spring Security注解

  • @Secured({“ROLE_ADMIN”,“ROLE_PRODUCT”})
@Controller
@RequestMapping("/user")
@Secured("ROLE_ADMIN") 	//表示當(dāng)前類(lèi)中所有方法需要 ROLE_ADMIN才能訪(fǎng)問(wèn)
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/findAll")
    public String findAll(Model model){
        List<SysUser> list = userService.findAll();
        model.addAttribute("list", list);
        return "user-list";
    }
    。。。
 }

1.2.2 使用 Spring表達(dá)式注解

  • @PreAuthorize(“hasAnyRole(‘ROLE_ADMIN’,‘ROLE_PRODUCT’)”)
@Controller
@RequestMapping("/product")
public class ProductController {
    
    @RequestMapping("/findAll")
    //表示當(dāng)前類(lèi)中findAll方法需要 ROLE_ADMIN或者 ROLE_PRODUCT才能訪(fǎng)問(wèn)
    @PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_PRODUCT')") 
    public String findAll(){
        return "product-list";
    }
}

1.2.3 使用 JSR-250注解

  • @RolesAllowed({“ROLE_ADMIN”,“ROLE_User”})
@Controller
@RequestMapping("/order")
@RolesAllowed({"ROLE_ADMIN","ROLE_USER"}) //表示當(dāng)前類(lèi)中所有方法都需要ROLE_ADMIN或者ROLE_User才能訪(fǎng)問(wèn)
public class OrderController {
    
    @RequestMapping("/findAll")
    public String findAll(){
        return "order-list";
    }
}

2、前端

在jsp業(yè)頁(yè)面中,對(duì)每個(gè)菜單資源通過(guò) SpringSecurity標(biāo)簽庫(kù)指定訪(fǎng)問(wèn)所需的角色。

<%@taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
<!-- 指定訪(fǎng)問(wèn)所需角色 -->
<security:authorize access="hasAnyRole('ROLE_ADMIN', '等等')">

啟動(dòng)項(xiàng)目,通過(guò)不同的用戶(hù)登錄,授權(quán)訪(fǎng)問(wèn)ok.

到此這篇關(guān)于Spring Security使用數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán)的文章就介紹到這了,更多相關(guān)Spring Security數(shù)據(jù)庫(kù)登錄認(rèn)證授權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Map集合(接口)的基本方法程序演示

    Java中Map集合(接口)的基本方法程序演示

    這篇文章主要為大家詳細(xì)介紹了Java中Map集合的基本方法程序演示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Mybatis如何自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)總結(jié)

    Mybatis如何自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)總結(jié)

    這篇文章主要給大家介紹了關(guān)于Mybatis如何自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 介紹Java的大數(shù)類(lèi)(BigDecimal)和八種舍入模式

    介紹Java的大數(shù)類(lèi)(BigDecimal)和八種舍入模式

    在實(shí)際應(yīng)用中,需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理。Java在java.math包中提供的API類(lèi)BigDecimal,用來(lái)對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算。本文將介紹Java中的大數(shù)類(lèi)BigDecimal及其八種舍入模式,有需要的可以參考借鑒。
    2016-08-08
  • Java多線(xiàn)程中wait?notify等待喚醒機(jī)制詳解

    Java多線(xiàn)程中wait?notify等待喚醒機(jī)制詳解

    這篇文章主要介紹了Java多線(xiàn)程中wait?notify等待喚醒機(jī)制,由于線(xiàn)程之間是搶占式執(zhí)行的,因此線(xiàn)程的執(zhí)行順序難以預(yù)知,但是實(shí)際開(kāi)發(fā)中有時(shí)候我們希望合理的協(xié)調(diào)多個(gè)線(xiàn)程之間的執(zhí)行先后順序,所以這里我們來(lái)介紹下等待喚醒機(jī)制,需要的朋友可以參考下
    2024-10-10
  • Java實(shí)現(xiàn)掃雷游戲詳細(xì)代碼講解

    Java實(shí)現(xiàn)掃雷游戲詳細(xì)代碼講解

    windows自帶的游戲《掃雷》是陪伴了無(wú)數(shù)人的經(jīng)典游戲,本文將利用Java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • java實(shí)現(xiàn)的海盜算法優(yōu)化版

    java實(shí)現(xiàn)的海盜算法優(yōu)化版

    這篇文章主要介紹了java實(shí)現(xiàn)的海盜算法優(yōu)化版,結(jié)合實(shí)例形式分析了java海盜算法的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題

    nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題

    這篇文章主要介紹了nacos配置注冊(cè)中心時(shí)指定命名空間不起作用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • Java?中的整型數(shù)據(jù)類(lèi)型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場(chǎng)景分析

    Java?中的整型數(shù)據(jù)類(lèi)型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場(chǎng)景

    Java中的整型數(shù)據(jù)類(lèi)型包括byte、short、int和long,每種類(lèi)型都有不同的內(nèi)存占用和取值范圍,選擇合適的整型類(lèi)型取決于具體需求,如內(nèi)存敏感場(chǎng)景、性能考量和避免整數(shù)溢出,示例代碼展示了如何聲明和初始化不同整型變量,并打印它們的最大值,感興趣的朋友一起看看吧
    2025-03-03
  • 圖解Java排序算法之快速排序的三數(shù)取中法

    圖解Java排序算法之快速排序的三數(shù)取中法

    這篇文章主要為大家詳細(xì)介紹了Java排序算法之快速排序的三數(shù)取中法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • selenium+java環(huán)境搭建過(guò)程推薦

    selenium+java環(huán)境搭建過(guò)程推薦

    這篇文章主要介紹了selenium+java環(huán)境搭建過(guò)程推薦,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論

建德市| 宝兴县| 天祝| 石首市| 铜陵市| 上高县| 英山县| 邵阳市| 闽清县| 南昌县| 梁平县| 栖霞市| 嘉定区| 木里| 依安县| 乌鲁木齐县| 仙游县| 惠安县| 栾城县| 永善县| 台江县| 东阳市| 滦南县| 望城县| 昌吉市| 仁怀市| 彭阳县| 肥东县| 黄龙县| 建宁县| 沙坪坝区| 泸水县| 承德县| 德安县| 宕昌县| 涡阳县| 石首市| 琼海市| 阿克陶县| 大安市| 乐清市|