我在应用中添加用户时遇到问题,
输入代码。

//This is the SpringSecurityConfig class
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter{
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));

        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }


    @Autowired
    private ITrabajadorService trabajadores;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
         http.cors().and().csrf().disable();
        http.authorizeRequests().antMatchers("/antx/**","/bower_component/**","/build/**","/dist/**","/extra-plugins/**","/graph/**","/pages/**","/plugins/**")
        .permitAll()

        .antMatchers("/alacran/DirectorVentas/Pedidos"
                ,"/alacran/api/PedidosTienda/cambiaEstatusProductos/**")
                .hasAnyRole("Gerente de ventas")
        .antMatchers("/alacran/Planeacion/verPedidos","/alacran/Planeacion/crearOP"
                ,"/alacran/api/PedidosTiendas/todosPendientes/**"
                ,"/alacran/api/PedidosTiendas/obtenerProductosPorPedidoProducir/**"
                //,"/alacran/api/areas/iniciales/**"
                ,"/alacran/api/ordenProduccion/agregarOrdenv2/**"
                ,"/alacran/api/ProductoTerminado/todos/**"
                //,"/alacran/api/areas/iniciales"
                ,"/alacran/api/ordenProduccion/agregarOrdenv2"
                ).hasAnyRole("Generente de planeacion")
        .antMatchers("/alacran/OrdenProduccion/entrega/**","/alacran/OrdenProduccion/recibe/**"
                ,"/alacran/api/ordenProduccion/obtenerOrdenesPorArea/**"
                ,"/alacran/api/ordenProduccion/guardaPromesa/**"
                ,"/alacran/api/ordenProduccion/guardaConfirma/**"
                ,"/alacran/api/ordenProduccion/obtenerOrdenesPorAreaRecibe/**"
                ,"/alacran/api/ordenProduccion/confirmaPromisega/**"
                ).hasAnyRole("Supervisor de Bordado","Supervisor de corte","Supervisor de costura","Supervisor de decorado","Supervisor de control de calidad","Supervisor de empaquetado","Supervisor de almacen de PT","Supervisor 8")
        .antMatchers(<Here put my routes than are restricted>)
        .anyRequest().authenticated()
        .and()

            .formLogin().loginPage("/alacran/login")
            .defaultSuccessUrl("/alacran/inicio")
            .permitAll()
        .and()
            .logout().permitAll()
        .and()
        .exceptionHandling().accessDeniedPage("/alacran/error_403");

    }


    @Bean
    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
        final Properties users = new Properties();



        //users.put("user","pass,ROLE_USER,enabled"); //add whatever other user you need
        return new InMemoryUserDetailsManager(users);
    }
    @Autowired
    public void configureGlobal (AuthenticationManagerBuilder builder)throws Exception{
        List<Trabajador> trabajadoresLista = this.trabajadores.encontrarTodos();
        PasswordEncoder encoder = passwordEncoder();
        UserBuilder users = User.builder().passwordEncoder(encoder::encode);

        for(Trabajador p : trabajadoresLista) {
            builder.inMemoryAuthentication().withUser(users.username(p.getUsuarioSesion()).password(p.getContra()).roles(p.getPuesto().getNombre()));
        }



    }
}


这是我的rest控制器,此restcontroller在应用程序中添加新用户


@RestController
@RequestMapping("/alacran/api/usuariosnuevos")
public class TrabajadorControllerRest {
    @Autowired
    private ITrabajadorService trabajador;
    @Autowired
    private IPuestoService puesto;



    private InMemoryUserDetailsManager inMemoryUserDetailsManager;

    @Autowired
    public void  SimpleSecurityController(InMemoryUserDetailsManager inMemoryUserDetailsManager) {
       this.inMemoryUserDetailsManager = inMemoryUserDetailsManager;
    }
    @PostMapping("/nuevo")
    @ResponseBody
    public ResponseEntity<Trabajador> guardaUsuario(@RequestBody TrabajadorData TrabajadorData) throws Exception{

        //hacemos la instancia de lo necesario
        Trabajador trabajadorNuevo = new Trabajador();
        Long idpuesto = TrabajadorData.getPuesto();
        Puesto puestoNuevo = this.puesto.encontrarUno(idpuesto);
        /*ahora configuramos la contraseña*/
        //byte[] cifrada;
        /*String password;
        cifrada = this.cifra(TrabajadorData.getContra());
        password = cifrada.toString();
        */
        /*Set de las propiedades del objeto*/
        trabajadorNuevo.setNombre(TrabajadorData.getNombre());
        trabajadorNuevo.setDireccion(TrabajadorData.getDireccion());
        trabajadorNuevo.setPuesto(puestoNuevo);
        trabajadorNuevo.setTelefono(TrabajadorData.getTelefono());
        trabajadorNuevo.setContra(TrabajadorData.getContra());
        trabajadorNuevo.setUsuarioSesion(TrabajadorData.getUsuarioSesion());

        inMemoryUserDetailsManager.createUser((UserDetails)        User.withUsername(trabajadorNuevo.getUsuarioSesion()).password(trabajadorNuevo.getContra()).roles(trabajadorNuevo.getPuesto().getNombre()));

        return ResponseEntity.ok(this.trabajador.guardar(trabajadorNuevo));

    }
    }


错误是


java.lang.ClassCastException:
org.springframework.security.core.userdetails.User $ UserBuilder无法
被强制转换为org.springframework.security.core.userdetails.UserDetails

最佳答案

inMemoryUserDetailsManager.createUser((UserDetails) User.withUsername(trabajadorNuevo.getUsuarioSesion()).password(trabajadorNuevo.getContra()).roles(trabajadorNuevo.getPuesto().getNombre()));

您缺少在通过调用.build()获得的UserBuilder实例上调用.roles(trabajadorNuevo.getPuesto().getNombre())

10-05 22:47