2011-11-14 21 views
7

Tôi có đoạn code sau (cố gắng đăng nhập người dùng trong programatically):mùa xuân Authentication.setAuthenticated (boolean) java.lang.IllegalArgumentException: Không thể thiết lập thẻ này để tin cậy

List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
authorities.add(new GrantedAuthorityImpl("ROLE_ADMIN")); 
... 
User tempUser = new User(correctUsername, 
    correctPassword, 
    true, true, true, true, // logging them in... 
    authorities // type is List<GrantedAuthority> 
); 
... 
Authentication authentication 
    = new UsernamePasswordAuthenticationToken(tempUser, authorities); 
    // I'm using authorities again (List<GrantedAuthority>) 
    // is this the right spot for it? 
... 
// this is the line causing the error 
authentication.setAuthenticated(true); 

Khi tôi cố gắng chạy mà tôi nhận được như sau:

java.lang.IllegalArgumentException: Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead 

Lưu ý rằng tôi đang sử dụng danh sách authorities của GrantedAuthority s cả trong UserAuthentication đối tượng. Tôi không chắc mình nên sử dụng chúng ở đâu. Tôi đang cố gắng để nhân rộng câu trả lời cho another SO question nhưng đang chạy vào ngoại lệ được đăng ở trên. câu hỏi tương tự khác mà không khá trả lời câu hỏi của tôi:

Sau khi một số tìm kiếm gần nhất tôi đã tìm thấy một câu trả lời là tại the forum at springsource.org, và người đó bằng cách sử dụng một deprecated method, nhưng đó là một cách tiếp cận tương tự. Làm thế nào tôi có thể đăng nhập một người dùng theo cách lập trình?

+1

Dòng nào gây ra sự cố? –

+0

người cuối cùng; với bình luận ở trên nó nói rằng 'đây là dòng gây ra lỗi ('authentication.setAuthenticated (true);') – Josh

Trả lời

11

Bạn không cần gọi rõ ràng authentication.setAuthenticated(true) (trên thực tế, bạn không được phép). Các nhà xây dựng làm điều đó cho bạn.

Tuy nhiên, bạn đang gọi hàm tạo sai. Bạn nên gọi:

Authentication authentication 
    = new UsernamePasswordAuthenticationToken(tempUser, password, authorities); 

Kiểm tra javadoc cho Tên người dùngPasswordĐã xác thựcToken.

+0

Tuyệt vời! cảm ơn rất nhiều. Tôi có thể hỏi tại sao cả hai nhà xây dựng 'User' và' UsernamePasswordAuthenticationToken' cần một danh sách các grantedauthorities? Dù sao nó hoạt động vì vậy tôi sẽ chấp nhận điều này khi tôi có thể – Josh

+1

Đó là hai mức trừu tượng xảy ra va chạm ở đây. UsernamePasswordAuthenticationToken là phiên bản cụ thể của một thực thể có thể hoặc không thể được xác thực (Authentication). Người dùng là việc thực hiện một Hiệu trưởng (chi tiết của một người dùng) hiện có độc lập với bất kỳ trạng thái xác thực nào. – pap

+0

Được chuyển thành cùng một vấn đề, giả sử rằng tôi cần gọi phương thức 'setAuthenticated()' một cách rõ ràng. –

Các vấn đề liên quan