日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

概述

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

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

項目準備

添加依賴

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

   

mysql
mysql-connector-java
runtime



com.baomidou
mybatis-plus-boot-starter
3.5.1

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

我們添加過依賴以后,需要在application.yml中添加數(shù)據(jù)庫鏈接,實現(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ù)庫的默認鏈接是mybatis數(shù)據(jù)庫,用戶名是root,密碼是root,讀者可以根據(jù)實際情況,自行修改

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

我們這個只是實例,所以只創(chuàng)建一個簡單的用戶(sys_user)和權限(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 '手機號',
`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 '權限',
PRIMARY KEY (`id`)
)
COMMENT='用戶權限關系表'
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');

實體類

創(chuàng)建sys_user和sys_authorities兩張表對應的實體類。

sys_user實體類。

@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實體類。

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

實現(xiàn)兩個實體類的Mapper

我們使用mybatis-plus實現(xiàn)這兩個實體類的mapper,因為這樣我們(例子)可以減少代碼。

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的實現(xiàn)

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

UserDetailsService接口。

CustomUserDetailsService的代碼實現(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("認證請求: "+ 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;
}
}

重構configure(AuthenticationManagerBuilder auth)方法

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

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

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

 @Autowired
private UserDetailsService customUserDetailsService;
/**
* 認證管理器
* 1.認證信息提供方式(用戶名、密碼、當前用戶的資源權限)
* 2.可采用內(nèi)存存儲方式,也可能采用數(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);
}

測試

啟動項目,訪問http://localhost:8888/login/page。

使用賬號密碼結果為:

賬號:admin。

密碼:123456。


網(wǎng)站名稱:SpingSecurity-動態(tài)認證用戶信息
當前路徑:http://www.5511xx.com/article/cdgeioi.html