新聞中心
概述
我們前兩節(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);
QueryWrapperwrapper = new QueryWrapper<>();
wrapper.eq("username",username);
ListuserEntities = userMapper.selectList(wrapper);
if (userEntities.size()>0){
QueryWrapperwrapper1 = new QueryWrapper<>();
wrapper.eq("userId", userEntities.get(0).getId());
Listauthorities = 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


咨詢
建站咨詢
