SpringSecurity使用提供的UserDetailService實現(xiàn)連接數(shù)據(jù)庫認證

配置MybatisPlus基礎環(huán)境

  • 1、配置pom文件
<!--mysql驅動-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>
 
<!--druid數(shù)據(jù)源-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.5</version>
</dependency>
 
<!--MybatisPlus映射框架-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
  • 2、配置yml文件
server:
  port: 8090
  servlet:
    encoding:
      charset: UTF-8
spring:
  application:
    name: auth
  datasource:
    url: jdbc:mysql://localhost:3306/authdb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
    username: root
    password: spy167935842687
mybatis-plus:
  mapper-locations: mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
  type-aliases-package: com.spyu.auth.entity
  • 3、用戶表
CREATE TABLE `per_user` (
  `user_id` bigint unsigned NOT NULL COMMENT '用戶id',
  `user_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '用戶編碼',
  `login_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '登錄名稱',
  `username` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '用戶名稱',
  `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '密碼',
  `phone` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '電話',
  `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '鹽值',
  `pic_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '頭像路徑',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '備注',
  `user_create` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶創(chuàng)建時間',
  `user_update` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用戶更新時間',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
  • 4、生成對應的Mapper文件
# PerUserInfoMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.spyu.auth.dao.PerUserInfoMapper">
 
</mapper>
 
# PerUserInfoMapper.java
/**
 * 用戶dao
 * @author sunpeiyu
 * @since 2023-06-19
 */
@Mapper
public interface PerUserInfoMapper extends BaseMapper<PerUserInfoEntity> {
 
}

編寫實現(xiàn)了UserDetailService接口的實現(xiàn)類

/**
 * spring security獲取數(shù)據(jù)庫返回的結果UserDetail
 * @author sunpeiyu
 * @since 2023-06-19
 */
@Component
public class LoginUserDetailImpl implements UserDetailsService {
    @Autowired
    private PerUserInfoMapper perUserInfoMapper;
 
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        String tip = "用戶" + username + "不存在";
 
        if (StringUtils.isEmpty(username)) {
            throw new CommonException(tip);
        }
 
        LambdaQueryWrapper<PerUserInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(PerUserInfoEntity::getUsername, username);
        PerUserInfoEntity userInfoEntity = perUserInfoMapper.selectOne(queryWrapper);
 
        if (Objects.isNull(userInfoEntity)) {
            throw new CommonException("用戶不存在!");
        }
 
        PerUserInfoBO perUserInfoBO = new PerUserInfoBO();
        BeanUtils.copyProperties(userInfoEntity, perUserInfoBO);
        return new LoginUserBO(perUserInfoBO);
    }
}

配置一個無加密的編碼器

注意:如果不配置編碼器,那么就會拋出異常,There is no PasswordEncoder mapped for id “null”

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    /**
     * 注冊解碼器
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        // return new BCryptPasswordEncoder();
        return NoOpPasswordEncoder.getInstance();
    }
}

測試

數(shù)據(jù)庫:


訪問http://localhost:8090/test/boot

登錄失敗:



此處在登錄成功后,就返回了業(yè)務測試接口的數(shù)據(jù),如果失敗返回錯誤提示,要求重新登錄


?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容