zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    简易花台制作攻略
    欢迎
    VxWorks操作系统MakeFile(三)
    原创连载:往事
    VxWorks操作系统MakeFile(五)
    致亲爱的板儿的一封信
    VxWorks操作系统MakeFile(二)
    华为NE5000E集群路由器荣获InfoVision奖
    台式机安装黑苹果Mac OS X Snow Leopard 10.6相关资源
    未能加载文件或程序集Office, Version=2.2.0.0, Culture=neutral, PublicKeyToken=null或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/9582423.html
Copyright © 2011-2022 走看看