当前位置: 首页 > 知识库问答 >
问题:

试图对用户进行身份验证时发生内部错误

薛俊美
2023-03-14

我已经创建了UserDetailsServiceImpl。在这里我得到了这个用户的用户名和角色。但我不明白问题出在哪里。我已经在数据库中尝试了sql查询。

securityconfig.java

@EnableWebSecurity
@ComponentScan("com")
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Bean
public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
};

@Autowired
protected void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/login", "/", "/veteriner").permitAll().antMatchers("/**")
            .hasRole("ADMIN").and().formLogin().loginPage("/login").defaultSuccessUrl("/login/login-status-success")
            .failureUrl("/login/login-status-error").permitAll().usernameParameter("username")
            .passwordParameter("password").and().logout().logoutSuccessUrl("/logout-success")
            .invalidateHttpSession(true).permitAll().and().csrf();
}

LoginController.java

 @Controller
 @RequestMapping(value = "/login", method = RequestMethod.GET)
 public class LoginController {

 @GetMapping
 public ModelAndView home() throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("login");
    return mv;
}

@RequestMapping(path="/login-status-error",method = RequestMethod.GET)
@ResponseBody
public ModelAndView erorLogin() throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("main");
    return mv;
}

@RequestMapping(path="/login-status-succes",method = RequestMethod.GET)
@ResponseBody
public ModelAndView succesLogin() throws Exception {
    ModelAndView mv = new ModelAndView();
    mv.setViewName("veteriner");
    return mv;
}

}

@Service("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {

@Autowired
private UserService userService;

@Transactional(readOnly = true)
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    com.model.User user = userService.findByUsername(username);
    if (user == null) {
        throw new UsernameNotFoundException("User not found.");
    }

    User securityUser = new User(user.getUsername(), user.getPassword(), true, true, true, true,
            buildUserAuthority(user.getUserRoles()));
    return securityUser;
}

private List<GrantedAuthority> buildUserAuthority(List<User_role> userRoles) {
    Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();

    for (User_role userRole : userRoles) {
        setAuths.add(new SimpleGrantedAuthority(userRole.getRole().getRoleName()));
    }

    List<GrantedAuthority> results = new ArrayList<GrantedAuthority>(setAuths);
    return results;
}

共有1个答案

巴宏恺
2023-03-14

有太多的事情让我无法理解,但我认为这是一个简单的情况,您不能同时在同一个类中创建和注入同一个bean。

即。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public UserDetailsService userDetailsService() {...}
}

行不通。想想看,您需要UserDetailsService来创建应该创建UserDetailsService的类。那怎么行?

您可以改为这样做:

@EnableWebSecurity
@ComponentScan("com")
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }

    @Bean
    public DaoAuthenticationProvider getDaoAuthenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        //call the userDetailsService() method here
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(this.passwordEncoder());
        return authProvider;
    }

    ...

}

虽然这看起来很奇怪,但它做了正确的事情。Spring代理所有方法调用,所以当您看似直接调用userdetailsservice()时,实际上它会注入适当的bean。

 类似资料:
  • 我正在使用spring Boot MVC安全性和JPA Hibernate以及Thymeleaf模板引擎。我正在尝试创建一个用户登录,其中一些用户已经存储在DB(MySQL)中。只要我使用正确的凭据,就可以了。此外,当我使用正确的用户名和错误的密码时,它会显示错误消息。但当我给出一个不在表中的不存在的用户名(users)或将字段留空时,我有一个错误: ERROR 11759---[nio-8080

  • 我无法登录我的系统。当我在我的web表单中插入数据并点击登录按钮时,我的系统不工作。(数据是正确的)。 用户实体: 用户存储库: 安全配置: 错误消息:

  • 我试图通过Python客户端查询BigQuery数据集。 我有一个启用了计费的项目,一个按此处指示分配了BigQuery管理员角色的服务帐户:https://cloud.google.com/bigquery/docs/quickstarts/quickstart-client-libraries 这是我正在尝试的代码片段 客户。查询调用导致此错误: 关于我能做些什么来解决这个身份验证问题,有什么

  • 我有一个ASP。NET MVC Web应用程序在Azure应用程序服务中作为Web应用程序运行。此web应用程序通过HttpClient从控制器调用Azure函数。使用Azure Active Directory在web应用中配置身份验证/授权。我需要在调用Azure函数时对用户进行身份验证,以便我可以访问用户声明。我还试图在Azure功能本身中配置身份验证,但每当我从web应用调用该功能时,这都

  • 我有一个REST服务,它依赖于外部系统来验证令牌,但需要自己进行授权(使用like@Secured进行API级访问)。 要求: UI使用外部系统生成令牌 一种可能的解决方案是使用过滤器: > UI使用外部系统生成令牌 UI使用令牌对我的服务进行REST调用 我的服务有一个过滤器,它使用令牌调用外部系统 有效令牌的外部系统发回用户详细信息 我对成功呼叫集的服务与SecurityContextHold

  • 我有一个react应用程序在一个单独的端口(localhost:3000)上运行,我想用它来验证用户,目前我的Spring后端(localhost:8080)有一个代理设置。 我能以某种方式手动验证而不是通过发送一个请求到我的后端,并获得一个会话cookie,然后在每个请求中包含cookie吗?这也将简化iOS方面的验证过程(使用此过程,我只能将会话cookie值存储在keychain中,并在每次