Spring Security:使用数据库支持的 UserDetailsS​​ervice 进行身份验证

1.概述

在本文中,我们将展示如何创建自定义数据库支持的UserDetailsS​​ervice以使用 Spring Security 进行身份验证。

2. UserDetailsS​​ervice

UserDetailsS​​ervice接口用于检索与用户相关的数据。它有一个名为loadUserByUsername()的方法,可以重写该方法以自定义查找用户的过程。

DaoAuthenticationProvider使用它在身份验证期间加载有关用户的详细信息。

3.用户模型

为了存储用户,我们将创建一个映射到数据库表的User实体,具有以下属性:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    private String password;

    // standard getters and setters
}

4. 检索用户

为了检索与用户名关联的用户,我们将使用Spring Data通过扩展JpaRepository接口创建一个DAO类:

public interface UserRepository extends JpaRepository<User, Long> {

    User findByUsername(String username);
}

5. UserDetailsS​​ervice 

为了提供我们自己的用户服务,我们需要实现UserDetailsS​​ervice接口。

我们将创建一个名为MyUserDetailsS​​ervice的类,它会覆盖接口的loadUserByUsername()方法。

在此方法中,我们使用DAO检索User对象,如果存在,则将其包装到MyUserPrincipal对象中,该对象实现UserDetails并返回它:

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);
        }
        return new MyUserPrincipal(user);
    }
}

让我们定义MyUserPrincipal类如下:

public class MyUserPrincipal implements UserDetails {
    private User user;

    public MyUserPrincipal(User user) {
        this.user = user;
    }
    //...
}

6.弹簧配置

我们将演示两种类型的 Spring 配置:XML 和基于注释,这是使用我们自定义的UserDetailsS​​ervice实现所必需的。

6.1。注释配置

启用自定义UserDetailsS​​ervice 所需要做的就是将其作为 bean 添加到我们的应用程序上下文中。

由于我们使用@Service注解配置了我们的类,因此应用程序将在组件扫描期间自动检测到它,并从该类中创建一个 bean。因此,我们在这里不需要做任何其他事情。

或者,我们可以:

  • 使用 AuthenticationManagerBuilder#userDetailsS​​ervice方法在authenticationManager中配置它
  • 将其设置为自定义authenticationProvider bean 中的属性,然后使用AuthenticationManagerBuilder# authenticationProvider函数将其注入

6.2. XML 配置

另一方面,对于 XML 配置,我们需要定义一个类型为MyUserDetailsS​​ervice的 bean ,并将其注入 Spring 的authentication-provider bean:

<bean id="myUserDetailsService" 
  class="org.baeldung.security.MyUserDetailsService"/>

<security:authentication-manager>
    <security:authentication-provider 
      user-service-ref="myUserDetailsService" >
        <security:password-encoder ref="passwordEncoder">
        </security:password-encoder>
    </security:authentication-provider>
</security:authentication-manager>
    
<bean id="passwordEncoder" 
  class="org.springframework.security
  .crypto.bcrypt.BCryptPasswordEncoder">
    <constructor-arg value="11"/>
</bean>

7. 其他数据库支持的身份验证选项

AuthenticationManagerBuilder 提供了另一种在我们的应用程序中配置基于 JDBC 的身份验证的方法。 

我们必须使用DataSource实例配置AuthenticationManagerBuilder.jdbcAuthentication 。如果我们的数据库遵循Spring User Schema,那么默认配置将非常适合我们。

我们在前一篇文章中已经看到了使用这种方法的基本配置。

此配置产生的 JdbcUserDetailsManager 实体也实现了UserDetailsS  ​​ervice 。

因此,我们可以得出结论,这种配置更容易实现,特别是如果我们使用自动为我们配置DataSource的 Spring Boot 。

无论如何,如果我们需要更高级别的灵活性,准确自定义应用程序获取用户详细信息的方式,那么我们将选择本教程中采用的方法。

8. 结论

总而言之,在本文中,我们展示了如何创建一个基于 Spring 的自定义UserDetailsS​​ervice,它由持久数据支持。

该实现可以在GitHub 项目中找到——这是一个基于 Maven 的项目,因此它应该很容易导入和运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值