SpringSecurity6.X自定义配置-用户认证

官方文档给出了java的自定义配置,可以参考。
要自定义配置,需要自定义配置类,参考文档创建WebSecurityConfig .class,配置都写这里面。

@Configuration
// mvc项目需要手动加这个注解,Springboot项目在我们引入security时自动加了
//@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(
                User.withUsername("user")
                    .password(new BCryptPasswordEncoder().encode("password") )
                    .roles("USER")
                    .build());
        
        return manager;
    }
}
security自动加

1. 基于内存的用户认证

就像上面的配置一样:

@Configuration
// mvc项目需要手动加这个注解,Springboot项目在我们引入security时自动加了
//@EnableWebSecurity
public class WebSecurityConfig {
    
    /**
     * 默认密码加密过时了,说不安全
     * 我们换一个安全的
     * @return
     */
    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 基于内存的用户认证
     * 注意 有自定义配置后,application.yml文件中配置的账号密码就失效了
     */
    @Bean
    UserDetailsService userDetailsService() {
        // 内存用户管理器
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(
                // 创建UserDetails对象,管理账号、密码、角色、权限等
                User.withUsername("user")
                    .password(passwordEncoder().encode("password") )
                    .roles("USER")
                    .build());
        
        return manager;
    }
}

2. 基于数据源的用户认证

从基于内存的用户可以看出,主要是创建了UserDetailsService对象,注册成Bean,交给Spring,SpringSecurity流程中会使用的。数据库这个和那个是一样的。
大致就是:

  • 从数据库拿账号信息,
  • 用账号信息创建一个UserDetailsService对象,
  • 注册成Bean
2.1 查数据库组对象

我们新建一个MyUserDetailService.class

public class MyUserDetailService implements UserDetailsService {
    
//  @Resource
//  private UserDao userDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 数据库拿用户信息
        // 角色信息
        // 权限信息
        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(() -> "aut");
        
        return User
            .withUsername("ls")
            .password(new BCryptPasswordEncoder().encode("ls456"))
            .roles("R1", "r2")
            .authorities(authorities)
            .accountExpired(false)
            .accountLocked(false)
            .credentialsExpired(false)
            .build();
    }
}
2.2 注册Bean

在WebSecurityConfig 注册成Bean

@Configuration
// mvc项目需要手动加这个注解,Springboot项目在我们引入security时自动加了
//@EnableWebSecurity
public class WebSecurityConfig {
    
    /**
     * 默认密码加密过时了,说不安全
     * 我们换一个安全的
     * @return
     */
    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 基于内存的用户认证
     * 注意 有自定义配置后,application.yml文件中配置的账号密码就失效了
     */
//    @Bean
//    UserDetailsService userDetailsService() {
//      // 内存用户管理器
//      InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//      manager.createUser(
//              // 创建UserDetails对象,管理账号、密码、角色、权限等
//              User.withUsername("user")
//                  .password(passwordEncoder().encode("password") )
//                  .roles("USER")
//                  .build());
//      
//      return manager;
//  }
    
    /**
     * 基于数据源的用户认证
     */
    @Bean
    UserDetailsService userDetailsService() {
        MyUserDetailService userDetail = new MyUserDetailService();
        return userDetail;
    }
}

重启,就可以用数据库的账号密码访问了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容