日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Security將用戶數據存儲到數據庫的方法

瀏覽:19日期:2023-08-12 09:12:17

一、UserDetailService

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

我們來看下 UserDetailsService 都有哪些實現類:

Spring Security將用戶數據存儲到數據庫的方法

可以看到,在幾個能直接使用的實現類中,除了 InMemoryUserDetailsManager 之外,還有一個 JdbcUserDetailsManager,使用 JdbcUserDetailsManager 可以讓我們通過 JDBC 的方式將數據庫和 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 自己提供了一個數據庫模型,這個數據庫模型保存在如下位置:

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

這里存儲的腳本內容如下:

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);

可以看到,腳本中有一種數據類型 varchar_ignorecase,這個其實是針對 HSQLDB 數據庫創建的,而我們使用的 MySQL 并不支持這種數據類型,所以這里需要大家手動調整一下數據類型,將 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);

修改完成后,創建數據庫,執行完成后的腳本。

Spring Security將用戶數據存儲到數據庫的方法

執行完 SQL 腳本后,我們可以看到一共創建了兩張表:users 和 authorities。

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

配置完成后,接下來,我們將上篇文章中通過 InMemoryUserDetailsManager 提供的用戶數據用 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)首先構建一個 JdbcUserDetailsManager 實例。(2)給 JdbcUserDetailsManager 實例添加一個 DataSource 對象。(3)調用 userExists 方法判斷用戶是否存在,如果不存在,就創建一個新的用戶出來(因為每次項目啟動時這段代碼都會執行,所以加一個判斷,避免重復創建用戶)。(4)用戶的創建方法和我們之前 InMemoryUserDetailsManager 中的創建方法基本一致。

這里的 createUser 或者 userExists 方法其實都是調用寫好的 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 方法的執行邏輯其實就是調用 JdbcTemplate 來執行預定義好的 SQL 腳本,進而判斷出用戶是否存在,其他的判斷方法都是類似,我就不再贅述。

三、數據庫支持

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

<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 中配置一下數據庫連接:

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

因為這里選擇的是 Mysql 8 所以配置信息里需要加入:serverTimezone=Asia/Shanghai

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

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

Spring Security將用戶數據存儲到數據庫的方法

Spring Security將用戶數據存儲到數據庫的方法

四、測試登錄

接下來我們就可以進行測試了。

Spring Security將用戶數據存儲到數據庫的方法

Spring Security將用戶數據存儲到數據庫的方法

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

Spring Security將用戶數據存儲到數據庫的方法

Spring Security將用戶數據存儲到數據庫的方法

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品成av人一区二区三区| 久久婷婷av| 午夜av不卡| 日韩久久一区二区三区| 免费在线观看一区| 黄色亚洲精品| 亚洲国产一区二区三区在线播放| 亚洲最新无码中文字幕久久| 91大神在线观看线路一区| 福利一区视频| 亚洲一区二区日韩| 欧洲一区二区三区精品| 成人亚洲精品| 日韩av中文在线观看| 亚洲天堂日韩在线| 蜜臀久久99精品久久久画质超高清 | 日韩在线二区| 欧美日韩尤物久久| 91精品综合| 婷婷综合网站| 亚洲免费中文| 亚洲精品大全| 7777精品| 国产精品久久亚洲不卡| 国产麻豆一区| 精品日韩一区| 欧美日韩国产v| 亚洲一级网站| 丝袜美腿一区二区三区| 日韩高清不卡一区| 麻豆高清免费国产一区| 日本免费一区二区三区四区| 天堂中文av在线资源库| 激情婷婷久久| 免费人成精品欧美精品| 欧美亚洲综合视频| 福利片在线一区二区| 日本久久成人网| 欧美日韩国产在线一区| 国产一区成人| 日韩毛片一区| 狠狠久久伊人中文字幕| 久久精品电影| 男人的天堂亚洲一区| 国产亚洲精品精品国产亚洲综合 | 人人精品久久| 另类小说一区二区三区| 婷婷成人在线| 亚洲精品乱码| 精品国产一级| 亚洲专区欧美专区| 国产伦理久久久久久妇女| 成人国产精品一区二区网站| 免费观看在线综合色| 久久只有精品| 亚洲美洲欧洲综合国产一区| 国产精品亚洲片在线播放| 亚洲天堂1区| 日本欧美韩国一区三区| 婷婷激情一区| 日本电影久久久| 国产 日韩 欧美一区| 日韩有吗在线观看| 久久精品卡一| 欧美精品国产| 午夜久久免费观看| 88久久精品| 樱桃视频成人在线观看| 亚洲欧美日韩综合国产aⅴ| 国产精品theporn| 在线观看精品| 国产伊人精品| 国产精品视频一区二区三区| 亚洲最新无码中文字幕久久 | 国产精品毛片aⅴ一区二区三区| 黄色欧美在线| 日韩视频一区二区三区在线播放免费观看| 四虎精品一区二区免费| 久久只有精品| 999在线观看精品免费不卡网站| 亚洲欧洲一区二区天堂久久| 日韩网站在线| 精品网站aaa| 美女精品一区| 麻豆视频观看网址久久| 欧美大黑bbbbbbbbb在线| 日韩精品a在线观看91| 高清不卡一区| 深夜福利亚洲| 成人免费电影网址| 日韩欧美中文字幕一区二区三区| 美女视频黄免费的久久| 水蜜桃久久夜色精品一区的特点| 久久精品资源| 亚洲精品亚洲人成在线观看| 国产高清不卡| 性欧美长视频| 久久不卡国产精品一区二区| 亚洲一级黄色| 欧美激情91| 亚洲综合欧美| 都市激情国产精品| 97精品资源在线观看| 国产精品普通话对白| 久久精品人人| 亚洲日产av中文字幕| 欧美不卡高清一区二区三区| 国产伦乱精品| 丝袜亚洲精品中文字幕一区| 中文字幕在线视频久| 日韩在线成人| 久久美女精品| 国产精品第一| 日韩中文字幕一区二区三区| 欧美综合精品| 亚洲影院天堂中文av色| 99热精品久久| 精品国产网站| 欧美亚洲色图校园春色| 亚洲一区欧美二区| 日韩欧美国产精品综合嫩v| 国产精品主播| 美美哒免费高清在线观看视频一区二区| 国产理论在线| 免费日韩一区二区三区| 欧美资源在线| 欧美1级日本1级| 国产不卡精品| 久久福利在线| 日本视频一区二区| 国产精品毛片一区二区三区| 色综合www| 国产一区二区三区成人欧美日韩在线观看 | 国产一区2区在线观看| 国产精品自拍区| 日本不卡高清视频| 蜜桃视频一区二区| 宅男噜噜噜66国产日韩在线观看| 国产一区不卡| 国产高清精品二区| 日韩精品视频网| 日韩av午夜在线观看| 婷婷五月色综合香五月| 欧美中文字幕| 久久亚洲视频| 免费中文字幕日韩欧美| 午夜宅男久久久| 久久国产高清| 国产精品女主播一区二区三区| 久久久精品久久久久久96| 国产精品yjizz视频网| 日本a级不卡| 国产精品一区二区99| 亚欧洲精品视频在线观看| 蜜臀精品一区二区三区在线观看| 国产精品av一区二区| 99成人在线视频| 久久精品国产亚洲夜色av网站| 香蕉人人精品| 免费观看久久av| 欧美特黄一级| 石原莉奈在线亚洲二区| 日韩激情一二三区| 国产亚洲高清一区| 国产日本久久| 麻豆久久久久久| 国产成人a视频高清在线观看| 国内在线观看一区二区三区 | 99国产精品自拍| 美女精品网站| 日欧美一区二区| 日韩三区四区| 国产乱码精品一区二区三区亚洲人| 国产精品三级| 国产亚洲人成a在线v网站| 国产伦一区二区三区| 精品国产一区二| 日韩毛片在线| 国产精品美女久久久| 亚洲精品影视| 国产精品久久乐| 福利一区视频| 亲子伦视频一区二区三区| 亚洲激情av| 日韩国产一二三区| 精品91福利视频| 亚洲大全视频| 日韩欧美中文字幕一区二区三区| 久久激情综合网| 精品一区二区三区的国产在线观看| 成人免费一区| 一本色道精品久久一区二区三区| 亚洲日本久久| 精品国产亚洲一区二区三区| 久久国产主播| 蜜桃视频一区二区三区| 国产精品一区二区av日韩在线| 色婷婷综合网| 国产高清久久| 婷婷成人av|