Spring security——基于数据库自定义UserDetailsService实现认证
本文将展示如何在spring security中创建基于数据库自定义UserDetailsService的认证服务。
UserDetailsService
UserDetailsService接口用于返回用户相关数据。它有loadUserByUsername()方法,根据username查询用户实体,可以实现该接口覆盖该方法,实现自定义获取用户过程。该接口实现类被DaoAuthenticationProvider 类使用,用于认证过程中载入用户信息。
User模型
为了存储用户,我们创建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
}
获取用户
为了根据username返回用户,需通过spring data jpa创建DAO类:
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
实现UserDetailsService接口
为了提供自己的获取用户服务,需要实现UserDetailsService接口。定义MyUserDetailsService类并重载loadUserByUsername方法.
在方法中通过使用DAO类返回User对象,将其包装成MyUserPrincipal对象返回。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;
}
//...
}
spring配置
我们需要配置使用自定义的UserDetailsService实现。这里使用javaConfig方式实现,xml类似。
通过使用 Spring 注解, 首先定义the UserDetailsService bean, 将其设置为authenticationProvider bean的属性, 最后注入至authenticationManager:
@Autowired
private MyUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider
= new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(encoder());
return authProvider;
}
@Bean
public PasswordEncoder encoder() {
return new BCryptPasswordEncoder(11);
}
总结
文本介绍了如何创建自定义的UserDetailService,从数据库中获取数据实现认证。
今天的文章基于数据库自定义UserDetailsService实现Spring security认证分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8968.html