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

Spring Security將用戶數(shù)據(jù)存儲到數(shù)據(jù)庫的方法

 更新時間:2020年09月25日 10:35:03   作者:南淮北安  
這篇文章主要介紹了Spring Security將用戶數(shù)據(jù)存儲到數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、UserDetailService

Spring Security 支持多種不同的數(shù)據(jù)源,這些不同的數(shù)據(jù)源最終都將被封裝成 UserDetailsService 的實(shí)例,在微人事(https://github.com/lenve/vhr)項目中,我們是自己來創(chuàng)建一個類實(shí)現(xiàn) UserDetailsService 接口,除了自己封裝,我們也可以使用系統(tǒng)默認(rèn)提供的 UserDetailsService 實(shí)例,例如上篇文章和大家介紹的 InMemoryUserDetailsManager 。

我們來看下 UserDetailsService 都有哪些實(shí)現(xiàn)類:

在這里插入圖片描述

可以看到,在幾個能直接使用的實(shí)現(xiàn)類中,除了 InMemoryUserDetailsManager 之外,還有一個 JdbcUserDetailsManager,使用 JdbcUserDetailsManager 可以讓我們通過 JDBC 的方式將數(shù)據(jù)庫和 Spring Security 連接起來。

這里需要加入jdbc 和mysql 依賴:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency> 

二、JdbcUserDetailsManager

JdbcUserDetailsManager 自己提供了一個數(shù)據(jù)庫模型,這個數(shù)據(jù)庫模型保存在如下位置:

org/springframework/security/core/userdetails/jdbc/users.ddl

這里存儲的腳本內(nèi)容如下:

create table users(username varchar_ignorecase(50) not null primary key,password varchar_ignorecase(500) not null,enabled boolean not null);
create table authorities (username varchar_ignorecase(50) not null,authority varchar_ignorecase(50) not null,constraint fk_authorities_users foreign key(username) references users(username));
create unique index ix_auth_username on authorities (username,authority);

可以看到,腳本中有一種數(shù)據(jù)類型 varchar_ignorecase,這個其實(shí)是針對 HSQLDB 數(shù)據(jù)庫創(chuàng)建的,而我們使用的 MySQL 并不支持這種數(shù)據(jù)類型,所以這里需要大家手動調(diào)整一下數(shù)據(jù)類型,將 varchar_ignorecase 改為 varchar 即可。

create table users(username varchar(50) not null primary key,password varchar(500) not null,enabled boolean not null);
create table authorities (username varchar(50) not null,authority varchar(50) not null,constraint fk_authorities_users foreign key(username) references users(username));
create unique index ix_auth_username on authorities (username,authority);

修改完成后,創(chuàng)建數(shù)據(jù)庫,執(zhí)行完成后的腳本。

在這里插入圖片描述

執(zhí)行完 SQL 腳本后,我們可以看到一共創(chuàng)建了兩張表:users 和 authorities。

users 表中保存用戶的基本信息,包括用戶名、用戶密碼以及賬戶是否可用。
authorities 中保存了用戶的角色。
authorities 和 users 通過 username 關(guān)聯(lián)起來。

配置完成后,接下來,我們將上篇文章中通過 InMemoryUserDetailsManager 提供的用戶數(shù)據(jù)用 JdbcUserDetailsManager 代替掉,如下:

@Autowired
  DataSource dataSource;

  @Override
  @Bean
  protected UserDetailsService userDetailsService() {
    JdbcUserDetailsManager manager = new JdbcUserDetailsManager();
    manager.setDataSource(dataSource);
    if (!manager.userExists("yolo")) {
      manager.createUser(User.withUsername("yolo").password("123").roles("admin").build());
    }
    if (!manager.userExists("nlcs")) {
      manager.createUser(User.withUsername("nlcs").password("123").roles("user").build());
    }
    return manager;
  }

這段配置的含義如下:

(1)首先構(gòu)建一個 JdbcUserDetailsManager 實(shí)例。
(2)給 JdbcUserDetailsManager 實(shí)例添加一個 DataSource 對象。
(3)調(diào)用 userExists 方法判斷用戶是否存在,如果不存在,就創(chuàng)建一個新的用戶出來(因?yàn)槊看雾椖繂訒r這段代碼都會執(zhí)行,所以加一個判斷,避免重復(fù)創(chuàng)建用戶)。
(4)用戶的創(chuàng)建方法和我們之前 InMemoryUserDetailsManager 中的創(chuàng)建方法基本一致。

這里的 createUser 或者 userExists 方法其實(shí)都是調(diào)用寫好的 SQL 去判斷的,我們從它的源碼里就能看出來(部分):

public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsManager,
 GroupManager {
 public static final String DEF_USER_EXISTS_SQL = "select username from users where username = ?";

 private String userExistsSql = DEF_USER_EXISTS_SQL;

 public boolean userExists(String username) {
 List<String> users = getJdbcTemplate().queryForList(userExistsSql,
  new String[] { username }, String.class);

 if (users.size() > 1) {
  throw new IncorrectResultSizeDataAccessException(
   "More than one user found with name '" + username + "'", 1);
 }

 return users.size() == 1;
 }
}

從這段源碼中就可以看出來,userExists 方法的執(zhí)行邏輯其實(shí)就是調(diào)用 JdbcTemplate 來執(zhí)行預(yù)定義好的 SQL 腳本,進(jìn)而判斷出用戶是否存在,其他的判斷方法都是類似,我就不再贅述。

三、數(shù)據(jù)庫支持

通過前面的代碼,大家看到這里需要數(shù)據(jù)庫支持,所以我們在項目中添加如下兩個依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

然后再在 application.properties 中配置一下數(shù)據(jù)庫連接:

spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/security?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

因?yàn)檫@里選擇的是 Mysql 8 所以配置信息里需要加入:serverTimezone=Asia/Shanghai

配置完成后,就可以啟動項目。

項目啟動成功后,我們就可以看到數(shù)據(jù)庫中自動添加了兩個用戶進(jìn)來,并且用戶都配置了角色。如下圖:

在這里插入圖片描述

在這里插入圖片描述

四、測試登錄

接下來我們就可以進(jìn)行測試了。

在這里插入圖片描述

在這里插入圖片描述

在測試的過程中,如果在數(shù)據(jù)庫中將用戶的 enabled 屬性設(shè)置為 false,表示禁用該賬戶,此時再使用該賬戶登錄就會登錄失敗。

在這里插入圖片描述

在這里插入圖片描述

相關(guān)文章

  • 在Spring中使用Knife4j進(jìn)行API文檔生成與管理的操作方法

    在Spring中使用Knife4j進(jìn)行API文檔生成與管理的操作方法

    Knife4j 是為Java MVC 框架(如Spring Boot、Spring MVC等)集成 Swagger 生成 API 文檔的增強(qiáng)解決方案,它基于 Swagger 的核心功能,通過定制化的前端界面和一些額外的特性,本文介紹了在Spring中使用Knife4j進(jìn)行API文檔生成與管理的操作方法,需要的朋友可以參考下
    2024-12-12
  • MyBatis-Plus常見面試題和答案大全

    MyBatis-Plus常見面試題和答案大全

    Mybatis-Plus是一個基于Mybatis的增強(qiáng)工具,它簡化了Mybatis的開發(fā)流程,提供了許多實(shí)用的功能,如自動生成代碼、分頁查詢、條件構(gòu)造器、性能分析等,這篇文章主要給大家介紹了關(guān)于MyBatis-Plus常見面試題和答案的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Java中常用的Lambda表達(dá)式案例解析

    Java中常用的Lambda表達(dá)式案例解析

    這篇文章主要介紹了Java中常用的Lambda表達(dá)式案例解析,Lambxda?使用比較多的場景,就是集合類下的?Lambda?流操作,往往幾行代碼可以幫助我們實(shí)現(xiàn)復(fù)雜代碼,下面和我小編一起進(jìn)入文章學(xué)習(xí)該詳細(xì)內(nèi)容吧
    2022-04-04
  • spring+srpingmvc+hibernate實(shí)現(xiàn)動態(tài)ztree生成樹狀圖效果

    spring+srpingmvc+hibernate實(shí)現(xiàn)動態(tài)ztree生成樹狀圖效果

    這篇文章主要介紹了spring+srpingmvc+hibernate動態(tài)ztree生成樹狀圖效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • springboot+vue實(shí)現(xiàn)Token自動續(xù)期(雙Token方案)

    springboot+vue實(shí)現(xiàn)Token自動續(xù)期(雙Token方案)

    雙Token方案通過訪問令牌和刷新令牌提高用戶登錄安全性和體驗(yàn),訪問令牌有效期短,包含用戶信息,用于請求校驗(yàn),本文就來介紹一下springboot+vue實(shí)現(xiàn)Token自動續(xù)期(雙Token方案),感興趣的可以了解一下
    2024-10-10
  • Java計算文本MD5加密值的方法示例

    Java計算文本MD5加密值的方法示例

    這篇文章主要介紹了Java計算文本MD5加密值的方法,結(jié)合實(shí)例形式分析了Java基于security實(shí)現(xiàn)md5加密算法進(jìn)行文本加密相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • Springmvc RequestMapping請求實(shí)現(xiàn)方法解析

    Springmvc RequestMapping請求實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Springmvc RequestMapping請求實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 詳解Java8?CompletableFuture的并行處理用法

    詳解Java8?CompletableFuture的并行處理用法

    Java8中有一個工具非常有用,那就是CompletableFuture,本章主要講解CompletableFuture的并行處理用法,感興趣的小伙伴可以了解一下
    2022-04-04
  • 詳解Java中Quartz的簡單使用

    詳解Java中Quartz的簡單使用

    Quartz?是一個開源的作業(yè)調(diào)度框架,它完全由?Java?寫成,并設(shè)計用于?J2SE?和?J2EE?應(yīng)用中。這篇文章主要通過示例和大家講講Quartz的簡單使用,需要的可以參考一下
    2023-04-04
  • 關(guān)于MyBaties的基本配置標(biāo)簽總結(jié)

    關(guān)于MyBaties的基本配置標(biāo)簽總結(jié)

    今天給大家?guī)淼氖顷P(guān)于MyBaties基礎(chǔ)的相關(guān)知識,文章圍繞著MyBaties的基本配置標(biāo)簽展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論

磴口县| 大丰市| 新野县| 乌海市| 新民市| 囊谦县| 闽侯县| 石狮市| 萝北县| 秦皇岛市| 从化市| 瑞昌市| 邵东县| 宝清县| 雷州市| 博湖县| 益阳市| 华蓥市| 永年县| 天台县| 赣州市| 临桂县| 个旧市| 加查县| 满城县| 灌南县| 门头沟区| 大同市| 离岛区| 喀什市| 璧山县| 贡山| 宿迁市| 桃源县| 乳源| 保德县| 宿迁市| 长兴县| 太保市| 司法| 太和县|