@Component public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private PasswordEncoder passwordEncoder; @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { /** * 从数据库查:User是我自己写的类,getOne()是mybatis_plus的中的方法 * 就通过用户名查出一个用户 / // 这个要从数据库取出来 User usersByUsername = userRepository.findUsersByUsername(username); if (null == usersByUsername) { throw new UsernameNotFoundException(CodeMsg.ADMIN_USERNAME_NO_EXIST.getMsg()); } /* * 创建一个权限集合,随你放多少 * 最后返回一个org.springframework.security.core.userdetails包下的User * 授权就给完了 * 我这里授权的是USER; */ ArrayList<SimpleGrantedAuthority> arrayList = new ArrayList<>(); arrayList.add(new SimpleGrantedAuthority("ROLE_USER")); return new org.springframework.security.core.userdetails.User(usersByUsername.getUsername(),usersByUsername.getPassword(),arrayList); } }用到了什么技术
时间: 2023-06-24 18:09:13 浏览: 97
这段代码使用了Spring Security框架,实现了自定义的UserDetailsService接口来查询用户信息,并创建一个包含用户权限的UserDetails对象。同时,还使用了Spring的依赖注入技术(@Autowired注解),以及Mybatis-Plus框架的getOne()方法来查询数据库。
相关问题
为这段代码添加注释@Component public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private PasswordEncoder passwordEncoder; @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { /** * 从数据库查:User是我自己写的类,getOne()是mybatis_plus的中的方法 * 就通过用户名查出一个用户 */ // 这个要从数据库取出来 User usersByUsername = userRepository.findUsersByUsername(username); if (null == usersByUsername) { throw new UsernameNotFoundException(CodeMsg.ADMIN_USERNAME_NO_EXIST.getMsg()); } /** * 创建一个权限集合,随你放多少 * 最后返回一个org.springframework.security.core.userdetails包下的User * 授权就给完了 * 我这里授权的是USER; */ ArrayList<SimpleGrantedAuthority> arrayList = new ArrayList<>(); arrayList.add(new SimpleGrantedAuthority("ROLE_USER")); return new org.springframework.security.core.userdetails.User(usersByUsername.getUsername(),usersByUsername.getPassword(),arrayList); } }
/**
* 这是一个实现了UserDetailsService接口的类,用于加载用户信息
*/
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private PasswordEncoder passwordEncoder; // 密码加密器
@Autowired
private UserRepository userRepository; // 用户信息仓库
/**
* 通过用户名查找用户信息
* @param username 用户名
* @return 返回一个UserDetails类型的对象
* @throws UsernameNotFoundException 如果用户名不存在则抛出该异常
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 从数据库中查找指定用户名的用户信息
User usersByUsername = userRepository.findUsersByUsername(username);
if (null == usersByUsername) {
// 如果未查询到该用户,则抛出异常
throw new UsernameNotFoundException(CodeMsg.ADMIN_USERNAME_NO_EXIST.getMsg());
}
// 创建一个权限集合,这里只授权了USER
ArrayList<SimpleGrantedAuthority> arrayList = new ArrayList<>();
arrayList.add(new SimpleGrantedAuthority("ROLE_USER"));
// 返回一个org.springframework.security.core.userdetails包下的User对象,其中包含用户信息和授权信息
return new org.springframework.security.core.userdetails.User(
usersByUsername.getUsername(),
usersByUsername.getPassword(),
arrayList
);
}
}
Spring Security身份认证之UserDetailsService使用教程
在Spring Security中,可以使用UserDetailsService来获取用户信息并进行身份认证。UserDetailsService是一个接口,需要自定义实现来提供用户信息。
下面是一个简单的示例,演示如何使用UserDetailsService来进行身份认证:
1. 创建一个实现UserDetailsService接口的类,并实现其loadUserByUsername方法。在该方法中,你可以从数据库或其他数据源中获取用户信息,并返回一个实现了UserDetails接口的用户对象。
```java
@Service
public class UserDetailsServiceImpl 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("User not found with username: " + username);
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user.getRoles()));
}
private Collection<? extends GrantedAuthority> getAuthorities(Set<Role> roles) {
return roles.stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toList());
}
}
```
2. 在配置类(如SecurityConfig)中,使用@Autowired注解将UserDetailsService实例注入,并在configure方法中配置AuthenticationManagerBuilder。
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
// ...其他配置...
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
```
上述代码中,我们将UserDetailsService实例注入到AuthenticationManagerBuilder中,并使用BCryptPasswordEncoder作为密码编码器。
3. 在登录过程中,Spring Security将调用UserDetailsService的loadUserByUsername方法来获取用户信息,并使用密码编码器对用户输入的密码进行验证。
现在,当用户尝试进行身份认证时,UserDetailsService将被调用,从数据库中获取用户信息并进行验证。你可以根据自己的需求来自定义UserDetailsService的实现,以适应不同的用户信息存储方式。
阅读全文