登录问题:身份验证自动连线控制器问题Apache Netbeans Java



我正在用java构建登录,我一直在学习教程,但现在遇到了一个问题。该应用程序本应正常工作,我应该可以在邮递员身上试用,但它无法启动。问题是:

Description:

com.portfolio.anamorujaportfolio.Security.Controller.AuthController中的字段passwordEncoder需要一个类型为"org.springframework.Security.crypto.passwordEncoders"的bean,该bean可以注入点具有以下注释:-@org.springframework.beans.factory.annotation.Autowired(required=true(

行动:

请考虑在配置中定义一个类型为"org.springframework.security.crypto.password.PasswordEncoder"的bean。

/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/
package com.portfolio.anamorujaportfolio.Security.Controller;
import com.portfolio.anamorujaportfolio.Security.Dto.JwtDto;
import com.portfolio.anamorujaportfolio.Security.Dto.LoginUsuario;
import com.portfolio.anamorujaportfolio.Security.Dto.NuevoUsuario;
import com.portfolio.anamorujaportfolio.Security.Entity.Rol;
import com.portfolio.anamorujaportfolio.Security.Entity.Usuario;
import com.portfolio.anamorujaportfolio.Security.Enums.RolNombre;
import com.portfolio.anamorujaportfolio.Security.Service.RolService;
import com.portfolio.anamorujaportfolio.Security.Service.UsuarioService;
import com.portfolio.anamorujaportfolio.Security.jwt.JwtProvider;
import java.util.HashSet;
import java.util.Set;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/auth")
@CrossOrigin
public class AuthController {
@Autowired
PasswordEncoder passwordEncoder;
@Autowired
AuthenticationManager authenticationManager;
@Autowired
UsuarioService usuarioService;
@Autowired
RolService rolService;
@Autowired
JwtProvider jwtProvider;

@PostMapping("/nuevo")
public ResponseEntity<?> nuevo(@Valid @RequestBody NuevoUsuario nuevoUsuario, BindingResult bindingResult){
if(bindingResult.hasErrors())
return new ResponseEntity(new Mensaje("Campos mal puestos o email invalido"), HttpStatus.BAD_REQUEST);

if(usuarioService.existsByNombreUsuario(nuevoUsuario.getNombreUsuario()))
return new ResponseEntity(new Mensaje("Ese nombre de usuario ya existe"), HttpStatus.BAD_REQUEST);

if(usuarioService.existsByEmail(nuevoUsuario.getEmail()))
return new ResponseEntity(new Mensaje("Ese email ya existe"), HttpStatus.BAD_REQUEST);

Usuario usuario = new Usuario(nuevoUsuario.getNombre(), nuevoUsuario.getNombreUsuario(), nuevoUsuario.getEmail(), passwordEncoder.encode(nuevoUsuario.getPassword()));
Set<Rol>roles=new HashSet<>();
roles.add(rolService.getByRolNombre(RolNombre.ROLE_USER).get());

if(nuevoUsuario.getRoles().contains("admin"))
roles.add(rolService.getByRolNombre(RolNombre.ROLE_ADMIN).get());
usuario.setRoles(roles);
usuarioService.save(usuario);

return new ResponseEntity(new Mensaje("Usuario guardado"), HttpStatus.CREATED);
}


@PostMapping("/login")
public ResponseEntity<JwtDto> login(@Valid @RequestBody LoginUsuario loginUsuario, BindingResult bindingResult){
if(bindingResult.hasErrors())
return new ResponseEntity(new Mensaje("Campos mal puestos"), HttpStatus.BAD_REQUEST);
Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginUsuario.getNombreUsuario(),loginUsuario.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);

String jwt = jwtProvider.generateToken(authentication);

UserDetails userDetails = (UserDetails) authentication.getPrincipal();

JwtDto jwtDto = new JwtDto(jwt, userDetails.getUsername(), userDetails.getAuthorities());
return new ResponseEntity(jwtDto, HttpStatus.OK);
}   

}

It's my first go at Java, thanks in advance for the help!! 
I've no idea, but I want it to run 

这个错误说明了一切。基本上,应用程序认为缺少无法绑定PasswordEncoder的配置。

仔细观察,PasswordEncoder是Spring包的一部分,而AutoInjections的工作方式(默认情况下(是,Spring只扫描根包中的类,由于它不是根包的一部份,因此无法自动连接bean。

您可以从自定义配置类中这样初始化它,并将其注释为Bean,然后自动连接它。

@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

请在此处引用实现https://www.baeldung.com/spring-security-registration-password-encoding-bcrypt请参阅此处的文档https://docs.spring.io/spring-security/reference/features/authentication/password-storage.html#authentication-密码存储器希望这能有所帮助!

最新更新