簡體   English   中英

使用UserDetailsS​​ervice的Spring Security身份驗證

[英]Spring Security authentication using UserDetailsService

我有一些Spring安全身份驗證問題。 在我的應用程序中,一切都很好(CRUD操作運行良好),但登錄嘗試失敗。

這是我的代碼(我在下面標注了注釋,其中userDAO為null,這是驗證失敗的原因):

@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,我不知道如何解決這個問題。 整機配置JavaBased,你可以檢查出來了這里查看更多詳情這里

編輯: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不為null

試圖解決它像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();

當您自己實例化服務時,其自動連接的依賴項將始終為null 您必須讓Spring容器實例化它(已經通過使用@Service標記服務來完成),然后將其注入您的安全配置類,如下所示:

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

使用Bohuslav的這段代碼解決了問題

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

也錯過了

@ComponentScan("com.gi")

之前

public class SecurityConfig extends WebSecurityConfigurerAdapter {

缺乏造成的

Error:(24, 13) java: method userDetailsService in class org.springframework.security.config.annotation.authentication.builders.Authentic‌​ationManagerBuilder 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM