我试图通过基于用户名和密码对用户进行身份验证来从数据库中获取用户。我使用的是基本身份验证。我正在restapi的授权头中发送用户名和密码
在我的控制器中,getuser()方法调用userservice类的getuser()方法
@GetMapping("/user/self")
public ResponseEntity<UserDto> getUser() {
UserDto UserDto = userService.getUser();
return new ResponseEntity<>(UserDto, HttpStatus.OK);
}
@PutMapping("/user/self")
public ResponseEntity<User> updateUser(@Valid @RequestBody Map<String, String> userMap, Principal principal) {
String username = principal.getName();
String firstname = userMap.get("firstName");
String lastName = userMap.get("lastName");
String password = BCrypt.hashpw(userMap.get("password"), BCrypt.gensalt(10));
User user = userService.getUserByUserName(username);
user.setFirstName(firstname);
user.setLastName(lastName);
user.setPassword(password);
userService.save(user);
return new ResponseEntity<>(user, HttpStatus.NO_CONTENT);
}
userservice类实现userdetailsservice并重写loaduserbyusername方法,该方法要求将用户名作为参数传递。我的问题是:如何将username传递给从控制器调用的userservice类中的loaduserbyusername()方法。用户名值驻留在哪里?我的理解是-身份验证对象包含传递给身份验证对象的用户凭据当用户键入其凭据并发送其请求时,如何检索此用户名值
@Service
public class UserService implements UserDetailsService {
@Autowired
UserRepository userRepository;
public UserDto save(User user) {
String hashedPassword = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt(10));
user.setPassword(hashedPassword);
userRepository.save(user);
UserDto userDto = new UserDto();
userDto.setId(user.getId());
userDto.setFirstName(user.getFirstName());
userDto.setLastName(user.getLastName());
userDto.setUserName(user.getUserName());
userDto.setAccountUpdatedAt(user.getAccountUpdatedAt());
userDto.setAccountCreatedAt(user.getAccountCreatedAt());
return userDto;
}
@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
User user = userRepository.findByUserName(userName);
if (user == null) {
throw new UsernameNotFoundException(userName + "was not found");
}
return new UserPrincipal(user);
}
这是我的存储库代码:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
User findByUserName(String userName);
}
这是我的身份验证码:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Autowired
private AuthenticationEntryPoint authenticationEntryPoint;
@Autowired
UserService userService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable();
http.authorizeRequests().antMatchers("/v1/user").permitAll()
.antMatchers("/v1/user/self").authenticated().and().httpBasic()
.authenticationEntryPoint(authenticationEntryPoint);
}
}
1条答案
按热度按时间798qvoo81#
如果你在处理jpa,那么在你的情况下,你必须使用
userDetailsService
而不是jdbcauthentication
,因此您的安全类将如下所示:然后您可以在
UserService
类以满足以下示例中的业务需要:另外,不要忘记创建
findByUsername
方法也不要忘记实现org.springframework.security.core.userdetails.UserDetails
在模块类中: