2010-07-01 41 views
5

Tôi có nhà cung cấp xác thực tùy chỉnh được xác định trong cấu hình Bảo mật mùa xuân của mình. Lớp này triển khai AuthenticationProvider và tôi có thể đăng nhập thành công bằng cách sử dụng biểu mẫu được định nghĩa trên trang của tôi. Vấn đề là tôi muốn gọi lớp này không chỉ trên trang đăng nhập, mà còn từ trang đăng ký.Mùa xuân - Gọi nhà cung cấp xác thực tùy chỉnh từ bộ điều khiển

Trang đăng ký sử dụng một lớp lệnh khác và thu thập thêm thông tin hơn biểu mẫu đăng nhập. Ngay bây giờ, khi người dùng đăng ký, tôi gọi bộ điều khiển thích hợp, thêm bản ghi vào cơ sở dữ liệu và sau đó họ có thể đăng nhập nhưng họ không đăng nhập tự động. Vì họ vừa đưa cho tôi tên người dùng/mật khẩu của họ trên trang đăng ký, tôi có thể chuyển nó cho lớp AuthenticationProvider tùy chỉnh để họ cũng đăng nhập không?

Tôi đã thử tạo lớp org.springframework.security.Authentication trong bộ điều khiển đăng ký và gọi phương thức xác thực trên lớp AuthenticationProvider của khách hàng của tôi và điều này không có lỗi, nhưng người dùng chưa đăng nhập. Tôi có phải gọi một phương thức cao hơn trong chuỗi lọc Spring Security để thực hiện điều này không? Tôi có nên chuyển hướng bộ điều khiển đến URL j_spring_security_check không? Nếu có, tôi sẽ chuyển tên người dùng/mật khẩu như thế nào?

Trả lời

1

Bạn cần đặt kết quả của AuthenticationProvider.authenticate() vào SecurityContext (thu được từ SecurityContextHolder). Bạn cũng cần lưu ý AuthenticationSuccessEvent - nếu ứng dụng của bạn dựa vào sự kiện này (một số tính năng của Spring Security cũng có thể sử dụng nó), bạn nên xuất bản nó (bạn có thể nhận được mặc định AuthenticationEventPublisher qua autowiring). Có thể hữu ích khi gói nhà cung cấp xác thực của bạn với ProviderManager, nó tự động xuất bản sự kiện bằng cách sử dụng nhà xuất bản đã cho.

2

Sự cố bạn gặp phải là mặc dù bạn đã xác thực thành công người dùng mà bạn chưa lưu trữ kết quả xác thực này trong số SecurityContext của người dùng. Trong ứng dụng web this is a ThreadLocal objectSecurityContextPersistenceFilter sẽ sử dụng để store the user's credentials in the HTTPSession

Bạn cũng nên tránh xác thực trực tiếp với nhà cung cấp xác thực tùy chỉnh của mình nếu có thể. Cấu hình xml của bạn phải chứa một số AuthenticationManager mà nhà cung cấp xác thực tùy chỉnh của bạn đã được kết nối. Ví dụ,

<bean id="customAuthenticationProvider" 
    class="com.foo.CustomAuthenticationProvider"> 
    <property name="accountService" ref="accountService"/> 
</bean> 
<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="customAuthenticationProvider"/> 
</security:authentication-manager> 

Nếu bạn dây các authenticationManager vào dịch vụ đăng ký và xác thực bằng rằng nó sẽ thêm vào đó,

Dịch vụ đăng ký của chúng tôi thực hiện như sau

final UsernamePasswordAuthenticationToken authRequest = new 
    UsernamePasswordAuthenticationToken(username, password); 

final Authentication authentication = 
    authenticationManager.authenticate(authRequest); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

Chúng tôi cũng tùy lưu trữ các kết quả xác thực vào thời điểm này trong một nhớ-me cookie của sử dụng phương pháp onLoginSuccess() của TokenBasedRememberMeServices.

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