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

SpringSecurity實(shí)現(xiàn)自定義用戶認(rèn)證方案

 更新時(shí)間:2025年01月22日 09:31:01   作者:pan_junbiao  
Spring?Security?實(shí)現(xiàn)自定義用戶認(rèn)證方案可以根據(jù)具體需求和業(yè)務(wù)場景進(jìn)行設(shè)計(jì)和實(shí)施,滿足不同的安全需求和業(yè)務(wù)需求,這種靈活性使得認(rèn)證機(jī)制能夠更好地適應(yīng)各種復(fù)雜的環(huán)境和變化?,本文給大家介紹了SpringSecurity實(shí)現(xiàn)自定義用戶認(rèn)證方案,需要的朋友可以參考下

Spring Security 實(shí)現(xiàn)自定義用戶認(rèn)證方案可以根據(jù)具體需求和業(yè)務(wù)場景進(jìn)行設(shè)計(jì)和實(shí)施,滿足不同的安全需求和業(yè)務(wù)需求。這種靈活性使得認(rèn)證機(jī)制能夠更好地適應(yīng)各種復(fù)雜的環(huán)境和變化‌。通過自定義認(rèn)證方案,可以更好地控制和管理用戶的訪問權(quán)限,確保數(shù)據(jù)和應(yīng)用程序的安全性和可靠性。

基于 Spring Security 自定義用戶認(rèn)證方案的開發(fā)流程如下圖:

UserDetails 接口代表用戶詳細(xì)信息,而負(fù)責(zé)對 UserDetails 進(jìn)行各種操作的則是 UserDetailsService 接口。因此,實(shí)現(xiàn)自定義用戶認(rèn)證方案首先要做的是實(shí)現(xiàn) UserDetails 和 UserDetailsService 接口。同時(shí),如果擴(kuò)展了用信息,可以結(jié)合 AuthenticationProvider 接口來擴(kuò)展整個(gè)認(rèn)證流程。

1、SpringBoot 整合 SpringSecurity 框架

【示例】SpringBoot 整合 SpringSecurity 創(chuàng)建一個(gè)自定義用戶認(rèn)證應(yīng)用。

1.1 創(chuàng)建 Spring Boot 項(xiàng)目

創(chuàng)建 SpringBoot 項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下圖:

1.2 添加 Maven 依賴

在 pom.xml 配置文件中添加 Spring Security、Thymeleaf 模板引擎、Lombok 依賴。

<!-- Spring Security 依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.7.18</version>
</dependency>
 
<!-- Lombok 依賴 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
 
<!-- 引入Thymeleaf模板引擎 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2、Spring Security 實(shí)現(xiàn)自定義用戶認(rèn)證方案

Spring Security 所做的工作只是把常見的、符合一般業(yè)務(wù)場景的實(shí)現(xiàn)方法進(jìn)行抽象并嵌入框架中,開發(fā)人員完全可以自定義用戶認(rèn)證方案。

2.1 擴(kuò)展 UserDetails

擴(kuò)展 UserDetails 的方法是直接實(shí)現(xiàn)該接口。

package com.pjb.model;
 
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
 
import java.util.Collection;
import java.util.List;
 
/**
 * 自定義用戶認(rèn)證類:擴(kuò)展 UserDetails 接口
 * @author pan_junbiao
 **/
@Data
public class LoginUserDetails implements UserDetails
{
    private Long userId;
    private String username;
    private String password;
    private String BlogName; //博客名稱
    private String BlogUrl;  //博客地址
    private List<GrantedAuthority> authoritys; //權(quán)限集合
 
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities()
    {
        return this.authoritys;
    }
 
    public void setAuthoritys(List<GrantedAuthority> authoritys)
    {
        this.authoritys = authoritys;
    }
 
    @Override
    public boolean isAccountNonExpired()
    {
        return true;
    }
 
    @Override
    public boolean isAccountNonLocked()
    {
        return true;
    }
 
    @Override
    public boolean isCredentialsNonExpired()
    {
        return true;
    }
 
    @Override
    public boolean isEnabled()
    {
        return true;
    }
}

2.2 擴(kuò)展 UserDetailsService

接下來我們實(shí)現(xiàn) UserDetailsService 接口。

package com.pjb.service;
 
import com.pjb.model.LoginUserDetails;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
/**
 * 登錄服務(wù)類:擴(kuò)展 UserDetailsService 接口
 * @author pan_junbiao
 **/
@Service
public class LoginUserDetailsService implements UserDetailsService
{
 
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
    {
        //模擬數(shù)據(jù)庫查詢
        LoginUserDetails user = this.findByUsername(username);
        if (user != null)
        {
            return user;
        }
 
        //未查詢到用戶信息,則拋出異常
        throw new UsernameNotFoundException("未找到用戶名稱為:" + username + "的用戶信息");
    }
 
    /**
     * 模擬數(shù)據(jù)庫查詢
     */
    private LoginUserDetails findByUsername(String username)
    {
        LoginUserDetails loginUserDetails = null;
        if (username != null && username.equals("panjunbiao"))
        {
            loginUserDetails = new LoginUserDetails();
            loginUserDetails.setUserId(1L);
            loginUserDetails.setUsername(username);
            loginUserDetails.setPassword("123456");
            loginUserDetails.setBlogName("您好,歡迎訪問 pan_junbiao的博客");
            loginUserDetails.setBlogUrl("https://blog.csdn.net/pan_junbiao");
 
            //設(shè)置權(quán)限
            List<GrantedAuthority> grantedAuthorityList = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_USER");
            loginUserDetails.setAuthoritys(grantedAuthorityList);
        }
        return loginUserDetails;
    }
}

2.3 擴(kuò)展 AuthenticationProvider

擴(kuò)展 AuthenticationProvider 是實(shí)現(xiàn)自定義認(rèn)證流程的最后一步,這個(gè)過程提供一個(gè)自定義的 AuthenticationProvider 實(shí)現(xiàn)類。

package com.pjb.provider;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
 
/**
 * 登錄認(rèn)證類:擴(kuò)展 AuthenticationProvider
 * @author pan_junbiao
 **/
@Component
public class LoginAuthenticationProvider implements AuthenticationProvider
{
    @Autowired
    private UserDetailsService userDetailsService;
 
    @Autowired
    private PasswordEncoder passwordEncoder;
 
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException
    {
        //從 Authentication 對象中獲取用戶名稱和身份憑證信息
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();
 
        UserDetails user = userDetailsService.loadUserByUsername(username);
        if (passwordEncoder.matches(password, user.getPassword()))
        {
            //密碼匹配成功,則構(gòu)建一個(gè) UsernamePasswordAuthenticationToken 對象并返回
            return new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), user.getAuthorities());
        } else
        {
            //密碼匹配失敗,則拋出異常
            throw new BadCredentialsException("用戶密碼不正確");
        }
    }
 
    @Override
    public boolean supports(Class<?> authenticationType)
    {
        return authenticationType.equals(UsernamePasswordAuthenticationToken.class);
    }
}

3、Spring Security 的處理類

3.1 登錄成功處理類

package com.pjb.handler;
 
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * 登錄成功處理類
 */
@Component
public class LoginSuccessHandler implements AuthenticationSuccessHandler
{
    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException
    {
        //重定向至首頁
        httpServletResponse.sendRedirect("/");
    }
}

3.2 登錄失敗處理類

package com.pjb.handler;
 
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.CredentialsExpiredException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
 
/**
 * 登錄失敗處理類
 */
@Component
public class LoginFailureHandler implements AuthenticationFailureHandler
{
    @Override
    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException authenticationException) throws IOException, ServletException
    {
        //獲取登錄失敗原因
        String errorMessage = "";
        if(authenticationException instanceof BadCredentialsException){
            errorMessage = "用戶名或密碼不正確";
        }else if(authenticationException instanceof DisabledException){
            errorMessage = "賬號被禁用";
        }else if(authenticationException instanceof UsernameNotFoundException){
            errorMessage = "用戶名不存在";
        }else if(authenticationException instanceof CredentialsExpiredException){
            errorMessage = "密碼已過期";
        }else if(authenticationException instanceof LockedException) {
            errorMessage = "賬號被鎖定";
        }else{
            errorMessage = "未知異常";
        }
 
        //設(shè)置響應(yīng)編碼
        httpServletResponse.setContentType("application/json;charset=utf-8");
        PrintWriter out = httpServletResponse.getWriter();
        out.write(errorMessage);
    }
}

3.3 403無權(quán)限處理類

package com.pjb.handler;
 
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;
import java.io.PrintWriter;
 
/**
 * 403無權(quán)限處理類
 */
@Component
public class PermissionDeniedHandler implements AccessDeniedHandler
{
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException
    {
        httpServletResponse.setContentType("application/json;charset=utf-8");
        PrintWriter out = httpServletResponse.getWriter();
        out.write("403無權(quán)限");
    }
}

4、Spring Security 的核心配置類

創(chuàng)建 WebSecurityConfig 類(Spring Security 配置類),并添加 @EnableWebSecurity 注解和繼承 WebSecurityConfigurerAdapter 類。

package com.pjb.config;
 
import com.pjb.handler.LoginFailureHandler;
import com.pjb.handler.LoginSuccessHandler;
import com.pjb.handler.PermissionDeniedHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationProvider;
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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
 
/**
 * Spring Security 配置類
 * @author pan_junbiao
 **/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Autowired
    private LoginSuccessHandler loginSuccessHandler;
 
    @Autowired
    private LoginFailureHandler loginFailureHandler;
 
    @Autowired
    private PermissionDeniedHandler permissionDeniedHandler;
 
    //自定義的擴(kuò)展 UserDetailsService 類
    @Autowired
    private UserDetailsService loginUserDetailsService;
 
    //自定義的擴(kuò)展 AuthenticationProvider 類
    @Autowired
    private AuthenticationProvider loginAuthenticationProvider;
 
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.authorizeRequests() //返回一個(gè)URL攔截注冊器
                .anyRequest() //匹配所有的請求
                .authenticated() //所有匹配的URL都需要被認(rèn)證才能訪問
                .and() //結(jié)束當(dāng)前標(biāo)簽,讓上下文回到 HttpSecurity
                .formLogin() //啟動(dòng)表單認(rèn)證
                .loginPage("/myLogin.html") //自定義登錄頁面
                .loginProcessingUrl("/auth/form") //指定處理登錄請求路徑
                .permitAll() //使登錄頁面不設(shè)限訪問
                //.defaultSuccessUrl("/index") //登錄認(rèn)證成功后的跳轉(zhuǎn)頁面
                .successHandler(loginSuccessHandler) //指定登錄成功時(shí)的處理
                .failureHandler(loginFailureHandler) //指定登錄失敗時(shí)的處理
                .and()
                .exceptionHandling().accessDeniedHandler(permissionDeniedHandler) //403無權(quán)時(shí)的返回操作
                .and().csrf().disable(); //關(guān)閉CSRF的防御功能
    }
 
    /**
     * 核心代碼:
     * 將擴(kuò)展的 LoginUserDetailsService 和 LoginAuthenticationProvider 注入,
     * 并將其添加到 AuthenticationManagerBuilder 中,這樣 AuthenticationManagerBuilder 將基于上述
     * 自定義的 LoginUserDetailsService 來完成 UserDetails 的創(chuàng)建和管理,
     * 并基于自定義的 LoginAuthenticationProvider 完成用戶認(rèn)證。
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.userDetailsService(loginUserDetailsService);
        auth.authenticationProvider(loginAuthenticationProvider);
    }
 
    /**
     * 由于5.x版本之后默認(rèn)啟用了委派密碼編譯器,
     * 因而按照以往的方式設(shè)置內(nèi)存密碼將會讀取異常,
     * 所以需要暫時(shí)將密碼編碼器設(shè)置為 NoOpPasswordEncoder
     */
    @Bean
    public PasswordEncoder passwordEncoder()
    {
        return NoOpPasswordEncoder.getInstance();
    }
}

將擴(kuò)展的 LoginUserDetailsService 和 LoginAuthenticationProvider 注入,并將其添加到 AuthenticationManagerBuilder 中,這樣 AuthenticationManagerBuilder 將基于上述自定義的 LoginUserDetailsService 來完成 UserDetails 的創(chuàng)建和管理,并基于自定義的 LoginAuthenticationProvider 完成用戶認(rèn)證。

5、前端頁面

5.1 控制器層

創(chuàng)建 IndexController 類(首頁控制器),實(shí)現(xiàn)獲取當(dāng)前登錄用戶名并跳轉(zhuǎn)至首頁。

package com.pjb.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
 
/**
 * 首頁控制器
 * @author pan_junbiao
 **/
@Controller
public class IndexController
{
    /**
     * 首頁
     */
    @RequestMapping("/")
    public String index(HttpServletRequest request)
    {
        //獲取當(dāng)前登錄人
        String userName = "未登錄";
        Principal principal = request.getUserPrincipal();
        if (principal != null)
        {
            userName = principal.getName();
        }
 
        //返回頁面
        request.setAttribute("userName", userName);
        return "/index.html";
    }
}

5.2 編寫登錄頁面

在 resources\static 靜態(tài)資源目錄下,創(chuàng)建 myLogin.html 頁面。

注意:myLogin.html 頁面必須放在 resources\static 靜態(tài)資源目錄下,否則頁面無法加載。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
    <meta name="author" content="pan_junbiao的博客">
</head>
<body>
<form name="myForm" action="/auth/form" method="post">
    <table align="center">
        <caption>用戶登錄</caption>
        <tr>
            <td>登錄賬戶:</td>
            <td>
                <input type="text" name="username" placeholder="請輸入登錄賬戶" value="panjunbiao" />
            </td>
        </tr>
        <tr>
            <td>登錄密碼:</td>
            <td>
                <input type="password" name="password" placeholder="請輸入登錄密碼" value="123456" />
            </td>
        </tr>
        <!-- 以下是提交、取消按鈕 -->
        <tr>
            <td colspan="2" style="text-align: center; padding: 5px;">
                <input type="submit" value="提交" />
                <input type="reset" value="重置" />
            </td>
        </tr>
    </table>
</form>
</body>
</html>

5.3 編寫首頁

在 resources\templates 資源目錄下,創(chuàng)建 index.html 頁面。

注意:首頁 index.html 頁面中使用 Thymeleaf 模板 。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
    <meta name="author" content="pan_junbiao的博客">
</head>
<body>
    <h1 style="color: red">Hello,Spring Security</h1>
    <p>博客信息:您好,歡迎訪問 pan_junbiao的博客</p>
    <p>博客地址:https://blog.csdn.net/pan_junbiao</p>
    <p th:text="'當(dāng)前登錄人:' + ${userName}"></p>
    <a href="/logout" rel="external nofollow"  onclick="return confirm('確認(rèn)注銷嗎?');">登出</a>
</body>
</html>

6、運(yùn)行項(xiàng)目

6.1 登錄頁面

6.2 登錄成功后,跳轉(zhuǎn)至首頁

以上就是SpringSecurity實(shí)現(xiàn)自定義用戶認(rèn)證方案的詳細(xì)內(nèi)容,更多關(guān)于SpringSecurity自定義用戶認(rèn)證的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot 集成 Druid過程解析

    SpringBoot 集成 Druid過程解析

    這篇文章主要介紹了SpringBoot 集成 Druid過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java開發(fā)者結(jié)合Node.js編程入門教程

    Java開發(fā)者結(jié)合Node.js編程入門教程

    這篇文章主要介紹了Java開發(fā)者結(jié)合Node.js編程入門教程,我將先向您展示如何使用Java EE創(chuàng)建一個(gè)簡單的Rest服務(wù)來讀取 MongoDB數(shù)據(jù)庫。然后我會用node.js來實(shí)現(xiàn)相同的功能,需要的朋友可以參考下
    2014-09-09
  • Java中Arrays的介紹及使用方法示例

    Java中Arrays的介紹及使用方法示例

    這篇文章主要給大家介紹了關(guān)于Java中Arrays及使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java處理圖片背景顏色的方法

    java處理圖片背景顏色的方法

    這篇文章主要為大家詳細(xì)介紹了java處理圖片背景顏色的方法,藍(lán)底寸照批量轉(zhuǎn)換為白底,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Java Idea高效率配置技巧實(shí)例解析

    Java Idea高效率配置技巧實(shí)例解析

    這篇文章主要介紹了Java Idea高效率配置技巧實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java新手入門學(xué)習(xí)之正則表達(dá)式

    Java新手入門學(xué)習(xí)之正則表達(dá)式

    這篇文章主要給大家介紹了關(guān)于Java新手入門學(xué)習(xí)之正則表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Sleuth(Micrometer)+ZipKin分布式鏈路問題小結(jié)

    Sleuth(Micrometer)+ZipKin分布式鏈路問題小結(jié)

    在微服務(wù)架構(gòu)中,分布式鏈路追蹤技術(shù)成為了解決系統(tǒng)復(fù)雜調(diào)用問題的關(guān)鍵,本文介紹了其他鏈路追蹤方案,如Cat、Pinpoint和Skywalking,展示了分布式鏈路追蹤技術(shù)的多樣化,感興趣的朋友一起看看吧
    2024-10-10
  • JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動(dòng)裝箱/自動(dòng)拆箱以及BigDecimal

    JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動(dòng)裝箱/自動(dòng)拆箱以及BigDecimal

    這篇文章主要給大家介紹了關(guān)于JAVA新手小白學(xué)正則表達(dá)式、包裝類、自動(dòng)裝箱/自動(dòng)拆箱以及BigDecimal的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 如何通過jstack命令dump線程信息

    如何通過jstack命令dump線程信息

    這篇文章主要介紹了如何通過jstack命令dump線程信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 使用maven生成可執(zhí)行的jar包的方法

    使用maven生成可執(zhí)行的jar包的方法

    這篇文章主要介紹了使用maven生成可執(zhí)行的jar包的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論

汤原县| 汾西县| 安仁县| 孙吴县| 绥德县| 丹寨县| 喀喇| 渝中区| 犍为县| 博野县| 玉门市| 谷城县| 中山市| 塔城市| 汾西县| 财经| 恩施市| 沂水县| 沐川县| 永福县| 从江县| 榆社县| 西盟| 金平| 广汉市| 宣城市| 韩城市| 河南省| 彰化县| 新和县| 班玛县| 贡嘎县| 仙游县| 德江县| 乌兰察布市| 赤水市| 镇江市| 苍梧县| 临沧市| 阿图什市| 尼勒克县|