日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpingSecurity-動(dòng)態(tài)認(rèn)證用戶信息

概述

我們前兩節(jié)介紹的Spring Security的身份認(rèn)證的用戶和密碼在啟動(dòng)服務(wù)器后自動(dòng)生成、代碼寫死或者存儲(chǔ)到內(nèi)存中,但是在實(shí)際項(xiàng)目中需要從動(dòng)態(tài)的數(shù)據(jù)庫中獲取用戶信息進(jìn)行身份認(rèn)證。Spring Security提供了一個(gè)UserDetailsService實(shí)現(xiàn)類JdbcUserDetailsManager來幫助我們以JDBD的方式對(duì)接數(shù)據(jù)庫和Spring Security。

10年積累的成都做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有新安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

項(xiàng)目準(zhǔn)備

添加依賴

我們使用的數(shù)據(jù)庫是mysql,查詢數(shù)據(jù)方式使用的是mybatis-plus因此需要引入mysql驅(qū)動(dòng)和mybatis-plus依賴。

   

mysql
mysql-connector-java
runtime



com.baomidou
mybatis-plus-boot-starter
3.5.1

添加數(shù)據(jù)庫配置

我們添加過依賴以后,需要在application.yml中添加數(shù)據(jù)庫鏈接,實(shí)現(xiàn)如下:

spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver

在這里數(shù)據(jù)庫的默認(rèn)鏈接是mybatis數(shù)據(jù)庫,用戶名是root,密碼是root,讀者可以根據(jù)實(shí)際情況,自行修改

創(chuàng)建user和權(quán)限表:

我們這個(gè)只是實(shí)例,所以只創(chuàng)建一個(gè)簡(jiǎn)單的用戶(sys_user)和權(quán)限(sys_authorities)兩張表,sql如下:

DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user
(
`id` BIGINT(20) NOT NULL COMMENT '主鍵ID',
`username` VARCHAR(30) NOT NULL COMMENT '姓名',
`password` VARCHAR(64) NOT NULL COMMENT '密碼',
`age` INT(11) NULL DEFAULT NULL COMMENT '年齡',
`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
`enabled` INT(11) not NULL DEFAULT 1 COMMENT '0無效用戶,1是有效用戶',
`phone` VARCHAR(16) NULL DEFAULT NULL COMMENT '手機(jī)號(hào)',
`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '角色的創(chuàng)建日期',
PRIMARY KEY (id)
)
COMMENT='用戶信息表'
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;
DROP TABLE IF EXISTS sys_authorities;
CREATE TABLE `sys_authorities` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL DEFAULT '0' COMMENT '角色自增id',
`authorities` VARCHAR(50) NULL DEFAULT NULL COMMENT '權(quán)限',
PRIMARY KEY (`id`)
)
COMMENT='用戶權(quán)限關(guān)系表'
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;
INSERT INTO sys_user (id, username,password, age, email,phone) VALUES
(1, 'admin', '$2a$10$ziavqzahP2o0q6XPIEVLNOODYAdRIbJHa1v2xQwbg.6xT2y6q2lzO',18, 'test1@baomidou.com',13333835911);
INSERT INTO sys_authorities (id, user_id,authorities) VALUES
(1, 1, 'admin');

實(shí)體類

創(chuàng)建sys_user和sys_authorities兩張表對(duì)應(yīng)的實(shí)體類。

sys_user實(shí)體類。

@Data
@TableName("sys_user")
public class UserEntity {
private Long id;
private String username;
private String password;
private Integer age;
private String email;
private Integer enabled;
private String phone;
}

sys_authorities實(shí)體類。

@Data
@TableName("sys_authorities")
public class AuthoritiesEntity {
private Long id;
private String UserId;
private String authorities;
}

實(shí)現(xiàn)兩個(gè)實(shí)體類的Mapper

我們使用mybatis-plus實(shí)現(xiàn)這兩個(gè)實(shí)體類的mapper,因?yàn)檫@樣我們(例子)可以減少代碼。

public interface UserMapper extends BaseMapper {
}
public interface AuthoritiesMapper extends BaseMapper {
}

添加@MapperScan注解

在main入口類上添加@MapperScan("com.security.learn.mapper")注解。

@MapperScan("com.security.learn.mapper")
@SpringBootApplication
public class SpringSecurityLearn3Application {
public static void main(String[] args) {
SpringApplication.run(SpringSecurityLearn3Application.class, args);
}
}

UserDetailsService的實(shí)現(xiàn)

我們需要自定義個(gè)UserDetailsService接口的實(shí)現(xiàn)類CustomUserDetailsService,用于實(shí)現(xiàn)UserDetailsService接口中的loadUserByUsername方法,通過該方法定義獲取用戶信息的邏輯。

UserDetailsService接口。

CustomUserDetailsService的代碼實(shí)現(xiàn)。

@Slf4j
@Service("customUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Autowired
private AuthoritiesMapper authoritiesMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
log.info("認(rèn)證請(qǐng)求: "+ username);
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("username",username);
List userEntities = userMapper.selectList(wrapper);
if (userEntities.size()>0){
QueryWrapper wrapper1 = new QueryWrapper<>();
wrapper.eq("userId", userEntities.get(0).getId());
List authorities = authoritiesMapper.selectList(wrapper1);
return new User(username, userEntities.get(0).getPassword(), AuthorityUtils.createAuthorityList(authorities.toString()));
}
return null;
}
}

重構(gòu)configure(AuthenticationManagerBuilder auth)方法

重新實(shí)現(xiàn)configure(AuthenticationManagerBuilder auth)方法。

  • 在LearnSrpingSecurity類中注入customUserDetailsService。
  • 在configure(AuthenticationManagerBuilder auth)方法中指定認(rèn)證用戶方式。

代碼實(shí)現(xiàn)如下:

 @Autowired
private UserDetailsService customUserDetailsService;
/**
* 認(rèn)證管理器
* 1.認(rèn)證信息提供方式(用戶名、密碼、當(dāng)前用戶的資源權(quán)限)
* 2.可采用內(nèi)存存儲(chǔ)方式,也可能采用數(shù)據(jù)庫方式等
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//super.configure(auth);
// auth.inMemoryAuthentication()
// .withUser("admin")
// .password(passwordEncoder.encode("123456"))
// .roles("admin")
// .authorities("Role_admin")
// .and()
// .passwordEncoder(passwordEncoder);//配置BCrypt加密
auth.userDetailsService(customUserDetailsService);
}

測(cè)試

啟動(dòng)項(xiàng)目,訪問http://localhost:8888/login/page。

使用賬號(hào)密碼結(jié)果為:

賬號(hào):admin。

密碼:123456。


文章題目:SpingSecurity-動(dòng)態(tài)認(rèn)證用戶信息
文章路徑:http://www.dlmjj.cn/article/cdgeioi.html