用户认证

获取用户名密码的方式:

  • 通过配置文件
  • 通过配置类
  • 自定义编写实现类

通过配置文件配置

在配置文件中加入用户名密码的配置:

  1. spring:
  2. security:
  3. user:
  4. name: test
  5. password: test

通过配置类配置

示例:

创建一个配置类,继承 WebSecurityConfigurerAdapter 并实现 configure方法

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.inMemoryAuthentication()  // 从内存中读取
            .withUser("test")  // 用户名
            .password("tiger")  // 密码
            .roles("admin");  // 角色

    }
}

如果要将密码加密,可以使用 BCryptPasswordEncoder进行加密:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 将密码使用BCryptPasswordEncoder进行加密
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String passwordEncode = encoder.encode("tiger");
        auth.inMemoryAuthentication().withUser("test").password(passwordEncode).roles("admin");
    }


    // 将 BCryptPasswordEncoder 作为PasswordEncoder类型的Bean加入spring容器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

自定义实现类设置

配置步骤:

  1. 创建配置类,设置使用哪个UserDetailsService实现类
  2. 编写实现类,返回User对象,User对象有用户名和密码操作权限

创建UserDetailsService的实现类:

@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        // TODO 查询数据库获取用户的密码
        String password = "tiger";
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String passwordEncode = encoder.encode(password);

        // TODO 查询数据库获取用户的权限
        List<GrantedAuthority> roleList = AuthorityUtils.commaSeparatedStringToAuthorityList("testRole");


        return new User(username, passwordEncode, roleList);
    }
}

将PasswordEncoder加入Spring容器,并将UserDetailsService、PasswordEncoder配置到auth中

@Configuration
public class SecurityConfigUser extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)  // 使用的用户名配置类
                .passwordEncoder(passwordEncoder()); // 使用的密码配置类
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

整合Mybatis-Plus

  1. 加入pom依赖
    <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.4.2</version>
    </dependency>
    <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
     <groupId>com.oracle.ojdbc</groupId>
     <artifactId>ojdbc8</artifactId>
    </dependency>
    <dependency>
     <groupId>com.oracle.ojdbc</groupId>
     <artifactId>orai18n</artifactId>
    </dependency>
    
  1. 创建表
    create table User_Info (
     userid int,
     username varchar2(200),
     password varchar2(20)
    );
    
  1. 加入数据库配置
    spring:
    datasource:
     url: jdbc:oracle:thin:@localhost:1521/orcl
     username: myData
     password: tiger
     driver-class-name: oracle.jdbc.OracleDriver
    
  1. 创建实体类
    @Data
    public class UserInfo {
     private Integer userid;
     private String username;
     private String password;
    }
    
  1. 编写mapper
    @Repository
    public interface UserInfoMapper extends BaseMapper<UserInfo> {
    }
    
  1. 在主启动类加上MapperScan注解 ```java @SpringBootApplication @MapperScan public class SpringSecurity01Application {

    public static void main(String[] args) {

     SpringApplication.run(SpringSecurity01Application.class, args);
    

    }

}



7. 
在自定义UserDetailsService类中使用Mybatis-plus进行数据库查询
```java
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    // 查询数据库获取用户的密码
    QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();
    wrapper.eq("username", username);
    UserInfo userInfo = userInfoMapper.selectOne(wrapper);

    if(userInfo == null) {
        // 该用户不存在
        throw new UsernameNotFoundException("user[" + username + "]不存在");
    }

    String password = userInfo.getPassword();

    // ......
}