• Spring Security认证配置(一)


    学习本章之前,可以先了解下上篇 Spring Security基本配置

    本篇主要讲述Spring Security基于表单,自定义用户认证配置(上篇中的配置,本篇将不再阐述)。一共分为三步:

      1、处理用户信息获取

      2、处理用户校验

      3、处理密码加密解密

    在配置之前,先熟悉下两个接口:

    UserDetailsService

    UserDetailsService接口用户返回用户相关数据。它有loadUserByUsername方法,根据用户名查询用户实体,可以实现该接口覆盖该方法,实现

    自定义获取用户过程。该接口实现类被DaoAuthenticationProvider类使用,用于认证过程中载入用户信息

    UserDetails与DaoAuthenticationProvider类的介绍可以查看AuthenticationManager、ProviderManager

    public interface UserDetailsService {
        
        //通过用户名查询user
        UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
        
    }

    PasswordEncoder

    PasswordEncoder是一个关于密码操作的接口,常用的实现类为BCryptPasswordEncoder

    public interface PasswordEncoder {
    
        //对rawPassword加密
        String encode(CharSequence rawPassword);
    
        //判断rawPassword与encodedPassword是否匹配
        boolean matches(CharSequence rawPassword, String encodedPassword);
    
    }

    接下来开始Spring Security自定义用户认证配置:

    在SecurityConfig中配置PasswordEncoder

        /**
         * 密码加密(可自定义加密方式)
         */
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }

    自定义UserDetails的实现类(也可使用UserDetails的默认实现类User)

    @Getter
    @Setter
    @AllArgsConstructor
    public class MyUser implements UserDetails {
    
        private static final long serialVersionUID = 1L;
    
        private String username;
    
        private String password;
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return null;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            // 账户是否没有过期,默认true
            return true;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            // 账户是否没有锁定,默认true
            return true;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            // 密码是否没有过期,默认true
            return true;
        }
    
        @Override
        public boolean isEnabled() {
            // 账户是否可用,默认true
            return true;
        }
    
    }

    自定义UserDetailsService的实现类

    @Slf4j
    @Service
    public class MyUserDetailServiceImpl implements UserDetailsService {
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        /**
         * 根据username查询用户实体
         */
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            log.info("进来了~");
            
            //密码加密(这里是将密码写死的,真实情况应该是查询数据库)
            String dbPassword = passwordEncoder.encode("1234");
            log.info("数据库密码:{}", dbPassword);
            MyUser user = new MyUser(username, dbPassword);
            return user;
        }
    
    }

    在DaoAuthenticationProvider中设置两个断点,然后启动服务,可以看到Spring Security自动将我们的实现类注入到DaoAuthenticationProvider中:

     访问http://localhost:18081/user,跳转到登录页

     用户名随便输,密码为1234

     

  • 相关阅读:
    [转]Delphi DLL的创建、静态 以及动态调用
    Delphi txt文件的操作(读取、写入)
    为什么要使用动态链接库(DLL)
    TStringGrid 实现下拉框
    Ryzen 4000'Vermeer' CPU和Radeon RX'Big Navi'图形卡
    AMD Ryzen 5000‘Cezanne’APU
    AMD–7nm “Rome”芯片SOC体系结构,支持64核
    ARM Cortex-M嵌入式C基础编程(下)
    ARM Cortex-M嵌入式C基础编程(上)
    基于ARM Cortex-M的SoC存储体系结构和实战
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/9582423.html
Copyright © 2020-2023  润新知