Spring Security UserDetails实现原理详解

Spring Security UserDetails实现原理详解

Spring Security 是一个功能强大的安全框架,它的核心是 Spring Security 核心包。其中,UserDetails 是 Spring Security 中的一个核心接口,它包含了用户信息以及授权信息等内容。本文将详细讲解 Spring Security UserDetails 实现原理。

1. UserDetails 接口

UserDetails 接口是 Spring Security 中用于表示用户详细信息的接口,它包含以下方法:

  • getUsername(): 获取用户的用户名。
  • getPassword(): 获取用户的密码。
  • getAuthorities(): 获取用户的授权信息。
  • isEnabled(): 获取用户是否启用。
  • isAccountNonExpired(): 获取用户的账号是否过期。
  • isAccountNonLocked(): 获取用户的账号是否锁定。
  • isCredentialsNonExpired(): 获取用户的凭证是否过期。

2. UserDetails 实现类

Spring Security 并没有提供默认的 UserDetails 实现类,因此我们需要自己实现它,常见的方式有两种。

2.1. User 实现类

User 是 Spring Security 中的一个默认 UserDetails 实现类,它包含以下属性:

  • username: 用户名。
  • password: 密码。
  • enabled: 用户是否启用。
  • accountNonExpired: 用户的账户是否过期。
  • credentialsNonExpired: 用户的凭证是否过期。
  • accountNonLocked: 用户的账户是否锁定。
  • authorities: 用户的授权信息。

示例代码:

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return new User("admin", "$2a$10$uuay8uQicMvkYQZfd/KgFO781vU.KM3pA/1qDw8SAJEQjlGnn2l6", AuthoritiesConstants.ADMIN);
    }
}

2.2. 实现 UserDetails 接口

另一种实现 UserDetails 接口的方式是自己实现一个 UserDetails 实现类,示例代码如下:

public class CustomUserDetails implements UserDetails {

    private String username;
    private String password;
    private boolean enabled;
    private List<GrantedAuthority> authorities;

    public CustomUserDetails(String username, String password, List<GrantedAuthority> authorities, boolean enabled) {
        this.username = username;
        this.password = password;
        this.authorities = authorities;
        this.enabled = enabled;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return enabled;
    }
}

3. 实现自定义的 UserDetailsService

为了能够将 UserDetails 实现类与用户信息关联起来,我们需要自己实现一个 UserDetailsService 接口的实现类。具体实现方式如下:

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户 " + username + " 不存在");
        }
        List<Role> roles = user.getRoles();
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return new CustomUserDetails(user.getUsername(), user.getPassword(), authorities, user.isEnabled());
    }
}

4. 小结

本文详细讲解了 Spring Security UserDetails 实现原理,并给出了两个示例代码来说明多种实现方式,同时还演示了如何自定义实现 UserDetailsService。希望能够对您的学习和实践有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security UserDetails实现原理详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 概述Java的struts2框架

    概述Java的struts2框架 简介 Java的struts2框架是一个MVC(Model-View-Controller)模式的Web框架,它借鉴了许多JSP/Servlet和Struts的优点,同时也做了很多改进,达到了更优秀的Web应用开发效果。struts2框架可以很好的帮助开发人员快速搭建Web应用程序,并且可以方便地进行功能扩展和维护。 str…

    Java 2023年5月20日
    00
  • 详解SpringIOC BeanDeifition

    详解 Spring IOC BeanDefinition 什么是 Spring IOC BeanDefinition 在 Spring 中,IOC (Inversion of Control,反转控制) 的核心就是 BeanDefinition,它保存了 Bean 的配置信息,并且会被 Spring IOC 容器所管理。BeanDefinition 可以使用…

    Java 2023年5月19日
    00
  • 详解Tomcat中查看JVM内存使用情况

    当我们使用Tomcat作为Web服务器时,我们需要时刻关注JVM内存的使用情况。在Tomcat的管理界面中提供了一个内置的功能,能够帮助我们查看JVM内存的使用情况。下面是更详细的操作步骤。 第一步:进入Tomcat的管理页面 通过浏览器进入Tomcat服务器的管理页面,一般情况下,默认情况下地址为:http://localhost:8080/manager…

    Java 2023年5月19日
    00
  • Java实现万年历效果

    下面是“Java实现万年历效果”的完整攻略。 准备工作 在实现万年历之前,需要先了解一些基本知识: Java 的日期类 Date、Calendar 和 LocalDate Java 的输入输出流,包括 Scanner 和 System.out Java 的字符串拼接和格式化输出 模块化编程及测试方法 实现步骤 接下来就可以开始实现万年历了。 步骤1:获取用户…

    Java 2023年5月19日
    00
  • 别了Java EE! 正式更名为Jakarta

    针对Java EE正式更名为Jakarta的问题,我会进行详细的讲解,包括以下几点: 1. 背景 在2017年8月,Oracle公司宣布将 Java Enterprise Edition(EE)的所有商标和相关的Java EE规范文档转移到Eclipse基金会。在经过一段时间的讨论、咨询和协作后,Java EE正式在2018年9月转交给了 Eclipse 基…

    Java 2023年5月19日
    00
  • Java线程协作的两种方式小结

    Java线程协作是指多个线程之间的相互协作来完成一个任务。在Java中,线程协作有两种方式:wait和notify/notifyAll。 1. wait和notify 当线程需要等待某个条件时,可以调用wait方法。调用wait方法会使线程进入等待状态,直到另一个线程调用notify或notifyAll方法来唤醒它。 示例1:wait和notify的简单使用…

    Java 2023年5月26日
    00
  • 在windows下揪出java程序占用cpu很高的线程并完美解决

    以下是针对“在 Windows 下揪出 Java 程序占用 CPU 很高的线程并完美解决”的完整攻略: 1. 使用 Java 可视化工具揪出占用 CPU 较高的线程 步骤1:下载 VisualVM VisualVM 是一款 Java 虚拟机监控和性能分析工具,可以在 Windows 等多个平台上使用,具有良好的界面和体验。可以到以下网址下载 VisualVM…

    Java 2023年5月19日
    00
  • 使用Netty进行编解码的操作过程详解

    使用Netty进行编解码是网络编程中的一个重要的环节。下面我将详细讲解使用Netty进行编解码的操作过程,并且提供两个示例。 Netty编解码的操作过程 第一步:定义消息实体类(Message) 在进行Netty编解码的操作之前,我们需要定义一个消息实体类(Message),该实体类需要实现Serializable接口。代码示例如下: public clas…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部