springsercurity 重写 loadUserByUsername
时间: 2024-06-11 10:04:19 浏览: 232
Spring Security 提供的 `UserDetailsService` 接口中有一个 `loadUserByUsername` 方法,用于根据用户名加载用户信息。如果我们需要使用自定义的用户信息模型或者从自己的数据库中加载用户信息,就需要重写这个方法。
重写 `loadUserByUsername` 方法需要实现 `UserDetailsService` 接口,并在配置中指定使用该自定义实现。下面是一个简单的例子:
```java
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toList()));
}
}
```
在这个例子中,我们使用了一个自定义的 `User` 类作为用户信息模型,并从数据库中加载该用户信息。在 `loadUserByUsername` 方法中,我们首先根据用户名从数据库中查找用户信息,如果不存在则抛出 `UsernameNotFoundException` 异常。然后根据用户信息构建 `UserDetails` 对象,并返回给 Spring Security。在这里,我们将用户的角色信息转换成了 `SimpleGrantedAuthority` 对象,并添加到 `UserDetails` 中。
使用自定义的 `UserDetailsService` 需要在 Spring Security 配置中指定。例如:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
// ...
}
```
在这个配置中,我们将 `MyUserDetailsService` 注入到了 `SecurityConfig` 中,并在 `configure` 方法中将其配置为使用的 `UserDetailsService`。
阅读全文