java - 使用 UserDetailsS​​ervice 的 Spring Security 身份验证

标签 java spring spring-security

我在 Spring 安全认证方面遇到了一些问题。 在我的应用程序中,一切都运行良好(CRUD 操作运行良好),但登录尝试失败。

这是我的代码(我在下面用注释标记了 userDAO 为空,这是身份验证失败的原因):

@Service
public class UserServiceImpl implements UserService, UserDetailsService {

    @Autowired
    UserDAO userDAO;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userDAO.getUserByUsername(username); //userDAO == null Causing NPE
        if (user == null)
            throw new UsernameNotFoundException("Oops!");

        List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority(user.getRole()));

        return new org.springframework.security.core.userdetails
                .User(user.getLogin(), user.getPassword(), authorities);
    }

@Override
    public List<User> getUsers() {
        return userDAO.getUsers();//userDAO !=null
    }
//rest of code skipped

我的 SecurityConfig 看起来像这样

@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

 UserServiceImpl userService = new UserServiceImpl();

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }
//rest of code skipped

我标记了我在哪里得到 NPE,但我不知道如何解决这个问题。整个配置是基于 Java 的,您可以在此处查看更多详细信息 HERE

编辑:在 Controller 中以这种方式调用 getUsers():

@Controller
public class LoginController {
    @Autowired
    UserService userService;

 @RequestMapping(value = "/dashboard")
    public ModelAndView userDashboard(){
        ModelAndView modelAndView = new ModelAndView("Dashboard");
        List<User> userList = userService.getUsers();
        modelAndView.addObject("users", userList);
        return modelAndView;
    }

在这种情况下(调用 userService.getUsers() 时)userDAO 不为空

尝试按照 Bohuslav Burghardt 的建议修复它,我得到了

 method userDetailsService in class org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder cannot be applied to given types;
  required: T
  found: com.gi.service.UserService
  reason: inferred type does not conform to upper bound(s)
    inferred: com.gi.service.UserService
    upper bound(s): org.springframework.security.core.userdetails.UserDetailsService

排队 auth.userDetailsS​​ervice(userService);

最佳答案

这是不正确的部分:

UserServiceImpl userService = new UserServiceImpl();

当您自己实例化服务时,其 Autowiring 的依赖项将始终为 null。您必须让 Spring 容器实例化它(已经通过使用 @Service 标记服务来完成),然后将它注入(inject)您的安全配置类中,如下所示:

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userService;
}

关于java - 使用 UserDetailsS​​ervice 的 Spring Security 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29335608/

相关文章:

java - 如何使用 Spring Security + Angular 登录/认证

Java:ClassCastException;相同的类加载器?

java - 如何将列表从 Controller 发送到thymeleaf

java中地理空间字段的2dsphere索引的Spring mongodb注释......?

java - 如何在 spring-boot 中设置 hibernate.format_sql?

grails - 登录事件监听器中的另一个事务错误更新或删除了行?

java - 防止抽象实现覆盖某些方法

java - fileAge 属性仅有时有效

java - 使用 UUID 获取玩家名称

java - 成功认证后 Spring 安全性未命中 default-target-url