Spring Security UserDetails实现原理详解

yizhihongxing

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文件管理操作的知识点整理

    下面是“Java文件管理操作的知识点整理”的完整攻略。 什么是Java文件管理操作 Java文件管理操作是指在Java程序中对文件进行创建、读取、写入、删除等文件操作的过程。通过Java文件管理操作,我们可以对文件进行增删改查、复制和移动等常见文件操作,便于我们在Java程序中处理文件相关业务逻辑。 Java文件管理操作的基本流程 Java文件管理操作的基本…

    Java 2023年5月20日
    00
  • SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    下面是SpringBoot配置Druid三种方式的详细攻略,包括纯配置文件配置。 什么是Druid Druid是一个开源的数据库连接池和监控平台,具有更快的速度和更好的性能。Druid可以提供实时的SQL监控、SQL防火墙、StatFilter、日志记录等功能。 SpringBoot配置Druid 使用@Configuration和@PropertySour…

    Java 2023年5月20日
    00
  • Java中常见的编码集问题总结

    Java中常见的编码集问题总结 什么是编码集 编码集是一种翻译表,能将字符集中的字母、数字和符号对应到磁盘或内存中存储的比特序列。不同的编码集使用不同的比特序列来表示相同的字符。 常见的编码集有ASCII、UTF-8、GB2312等。 Java中处理编码集的方法 Java中处理编码集主要使用的是String类和Java的字符编码转换器Charset。 Str…

    Java 2023年5月20日
    00
  • SpringBoot Security实现单点登出并清除所有token

    实现单点登出并清除所有token是一个比较常见的需求,Spring Security正是为此而生。下面是实现它的完整攻略: 步骤1:添加依赖 首先,在pom.xml中添加spring-boot-starter-security依赖: <dependencies> … <dependency> <groupId>org.…

    Java 2023年6月3日
    00
  • 详解Func与Action区别

    当我们编写C#代码时,经常会遇到Func<T>和Action<T>这两个委托类型。它们都是 C# 环境中的通用委托类型,用于定义具有特定签名的同步方法。虽然它们在某些方面看起来相似,但实际上它们之间有一些重要的区别。 Func与Action的区别 Func和Action的定义 Func:表示一个带有返回值的函数的委托。它可以在不使用自…

    Java 2023年5月19日
    00
  • Javaweb监听器实例之统计在线人数

    讲解一下 “Javaweb监听器实例之统计在线人数” 的完整攻略。 什么是Javaweb监听器 Javaweb监听器是一种特殊的类,在JavaWeb应用服务器启动、关闭或发生某种事件时执行相应的方法。监听器提供了一种方便的方法来实现一些常见的业务逻辑。比如,统计在线人数、记录日志、缓存数据、初始化应用等。 如何使用Javaweb监听器统计在线人数 1、编写监…

    Java 2023年6月15日
    00
  • Java如何实现长连接

    实现长连接是客户端和服务器端保持连接一段时间,而不是每次请求/响应都建立/关闭一个TCP连接。这样可以减少建立连接的成本,提高性能和效率。 Java 实现长连接可以通过以下三种方式: 1.使用 Java Socket 实现: 在 Java 中可以使用 Socket 编程实现长连接。客户端和服务器端建立一次连接之后,多次交换数据,直到连接被关闭。 示例代码: …

    Java 2023年5月18日
    00
  • 使用maven shade插件解决项目版本冲突详解

    使用Maven Shade插件可以将所有的依赖包、类库和所需的资源打包到一个可执行的Jar文件中,从而避免在运行时出现项目版本冲突的问题。以下是使用Maven Shade插件解决项目版本冲突的完整攻略: 环境要求 JDK 1.8+ Maven 3.x+ 使用Maven Shade插件 在pom.xml文件中添加以下配置: <build> <…

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