【Spring Security】 使用数据库用户登录案例

Metadata

title: 【Spring Security】 使用数据库用户登录案例
date: 2023-02-02 11:43
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/SpringSecurity
categories:
  - SpringSecurity
keywords:
  - SpringSecurity
description: 【Spring Security】 使用数据库用户登录案例

【Spring Security】 使用数据库用户登录案例

源码及 SQL 地址

相关理论

  • [[../【Spring Security】 认证/【Spring Security】 用户 密码 认证]]
  • [[../【Spring Security】 认证/【Spring Security】 登录核心类]]

1. 创建 RBAC 五张表

RBAC,即基于角色的权限访问控制(Role-Based Access Control),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成 “用户 - 角色 - 权限” 的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

2. 搭建基础环境

  1. 之前入门案例添加 mybatisplus
  2. 使用 mybatisplus 代码生成器生成三层代码
  3. 配置数据库连接,并测试环境

3. 实现 UserDetailsService 接口

[[mybatis]] 添加根据用户名查询用户信息接口:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public User getUserByName(String username) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUserName, username);
        return getOne(queryWrapper);
    }
}

实现 UserDetailsService 接口,数据库查询用户,将用户名,密码,权限集合,返回给 Security。

/**
 * Created by TD on 2021/7/6
 * 自定义加载用户信息接口实现
 */
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    UserService userService;

    /**
     * @param username 用户名
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 1. 数据库查询用户
        User user = userService.getUserByName(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户名不存在!");
        }
        // 2. 设置权限集合,后续需要数据库查询
        List<GrantedAuthority> authorityList =
                AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        // 3. 返回Security中的用户
        return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), authorityList);
    }
}

4. 添加 Security 配置类

@Configuration
@EnableWebSecurity(debug = true)
public class MyWebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    MyUserDetailsService myUserDetailsService;

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 设置自定义用户认证
        auth.userDetailsService(myUserDetailsService);
        super.configure(auth);
    }

    /**
     * 注入密码解析器到IOC中
     */
    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

5. 测试

使用 test/12356 登录成功,搭建完成。