2010-11-01 47 views
13

Câu hỏi đơn giản, tôi chỉ cần một con trỏ đúng hướng:Cách xử lý đăng nhập biểu mẫu bằng cách sử dụng Spring Security/Spring MVC

Tôi có một ứng dụng web Spring MVC/Spring Security đơn giản. Ban đầu tôi thiết lập bảo mật mùa xuân để trang đăng nhập mặc định hiển thị và xác thực đúng (tôi đã triển khai UserDetailsService với DaoAuthenticationProvider để thực hiện việc này).

Bước tiếp theo: thay thế trang đăng nhập mùa xuân mặc định bằng trang đăng nhập của tôi và đăng thông tin xác thực.

Nhưng tôi phải làm gì với thông tin xác thực đăng nhập được gửi? Tôi giả sử tôi đăng biểu mẫu lên bộ điều khiển, xác minh thông tin đăng nhập, nhưng tôi không rõ bước nào là đúng sau đó. Ví dụ:

  • Tôi có đang gọi phương thức AuthenticationManager không?
  • Tôi có cần phải xác định một hạt cho việc này không?
  • Có giao diện/dịch vụ nào tôi cần triển khai như AuthenticationEntryPoint hay gì đó không?

Tôi đã nhấn tài liệu 3 lần và không theo dõi chúng. Tôi biết điều này thật đơn giản, vì vậy tôi chỉ cần nghe quá trình này sẽ trôi chảy như thế nào.

+0

Bạn đang cố gắng đạt được điều gì? Tại sao bạn không thể cấu hình Spring Security để sử dụng biểu mẫu của riêng bạn thay vì biểu mẫu mặc định? – axtavt

+0

Ah vâng, tôi có thể làm được điều này, đó là cách mà tôi đã giết tôi. :) Có nhiều cách để làm điều gì đó trong mùa xuân và tôi đã bị mất giữa vô số các tùy chọn. Cuối cùng tôi chỉ cần hiểu rõ hơn về cách sử dụng . Tôi đã không nhận ra rằng nó thực sự sẽ chặn các yêu cầu trên đường dẫn đăng nhập-xử lý-url và xử lý chúng, tôi đã cố tạo bộ điều khiển riêng để xử lý các yêu cầu biểu mẫu đăng nhập (một bước không cần thiết cho việc đăng nhập biểu mẫu đơn giản). –

Trả lời

11

Bảo mật mùa xuân reference documentation phác thảo luồng xử lý cơ bản trong 5.4 Authentication in a Web Application. Có điểm # 6:

Tiếp theo máy chủ sẽ quyết định liệu thông tin xác thực được trình bày có hợp lệ hay không. Nếu chúng hợp lệ, bước tiếp theo sẽ xảy ra. Nếu chúng không hợp lệ, thường trình duyệt của bạn sẽ được yêu cầu thử lại (vì vậy bạn quay trở lại bước hai ở trên).

...

Bảo mật mùa xuân có các lớp riêng biệt chịu trách nhiệm cho hầu hết các bước được mô tả ở trên. Những người tham gia chính (theo thứ tự mà họ được sử dụng) là ExceptionTranslationFilter, một AuthenticationEntryPoint và một cơ chế xác thực “”, chịu trách nhiệm gọi cho AuthenticationManager mà chúng ta đã thấy trong phần trước.

Tôi phải thừa nhận, tài liệu ở đây là một chút bối rối vì vậy tôi sẽ cung cấp cho bạn một số gợi ý hơn - "xác thực cơ chế" được đề cập ở đây là những điều bạn đang theo đuổi, đó là trách nhiệm xử lý các chứng chỉ trình duyệt đang gửi.

Khi chi tiết đính kèm thông tin vào yêu cầu HTTP khác nhau rất nhiều giữa các phương thức xác thực khác nhau (dữ liệu biểu mẫu so với tiêu đề đồng nhất so với tiêu đề thông báo), không có cơ chế xác thực "" " phương pháp thực hiện cơ chế riêng của mình và trong trường hợp của xác thực dựa trên web, nó thường là một bộ lọc đặc biệt mà bạn phải định cấu hình trong web.xml.

Trong trường hợp của bạn, bạn có thể quan tâm nhất đến số UsernamePasswordAuthenticationFilter - số này được sử dụng để xử lý thông tin đăng nhập dựa trên mẫu cơ bản. Hợp đồng giữa biểu mẫu đăng nhập tùy chỉnh của bạn và bộ lọc là URL (nơi biểu mẫu được đăng) + tên trường và tên người dùng mật khẩu:

Biểu mẫu đăng nhập chỉ chứa các trường nhập j_username và j_password và bài đăng đến URL được giám sát bởi bộ lọc (theo mặc định này là/j_spring_security_check).

+0

Cảm ơn bạn đã giải thích chi tiết. Nó đã giúp tôi cuối cùng cũng hiểu cách thẻ hoạt động. Tôi không hiểu rằng về cơ bản nó hoạt động như một bộ điều khiển nơi nó thực sự xử lý các yêu cầu được gửi tới url xử lý đăng nhập và tôi cần chuyển các tham số có tên j_username và j_password –

+0

để bạn quan tâm đến một chủ đề tương tự? Tôi đang thử triển khai phương thức xử lý đăng nhập tùy chỉnh với cấu hình java và tôi đã mắc kẹt với vấn đề này: http://stackoverflow.com/questions/22738738/my-application-with-spring-security-dont-go-beyond-login-page . Bất kỳ trợ giúp nên rất biết ơn. –

1

Chúng tôi đang nói về cùng một vấn đề nhiều hơn và ít hơn, this is my approach hãy xem mọi người sẽ nói gì.

+0

Bạn đang sử dụng Bảo mật mùa xuân ở đó? Tôi đã bị mất khi đăng nhập biểu mẫu, nhưng với trang đăng nhập mặc định cơ bản do Spring Security cung cấp (một gói riêng biệt từ Spring Framework), bạn cần triển khai dịch vụ UserDetails và các tài liệu này đặc biệt gọi ra để lưu trữ bất kỳ thông tin người dùng nào trong phiên làm việc (chúng nên được lưu trữ trong một đối tượng UserDetails được xử lý bởi SecurityContextHolder). Bạn sẽ truy cập mọi thứ qua SecurityContextHolder và xác định xem người dùng đã xác thực có một vai trò cụ thể mà bạn đã định nghĩa cho nó trong đối tượng UserDetails hay không. –

+0

Thực ra, hiện tại tôi không sử dụng bất kỳ khung bảo mật Spring nào, nhưng tôi có thể là một ý tưởng hay. Tôi không lưu trữ bất cứ điều gì trên phiên HTTP vì theo như tôi hiểu nó không phải là thread-an toàn. Tôi đang lưu trữ nó ở cấp phiên. Tôi chưa quyết định liệu có đáng để thực hiện Spring Security và muốn nghe những gì các chuyên gia phải nói. –

+0

Bảo mật mùa xuân là tốt đẹp, và không quá khó để thực hiện. Đối với tôi (tôi hoàn toàn giống với kịch bản tương tự như bạn), nó dường như đủ logic. Có lẽ bạn sẽ lo lắng với việc tự làm nó gần như nhiều như bạn sẽ học thêm khuôn khổ, bạn sẽ chỉ dành nhiều thời gian lên phía trước hơn trong thời gian dài. Sau đó, thật dễ dàng để áp dụng nhiều tùy chọn bảo mật khác nhau. Tôi khuyên bạn nên đọc tài liệu ít nhất. –

16

Tôi sẽ thêm một câu trả lời rõ cho bất cứ ai đọc sách này trong tương lai:

Khi bạn xác định từ khóa trong an ninh mùa xuân nó sẽ xử lý đăng nhập cho bạn, tôi sẽ đi qua như thế nào nó hoạt động một cách chi tiết (ước gì nó là này chi tiết trong tài liệu):

<security:http auto-config="true"> 
    <security:form-login login-page="/login" 
     login-processing-url="/postlogin" 
     default-target-url="/myaccount" 
     authentication-failure-url="/login?loginError=true" /> 
    <security:logout logout-url="/logout" /> 
</security:http> 

các đăng nhập trang là url của trang đăng nhập. Bạn nên có một bộ điều khiển (hoặc trang HTML tĩnh) phục vụ trang này, đó là biểu mẫu đăng nhập khá của bạn.

login-processing-url là URL mà thành phần đăng nhập biểu mẫu xử lý. Nó giống như thành phần đăng nhập biểu mẫu thực hiện bộ điều khiển riêng của nó cho trang này. Bạn nên đăng biểu mẫu của mình vào trang này. Bạn cũng cần phải biết đặt tên cho thông số tên người dùng/mật khẩu "j_username" và "j_login"

Ngoài điều này và phần còn lại của các tùy chọn rõ ràng hợp lý ở trên, bạn nên triển khai một UserDetailsService - tức là tạo một lớp thực hiện các giao diện UserDetailsService mà được, và lợi nhuận, một đối tượng UserDetails (username/password) cho một tên người dùng được - và với điều kiện là với phần còn lại của cấu hình bảo mật:

<security:authentication-manager> 
     <security:authentication-provider ref="daoAuthenticationProvider" /> 
</security:authentication-manager> 

<bean id="daoAuthenticationProvider" 
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" > 
    <property name="userDetailsService" ref="myAuthorizationService" /> 
</bean> 
+0

Nếu bạn không chỉ định url xử lý đăng nhập, giá trị trang đăng nhập sẽ được sử dụng theo mặc định, do đó, biểu mẫu đăng nhập phải được đăng ở đó. (Spring Security 3.2.4) – xtian

+2

Lưu ý rằng trong Spring Security 4+ thông số tên người dùng/mật khẩu hiện mặc định là "username" và "password" – DaveRlz

+0

Việc sử dụng thuộc tính 'default-target-url' là gì? –

1

Xem việc niêm yết bằng limc để đáp ứng với Ritesh Câu trả lời của bạn tại số Configuring Spring Security 3.x to have multiple entry points Xem các phần có tiêu đề:

CẬP NHẬT 01-29-2011 - @ kỹ thuật Ritesh của
CẬP NHẬT - GIẢI PHÁP để @ kỹ thuật Ritesh của

Nó là một súc tích, tiên tiến ví dụ điển hình về cách bạn có thể tùy chỉnh quá trình đăng nhập ở Xuân An

1

Nếu bạn đang sử dụng cơ sở dữ liệu có thể truy cập JDBC, khi đó bạn có thể sử dụng nhà cung cấp xác thực sau và tránh tạo một tùy chỉnh. Nó cắt xuống mã cần thiết để 9 dòng XML:

<authentication-provider> 
    <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password from users where username=?" authorities-by-username-query="select u.username, r.authority from users u, roles r where u.userid = r.userid and u.username =?" /> 
</authentication-provider> 

Bạn có thể sau đó thiết lập nguồn dữ liệu của bạn như sau

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/DB_NAME" /> 
    <property name="username" value="root" /> 
    <property name="password" value="password" /> 
</bean> 

Hãy nhìn vào bài đăng này: http://codehustler.org/blog/spring-security-tutorial-form-login/ Nó bao gồm tất cả mọi thứ bạn cần biết về tùy chỉnh đăng nhập biểu mẫu Bảo mật mùa xuân.

1
<security:http auto-config="true"> 
    <security:form-login login-page="/login" 
    login-processing-url="/postlogin" 
    default-target-url="/myaccount" 
    authentication-failure-url="/login?loginError=true" /> 
    <security:logout logout-url="/logout" /> 
</security:http> 

trang đăng nhập là URL của biểu mẫu đăng nhập đăng nhập-xử lý-url là url nơi biểu mẫu đăng nhập được gửi. Spring sẽ tự gọi trình quản lý xác thực được ánh xạ bởi bạn trong tệp security.xml.

Process

  1. Bạn cần phải viết một lớp mà thực hiện org.springframework.security.authentication.AuthenticationProvider với overriden authenticate phương pháp xác thực (authentication Authentication)
  2. hạng Nhì mà kéo dài org.springframework.security. core.userdetails.UserDetailsService với phương thức loadUserByUsername được ghi đè (tên người dùng String)
  3. Biểu mẫu lớp thứ hai, nơi bạn có thể gọi DAO của bạn và xác thực người dùng bằng cơ sở dữ liệu tìm nạp tên người dùng và mật khẩu.
  4. Trong xác thực xác thực (Xác thực xác thực), bạn sẽ so sánh mật khẩu và trả lại lỗi thành công bạn đã hoàn tất.
Các vấn đề liên quan