SpringSecurity(四): 动态认证用户信息UserDetailsService

摘要:
SpringSecurity身份验证的用户名和密码由启动服务器自动生成,或者直接写入代码并存储在内存中。从数据库获得的用户信息封装在UserDetail接口的实现类中。
SpringSecurity(一、二、三)身份认证的用户名和密码是启动服务器自动生成的,或者是代码中写死的,存储在内存中。而实际项目中应该从动态的从数据库中获取进行身份认证。
 
1.实现流程:  
  (1)关注 UserDetailsService 、 UserDetails 接口
  (2)自定义一个 UserDetailsService 接口的实现类 CustomUserDetailsService ,实现该接口中的loadUserByUsername 方法 ,通过该方法定义获取用户信息的逻辑。
  (3)从数据库获取到的用户信息封装到 UserDetail 接口的实现类中(Spring Security 提供了一个org.springframework.security.core.userdetails.User 实现类封装用户信息)。
  (4)如果未获取到用户信息,则抛出异常 throws UsernameNotFoundException
public interface UserDetails extends Serializable { 
  //此用户可访问的资源权限
  Collection<? extends GrantedAuthority> getAuthorities();
  //用户名
  String getPassword();
  //密码
  String getUsername();
  //帐户是否过期(true 未过期,false 已过期)   boolean isAccountNonExpired();
  //帐户是否被锁定(true 未锁定,false 已锁定),锁定的用户是可以恢复的   boolean isAccountNonLocked();
  //密码是否过期(安全级别比较高的系统,如30天要求更改密码,true 未过期,false 过期)   boolean isCredentialsNonExpired();
  //帐户是否可用(一般指定是否删除,系统一般不会真正的删除用户信息,而是假删除,通过一个状态码标志 用户被删除)删除的用户是可以恢复的   
boolean isEnabled();
}

2.自定义CustomUserDetailsService类实现UserDetailsService接口

/**
 * 查询数据库中的用户信息
 */
@Component("CustomUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {
   Logger logger=LoggerFactory.getLogger(CustomUserDetailsService.class);

   @Autowired
    BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       logger.info("请求认证的用户名:"+username);

       //1.通过请求的用户名去数据库中查询用户信息
        if (!"zcc".equals(username)){
            throw new UsernameNotFoundException("用户名或密码错误");
        }

        //假设当前这个用户在数据库中存储的密码是123
        String password=bCryptPasswordEncoder.encode("123");

        //2.查询该用户所拥有的权限
        

        // 3.封装用户信息: username用户名,password数据库中的密码,authorities资源权限标识符
        // SpringSecurity 底层会校验是否身份合法。
        return  new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("ADMIN"));

    }
}

3.重构安全配置类SpringSecurityConfig

  注入 CustomUserDetailsService  在confifigure(AuthenticationManagerBuilder auth) 方法中指定认证方式
   @Autowired
    CustomUserDetailsService customUserDetailsService;


    /**
     * 认证管理器:
     * 1、认证信息提供方式(用户名、密码、当前用户的资源权限)
     * 2、可采用内存存储方式,也可能采用数据库方式等
     *
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //基于内存存储认证信息 存储的密码必须是加密后的 不然会报错:There is no PasswordEncoder mapped for the id "null"
        //auth.inMemoryAuthentication().withUser("zcc").password("123").authorities("ADMIN");
        /*String password = bCryptPasswordEncoder().encode("123");
        logger.info("加密后的密码:" + password);
        auth.inMemoryAuthentication().withUser("zcc").password(password).authorities("ADMIN");*/


        // 指定使用自定义查询用户信息来完成身份认证
        auth.userDetailsService(customUserDetailsService);

    }

 完整代码地址:https://gitee.com/zhechaochao/security-parent.git

免责声明:文章转载自《SpringSecurity(四): 动态认证用户信息UserDetailsService》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tar命令结合find搜索将指定条件的文件进行打包压缩Unsatisfied dependency expressed through method 'shirFilter' parameter 0 异常排查下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Redis在Linux下的安装

一、下载地址 ①redis中文网下载地址:http://www.redis.cn/ ②百度云网盘下载地址:https://pan.baidu.com/s/1UQcF9V3lwA0fxquM_JFMZw 提取码:lnwk 二、编译软件安装 yum -y install gcc gcc-c++ make 三、安装 解压后进入目录,编译安装命令: make ma...

[问题]数据库MySQL和Navicat的乱码问题

计算机中存储字符需要使用编码集,早期有ASCII集,但是随着技术的发展,ASCII集不能满足需求,出现了越来越多的字符,比如中文字符等。后来又发展出了Unicode、GB2312、utf8等字符集。字符集多了以后,问题就出现了,如果运行环境和对应使用情况的字符集不形同就会出现乱码或者“?”,如下图所示。 为了让字符能够正确显示,首先我们需要调整MySQL...

(转)django使用django-celery与celery

一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器。在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用户端的简单逻辑交互,还要实现一些定时任务。举出以下的例子:   定期删除或缓存Redis数据库的记录为了追求更高的数据库访问性能,我把Redis作为MySq...

64位操作系统中用C#连接Informix

测试环境:Windows2008+SQL2008R2+Linux虚拟机+Informix9数据库+IBM INFORMIX-Client SDK 3.70.FC4 连接步骤: 一、开启Linux虚拟机,启动网络配置,启动Informix数据库 二、安装Windows下的Informix数据库客户端工具IBM INFORMIX-Client SDK 3.70...

phpmyadmin数据库密码的设置

  用phpMyAdmin修改mysql数据库密码   修改mysql数据库密码方法有很多,这里向大家演示一种比较简单的方法,利用phpMyAdmin修改。   工具/原料 phpMyAdmin软件 mysql数据库 方法/步骤   初始数据库密码为空。   第一步,点击phpMyAdmin里的用户选项。...

Oracle数据库GLOBAL_NAMES参数的详细研究 (创建DBLINK时有用)

Oracle数据库GLOBAL_NAMES参数的相关知识是本文我们主要要介绍的内容,当GLOBAL_NAMES参数设置为TRUE时,使用DATABASE LINK时,DATABASE LINK的名称必须与被连接库的GLOBAL_NAME一致。下面做一个测试,在测试中,创建数据库链接的库为XJ(WINDOWS 2003 ORACLE 10g 10.2.0.1...