Spring security là gì
Xem bài viết cội trên đây:Quý khách hàng hoàn toàn có thể thực hiện bài bác giảng này để đọc Spring Security là gì và các tác dụng chủ công nlỗi authentication, authorization tốt đảm bảo an toàn khai quật thông thường hoạt động như thế nào. Hình như, còn có những thắc mắc thường tốt gặp mặt nhưng bao gồm toàn cục câu chữ.Lưu ý của bạn biên tập : Với khoảng tầm 6500 từ bỏ, bạn có thể sẽ không còn mong muốn đọc trên thứ di động. Hãy lưu lại trang và quay lại sau
Bạn đang xem: Spring security là gì
RestControllers của doanh nghiệp.Vấn đề là: Không tất cả mật mã bảo mật nào được mã hóa vào DispatcherServlet kia cùng các bạn cũng rất hoàn toàn có thể không thích tìm mẫm với header HTTPhường Basic Auth đơn giản trong
Controllers của bản thân mình. Để mang lại tối ưu, vấn đề authentication cùng authorization phải được thực hiện trước khi một request truy cập vào
Controllers của người sử dụng.May mắn rứa, tất cả một phương pháp để thực hiện đúng mực vấn đề đó vào thế giới website Java: chúng ta có thể đặt cỗ lọc lên trước những servlet, tức là các bạn bao gồm thể viết SecurityFilter cùng cấu hình nó vào Tomcát (servlet container/ application server) của bạn để thanh lọc mọi request HTTP trước khi nó truy cập vào servlet của chúng ta.
Một SecurityFilter đối chọi giảnMột SecurityFilter có khoảng 4 tác vụ và một cách thực thi đơn giản dễ dàng vượt mức hoàn toàn có thể trông như thế này:
import javax.servlet.*;import javax.servlet.http.HttpFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class SecurityServletFilter extends HttpFilter
Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException UsernamePasswordToken token = extractUsernameAndPasswordFrom(request); // (1) if (notAuthenticated(token)) // (2) // either no or wrong username/password // unfortunately the HTTPhường status code is called "unauthorized", instead of "unauthenticated" response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // HTTP. 401. return; if (notAuthorized(token, request)) // (3) // you are logged in, but don't have sầu the proper rights response.setStatus(HttpServletResponse.SC_FORBIDDEN); // HTTPhường 403 return; // allow the HttpRequest to lớn go khổng lồ Spring's DispatcherServlet // and
Controllers. chain.doFilter(request, response); // (4) private UsernamePasswordToken extractUsernameAndPasswordFrom(HttpServletRequest request) // Either try & read in a Basic Auth HTTPhường Header, which comes in the khung of user:password // Or try and find size login request parameters or POST bodies, i.e. "username=me" và "password="myPass" return checkVariousLoginOptions(request); private boolean notAuthenticated(UsernamePasswordToken token) // compare the token with what you have sầu in your database...or in-memory...or in LDAP.... return false; private boolean notAuthorized(UsernamePasswordToken token, HttpServletRequest request) // check if currently authenticated user has the permission/role to access this request's /URI // e.g. /admin needs a ROLE_ADMIN , /callcenter needs ROLE_CALLCENTER, etc. return false;
Thứ nhất, bộ thanh lọc yêu cầu extract username/password từ request. Nó hoàn toàn có thể trải qua Basic Auth Http Header, hoặc những field vào form, hoặc cookie, v.v.Sau đó, cỗ lọc đề xuất xác xắn bằng phương pháp đối chiếu tổ hợp username/password đó với một sản phẩm gì đó , chẳng hạn như database.Sau lúc authenticate thành công xuất sắc, cỗ thanh lọc yêu cầu kiểm tra user giành được phép truy vấn requested URI hay không.Nếu request vẫn tồn tại sau tất cả các lần bình chọn này, thì cỗ lọc hoàn toàn có thể chất nhận được request đưa đến DispatcherServlet của công ty, tức là
Controllers của công ty.FilterChainsXác minch trong thực tế: Trong khi code bên trên có thể vận động Lúc biên dịch, nó sớm xuất xắc muộn cũng dẫn cho một cỗ thanh lọc hóa học đầy mặt hàng tấn code cho các phép tắc authentication và authorization khác biệt.Trong nhân loại thực, bạn sẽ phân tách bộ thanh lọc này thành nhiều cỗ thanh lọc, kế tiếp các bạn _cha_in cùng nhau.Ví dụ: một request HTTPhường. sẽ…Trước tiên, đi qua LoginMethodFilter…Sau kia, trải qua AuthenticationFilter…Sau kia, chuyển qua AuthorizationFilter…Cuối thuộc, chạm vào servlet của người sử dụng.Khái niệm này được Hotline là FilterChain cùng câu lệnh sau cuối trong method ở bộ thanh lọc phía trên của bạn đích thực đã authorize mang đến thiết yếu chain đó:
Với một bộ thanh lọc (chain) điều này thì về cơ bản, chúng ta cũng có thể xử trí số đông sự việc authentication tốt authorization gồm vào áp dụng của bản thân nhưng không phải đổi khác vấn đề thực hiện vận dụng thực tế của công ty (nlỗi là
Controllers của bạn).Với hồ hết kiến thức kia, hãy thuộc khám phá Spring Security áp dụng phép màu bộ lọc này ra làm sao nhé.
Nếu bạn không ngừng mở rộng một loại đó thành một danh mục, nó đang giống nhỏng Spring Security không những mua đặt một cỗ thanh lọc, rứa vào kia, nó thiết lập toàn thể một filterchain bao hàm 15 (!) bộ thanh lọc khác biệt.Vì vậy, lúc một HTTPRequest đến, nó sẽ đi qua vớ cả 15 cỗ lọc này, trước lúc request của người tiêu dùng sau cuối truy vấn vào
RestControllers của khách hàng. Thứ đọng từ cũng đặc trưng, bắt đầu trường đoản cú trên cùng list đó cùng trở lại đáy.
Xem thêm: Toán Tử Unary Là Gì ? Unary Nghĩa Là Gì Trong Tiếng Việt
FilterSecurityInterceptor : Thực hiện tại authorization của các bạn.Vì vậy, với một trong những cỗ lọc này, Spring Security cung cấp cho chính mình trang login / logout, tương tự như tài năng login bởi Basic Auth hoặc Form Logins, tương tự như một trong những nhân kiệt bổ sung như CsrfFilter, mà lại họ đã tìm hiểu sau.Nghỉ giữa hiệp : Những bộ lọc đó, đa phần, chính là Spring Security. Không rộng, không thua kém. Chúng làm toàn bộ quá trình. Những gì còn sót lại cho chính mình là cấu hình giải pháp chúng vận động, tức URL nào yêu cầu bảo vệ, URL làm sao bắt buộc bỏ qua mất và bảng cửa hàng tài liệu nào vẫn được áp dụng nhằm authenticate.Do kia, bước tiếp theo họ yêu cầu cẩn thận giải pháp thông số kỹ thuật Spring Security.
EnableWebSecurity.Extends WebSecurityConfigurer, về cơ phiên bản hỗ trợ cho bạn một DSL/methods cấu hình. Với phần đông cách thức kia, bạn có thể chỉ định và hướng dẫn phần lớn URI làm sao trong áp dụng của bản thân mình nhằm bảo đảm hoặc đều biện pháp đảm bảo an toàn như thế nào cần bật/tắt.Đây là giao diện của một WebSecurityConfigurerAdapter điển hình:
EnableWebSecurity // (1)public class WebSecurityConfig extends WebSecurityConfigurerAdapter // (1)
Overrideprotected void configure(HttpSecurity http) throws Exception // (2) http .authorizeRequests() .antMatchers("/", "/home").permitAll() // (3) .anyRequest().authenticated() // (4) .and() .formLogin() // (5) .loginPage("/login") // (5) .permitAll() .and() .logout() // (6) .permitAll() .and() .httpBasic(); // (7)
EnableWebSecurity, extends tự WebSecurityConfigurerAdapter.Bằng phương pháp override phương thức thông số kỹ thuật (HttpSecurity) của adapter, bạn sẽ đã có được một DSL bé dại xinch để bạn tất cả thể cấu hình FilterChain của chính bản thân mình.Tất cả các request đã đến / và /home được cấp phép - người tiêu dùng không phải authenticate nữa. Quý khách hàng sẽ sử dụng antMatcher , tức là bạn có thể sử dụng ký tự đại diện (*, * *,?) Trong chuỗi.Mọi request khác các phải người dùng authenticate trước , tức là user đề xuất login.quý khách hàng vẫn để khung login (username/password dưới dạng form), cùng với loginPage thiết lập ( /login ,Có nghĩa là không phải trang được tạo nên tự động của Spring Security). Bất kỳ ai cũng rất có thể truy vấn trang login nhưng mà không cần phải singin trước (permitAll; nếu không, Shop chúng tôi sẽ sở hữu Catch-22!).Cũng tương tự như nhỏng (5) mà lại là với trang logoutTrên không còn, chúng ta đang dần cho phép Basic Auth, nghĩa là gửi một HTTPhường Basic Auth Header để authenticate.Cách áp dụng DSL cấu hình của Spring SecurityPhải mất một thời gian để gia công quen thuộc cùng với DSL kia, mà lại các bạn sẽ tra cứu thấy các ví dụ rộng vào phần Câu hỏi thường xuyên gặp: AntMatchers: N hững ví dụ phổ biến .Điều quan trọng hiện nay đó là configure method này là nơi chúng ta chỉ định:URL như thế nào yêu cầu bảo đảm an toàn (đang authenticate()) cùng URL như thế nào được cấp phnghiền (allowAll ()).Những method authenticate nào được cấp phép (formLogin (), httpBasic ()) và bí quyết chúng được cấu hình.Nói vắn tắt: cấu hình security hoàn hảo của vận dụng của người sử dụng.Lưu ý : Quý Khách vẫn không cần phải override ngay lập tức nhanh chóng configure method của adapter, vì chưng nó mang định kèm theo với một implementation. Cụ thể nlỗi dưới đây:
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer protected void configure(HttpSecurity http) throws Exception http .authorizeRequests() .anyRequest().authenticated() // (1) .and() .formLogin().and() // (2) .httpBasic(); // (3)
Để tróc nã cập bất kỳ URI ( anyRequest()) làm sao trên vận dụng của công ty, bạn phải authenticate (authenticated()).Form login ( formLogin()) cùng với thiết lập mặc định được bật.Cũng nhỏng Basic HTTPhường. authentication( httpBasic()).C ấu hình khoác định này là nguyên do tại sao áp dụng của chúng ta bị khóa ngay lập tức sau khi chúng ta thêm Spring Security vào nó. Đơn giản buộc phải không?Tổng quát: Cấu hình DSL của WebSecurityConfigurerAdapterChúng ta vẫn hiểu được Spring Security gồm một số bộ lọc mà bạn cấu hình với class WebSecurityConfigurerAdapter
Configuration.Nhưng không đủ 1 phần đặc biệt quan trọng. Hãy rước BasicAuthFilter của Spring có tác dụng ví dụ. Nó hoàn toàn có thể extract username / password từ một HTTPhường. Basic Auth header, nhưng lại nó authenticate gần như lên tiếng này dựa trên điều gì?Đến đây thoải mái và tự nhiên dẫn họ tới thắc mắc về kiểu cách authentication vận động với Spring Security.
Beans khác nhau nhằm Spring Security hoạt động, nếu không các bạn sẽ nhận ra những exception hơi cạnh tranh gọi (nlỗi NullPointerException nếu như bạn quên hướng đẫn PasswordEncoder). Hãy ghi ghi nhớ nó trong thâm tâm trí.Chúng ta hãy chu đáo nhị kịch bản đầu.
create table users (id int auto_increment primary key, username varchar(255), password varchar(255));
Trong ngôi trường hợp này, Spring Security buộc phải bạn khẳng định nhì bean để thiết lập với chạy authenticationMột UserDetailsService.Một PasswordEncoderChỉ định một UserDetailsService dễ dàng nlỗi sau:
Beanpublic UserDetailsService userDetailsService() return new MyDatabaseUserDetailsService(); // (1)
MyDatabaseUserDetailsService implements UserDetailsService - một interface rất đối kháng giản gồm 1 method trả về một object UserDetails:
public class MyDatabaseUserDetailsService implements UserDetailsService UserDetails loadUserByUsername(String username) throws UsernameNotFoundException // (1) // 1. Load the user from the users table by username. If not found, throw UsernameNotFoundException. // 2. Convert/wrap the user to a UserDetails object & return it. return someUserDetails; public interface UserDetails extends Serializable // (2) String getUsername(); String getPassword(); // more methods: // isAccountNonExpired,isAccountNonLocked, // isCredentialsNonExpired,isEnabled
Một UserDetailsService cài (load) UserDetails qua username của user. Lưu ý rằng method chỉ nhận một tsi số: username (chưa phải password).Interface UserDetails có các method để đưa (hashed) password cùng một method để đưa username.UserDetails thậm chí là còn có rất nhiều method hơn, ví dụ như account sẽ hoạt động giỏi bị ngăn, báo cáo singin đã không còn hạn tốt user được cấp phép gì - mà lại bọn họ sẽ không còn nói đến ở chỗ này.Vì vậy, chúng ta có thể từ implement những interface này, giống hệt như bọn chúng ta đã làm cho ở bên trên, hoặc là sử dụng những interface hiện tại tất cả nhưng mà Spring Security cung cấp.Các Implementation sẵn cóMột xem xét nhỏ: quý khách hàng luôn luôn có thể tự bản thân thực hiện những interface UserDetailsService cùng UserDetails.Tuy nhiên, chúng ta có thể thay thế sửa chữa bằng các implementations tất cả sẵn của Spring Security mà lại chúng ta có thể sử dụng/configure/extend/override.JdbcUserDetailsManager, là 1 trong những UserDetailsService dựa trên JDBC (database). Quý Khách bao gồm thể cấu hình nó nhằm khớp với cấu trúc bảng/cột user của mình .InMemoryUserDetailsManager , giữ tất cả các cụ thể user in-memory cùng cực tốt cho việc demo.
Xem thêm: Chiếm Spotlight Nghĩa Là Gì ? Tìm Hiểu Ngay Chiếm Spotlight Có Ý Nghĩa Gì
org.springframework.security.core.userdetail.User, là 1 trong những implementation UserDetails mang định, hợp lý và phải chăng cơ mà bạn cũng có thể áp dụng. Điều đó Có nghĩa là có khả năng ánh xạ/xào luộc thân những entity/ bảng database của người tiêu dùng cùng class User này. Bên cạnh đó, bạn có thể chỉ việc có tác dụng cho các entity của chính mình implement interface UserDetails.Quy trình thao tác làm việc không thiếu của UserDetails: HTTP Basic AuthenticationBây tiếng, hãy quay trở lại HTTPhường Basic Authentication của người sử dụng, nhiều người đang bảo mật vận dụng của chính mình bởi Spring Security và Basic Auth. Đây là tất cả những gì vẫn diễn ra khi bạn hướng dẫn và chỉ định một UserDetailsService và cố gắng login:Extract tổ hợp username/password từ HTTP Basic Authentication header vào một bộ lọc. Quý khách hàng chưa phải làm cho bất cứ điều gì cả, nó đã tự ra mắt ẩn dưới tnóng màn bịt.Gọi MyDatabaseUserDetailsService của bạn nhằm download user tương ứng từ database, được bao quanh bên dưới dạng đối tượng người sử dụng UserDetails, có tác dụng lộ hashed password của user.Lấy password được extract trường đoản cú HTTP.. Basic Auth header, từ động băm nó và so sánh nó với hashed password tự object UserDetails của doanh nghiệp. Nếu cả nhì khớp, user sẽ được authenticate thành công.Đó là toàn bộ gì bắt buộc để authenticate. Nhưng đợi sẽ, có tác dụng biện pháp nào Spring Security băm được password trường đoản cú phía client (bước 3)? Và cùng với thuật toán thù nào?PasswordEncodersSpring Security quan yếu đoán thù một phương pháp vi diệu thuật toán băm password yêu mếm của khách hàng. Đó là lý do tại sao bạn phải hướng đẫn một
Bean khác, một PasswordEncoder. Giả sử nếu bạn muốn sử dụng chức năng hashed password kiểu BCrypt (mang định của Spring Security) cho tất cả những password của mình , bạn sẽ hướng dẫn và chỉ định
Điều gì sẽ xẩy ra nếu khách hàng có nhiều thuật tân oán băm password, bởi vì chúng ta tất cả một vài user cũ bao gồm password được lưu trữ bằng MD5 (đừng làm điều này) cùng rất nhiều user bắt đầu hơn cùng với Bcrypt hoặc thậm chí là là thuật toán thù đồ vật cha nlỗi SHA-256? Vậy thì bạn sẽ thực hiện cỗ mã hóa sau:
Beanpublic PasswordEncoder passwordEncoder() return PasswordEncoderFactories.createDelegatingPasswordEncoder();
Bộ mã hóa này hoạt động như vậy nào? Nó đang chu đáo hashed password của UserDetail (cho từ bảng database của khách hàng chẳng hạn), hiện giờ đề nghị bắt đầu cùng với một prefix. Prefix (tiền tố) đó, chính là cách thức hash của bạn! Bảng database của doanh nghiệp sau đó sẽ trông như vậy này:usernamepasswordjohn
Spring Security sẽ:Đọc các password kia với loại bỏ chi phí tố (bcrypt hoặc sha256).Tùy ở trong vào quý giá tiền tố, hãy thực hiện PasswordEncoder đến chính xác (Tức là BCryptEncoder hoặc SHA256Encoder)Băm password thô với PasswordEncoder kia với so sánh với password đang lưu trữ.Đó là tất cả phần lớn gì tất cả được cùng với PasswordEncoders.Tóm tắt: quyền truy cập vào password của userĐiểm nhấn cho phần này là: nếu bạn vẫn sử dụng Spring Security với bao gồm thể truy cập vào password của user, thì:Chỉ định một UserDetailsService. Có thể implementation tùy chọn thường dùng với tự thông số kỹ thuật một implementation do Spring Security hỗ trợ.Chỉ định một PasswordEncoder.Đó là vắn tắt về authentication vào Spring Security.
Bean public AuthenticationProvider authenticationProvider() return new AtlassianCrowdAuthenticationProvider();
Một AuthenticationProvider đa số bao gồm 1 method và một implementation nlắp gọn hoàn toàn có thể trông như vậy này:
public class AtlassianCrowdAuthenticationProvider implements AuthenticationProvider Authentication authenticate(Authentication authentication) // (1) throws AuthenticationException String username = authentication.getPrincipal().toString(); // (1) String password = authentication.getCredentials().toString(); // (1) User user = callAtlassianCrowdRestService(username, password); // (2) if (user == null) // (3) throw new AuthenticationException("could not login"); return new UserNamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), user.getAuthorities()); // (4) // other method ignored
So với method UserDetails load (), nơi chúng ta chỉ có quyền truy cập vào username, giờ đây bạn đã tất cả quyền truy vấn để authenticate hoàn chỉnh, thường cất username và password.quý khách có thể có tác dụng bất kể điều gì bạn muốn để authenticate user, nlỗi Gọi một REST-service ví dụ điển hình.Nếu authenticate không thành công xuất sắc, bạn phải throw ra một exception.Nếu authenticate thành công, bạn phải return một UsernamePasswordAuthenticationToken được khởi tạo nên không hề thiếu. Nó là 1 trong những implementation của interface Authentication với cần được đặt trường được authenticate thành true (mà lại constructor được áp dụng sinh sống trên đã tự động đặt). Chúng ta đã đề cùa đến các authorities trong cmùi hương tiếp theo.Quy trình làm việc AuthenticationProvider đầy đủ: HTTPhường Basic AuthenticationBây giờ đồng hồ, hãy quay lại HTTPhường Basic Authentication của khách hàng, Tức là nhiều người đang bảo mật thông tin vận dụng của chính bản thân mình bằng Spring Security với Basic Auth. Đây là tất cả những gì vẫn xảy ra khi bạn chỉ định và hướng dẫn AuthenticationProvider cùng nỗ lực login:Extract tổ hợp username / password từ HTTPhường. Basic Authentication Header vào một bộ thanh lọc. Bạn chưa hẳn làm bất kể điều gì để thực hiện việc đó cả, nó sẽ từ bỏ diễn ra ẩn dưới tnóng màn bịt.Gọi AuthenticationProvider của bạn (ví dụ: AtlassianCrowdAuthenticationProvider) bằng username cùng password kia để bạn từ thực hiện authentication (ví dụ: hotline REST).Không gồm quá trình hash password hoặc gì đó giống như sẽ ra mắt, bởi vì về cơ bạn dạng ai đang ủy quyền đến mặt thứ cha triển khai kiểm tra username / password thực tế. Tóm lại sẽ là toàn bộ về AuthenticationProvider!Tóm tắt: AuthenticationProviderBài học kinh nghiệm tay nghề bỏ phần này là: nếu bạn đã áp dụng Spring Security và không tất cả quyền truy cập vào password của user, thì hãy implement với cung cấp một
Giới thiệu
Không nhanh chóng thì muộn, phần lớn người đông đảo rất cần phải thêm bảo mật mang đến dự án công trình của chính mình và vào hệ sinh thái Spring chúng ta có thể tiến hành Việc đó với sự trợ giúp của thư viện Spring Security .Vì thay khi bạn mới bước đầu thêm Spring Security vào dự án Spring Boot của doanh nghiệp cùng đột nhiên nhiên…… quý khách có các trang login được chế tác auto.… quý khách hàng thiết yếu triển khai các method POST được nữa.… Toàn bộ áp dụng của công ty bị đóng góp và nó trải nghiệm các bạn nhập username và password.Sau lúc sinh tồn qua ngoài sự suy sụp niềm tin kia, bạn new ban đầu quyên tâm tìm hiểu giải pháp đa số thứ này hoạt động ra sao.Bạn đang xem: Spring security là gì
Spring Security là gì với nó hoạt động như thế nào?
Câu vấn đáp nthêm gọn :Về cơ bản, Spring Security thực thụ chỉ là 1 trong những loạt các cỗ thanh lọc servlet khiến cho bạn thêm authentication và authorization vào áp dụng web của mình.Nó cũng tích hợp xuất sắc cùng với các framework nhỏng Spring Web MVC (giỏi còn được gọi là Spring Boot ), cũng tương tự cùng với các tiêu chuẩn nhỏng OAuth2 hoặc SAML. Và nó tự động tạo những trang login / logout cùng bảo đảm an toàn chống lại các hành vi khai quật thông tin nhỏng CSRF.Đến trên đây vẫn không giúp ích gì cho bạn buộc phải không?May mắn cầm, cũng có một câu trả lời dài:Chính là phần sót lại của nội dung bài viết này.Bảo mật áp dụng web: 101
Trước Khi biến bậc thầy Spring Security, bạn phải phát âm cha định nghĩa quan liêu trọng:AuthenticationAuthorizationSở thanh lọc ServletLời khuyên: Đừng bỏ qua mất phần này, bởi vì nó là nền tảng gốc rễ cho gần như thứ nhưng mà Spring Security tiến hành. Trong khi, tôi đang tạo cho độc đáo độc nhất vô nhị hoàn toàn có thể.1. Authentication (xác thực)
Trước hết, nếu bạn đang chạy một ứng dụng (web) điển hình nổi bật, bạn cần user của mình authenticate. Điều kia Tức là áp dụng của công ty bắt buộc xác minh coi user bao gồm phải là fan mà anh ta chính thức và đúng là anh ta hay không, thường được triển khai bởi đánh giá username với password.User : “Tôi là tổng thống Hoa Kỳ. username của tớ là: potus!”Ứng dụng web của bạn : “Chắc chắn rồi, vậy còn password thì sao, thưa ngài Tổng thống?”User : “Pass của tớ là: th3don4ld”.Ứng dụng web của bạn : “Đúng. Chào mừng, thưa ngài!”2. Authorization (Phân quyền)
Trong những ứng dụng dễ dàng hơn, chỉ cần authenticate là đủ: Ngay sau khi người dùng authenticate, họ có thể truy cập từng phần của vận dụng.Nhưng hầu hết những vận dụng đều sở hữu có mang về quyền (hoặc vai trò). Hãy tưởng tượng: khách hàng tất cả quyền truy cập vào đồ họa công khai minh bạch của websiêu thị của chúng ta với quản trị viên gồm quyền truy vấn vào khu vực cai quản trị đơn nhất.Cả hai một số loại user đều buộc phải singin, tuy vậy thực tế authentication solo thuần ko tạo nên gì về việc họ được phxay làm cái gi vào hệ thống của người tiêu dùng. Do kia, bạn cũng rất cần được khám nghiệm các quyền của user đã làm được authenticate, tức là chúng ta cần cung cấp quyền cho những người dùng kia.User : “Hãy để tôi đùa cùng với quả bóng hạt nhân đó….”Ứng dụng web của bạn : "Đợi một giây, tôi buộc phải kiểm tra lại permission của ngài trước… Dạ thưa Chủ tịch, ngài gồm đầy đủ ĐK. Hãy cứ đọng tận hưởng”User : “Lại cái nút đỏ đó là gì vậy… ??”3. Sở thanh lọc Servlet
Cuối cùng nhưng không hề kém phần đặc trưng, chúng ta hãy chu đáo Bộ lọc Servlet. Chúng liên quan gì cho authentication và authorization?Tại sao sử dụng Bộ lọc Servlet?Hãy nhớ lại nội dung bài viết khác của tôi , chỗ Shop chúng tôi phân phát hiển thị rằng về cơ bạn dạng ngẫu nhiên vận dụng website Spring như thế nào cũng chỉ là một servlet: DispatcherServlet cũ của Spring, góp chuyển làn các thưởng thức HTTPhường mang lại (ví dụ trường đoản cú trình duyệt) mang đếnRestControllers của doanh nghiệp.Vấn đề là: Không tất cả mật mã bảo mật nào được mã hóa vào DispatcherServlet kia cùng các bạn cũng rất hoàn toàn có thể không thích tìm mẫm với header HTTPhường Basic Auth đơn giản trong
Controllers của bản thân mình. Để mang lại tối ưu, vấn đề authentication cùng authorization phải được thực hiện trước khi một request truy cập vào
Controllers của người sử dụng.May mắn rứa, tất cả một phương pháp để thực hiện đúng mực vấn đề đó vào thế giới website Java: chúng ta có thể đặt cỗ lọc lên trước những servlet, tức là các bạn bao gồm thể viết SecurityFilter cùng cấu hình nó vào Tomcát (servlet container/ application server) của bạn để thanh lọc mọi request HTTP trước khi nó truy cập vào servlet của chúng ta.

import javax.servlet.*;import javax.servlet.http.HttpFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class SecurityServletFilter extends HttpFilter
Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException UsernamePasswordToken token = extractUsernameAndPasswordFrom(request); // (1) if (notAuthenticated(token)) // (2) // either no or wrong username/password // unfortunately the HTTPhường status code is called "unauthorized", instead of "unauthenticated" response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // HTTP. 401. return; if (notAuthorized(token, request)) // (3) // you are logged in, but don't have sầu the proper rights response.setStatus(HttpServletResponse.SC_FORBIDDEN); // HTTPhường 403 return; // allow the HttpRequest to lớn go khổng lồ Spring's DispatcherServlet // and
Controllers. chain.doFilter(request, response); // (4) private UsernamePasswordToken extractUsernameAndPasswordFrom(HttpServletRequest request) // Either try & read in a Basic Auth HTTPhường Header, which comes in the khung of user:password // Or try and find size login request parameters or POST bodies, i.e. "username=me" và "password="myPass" return checkVariousLoginOptions(request); private boolean notAuthenticated(UsernamePasswordToken token) // compare the token with what you have sầu in your database...or in-memory...or in LDAP.... return false; private boolean notAuthorized(UsernamePasswordToken token, HttpServletRequest request) // check if currently authenticated user has the permission/role to access this request's /URI // e.g. /admin needs a ROLE_ADMIN , /callcenter needs ROLE_CALLCENTER, etc. return false;
Thứ nhất, bộ thanh lọc yêu cầu extract username/password từ request. Nó hoàn toàn có thể trải qua Basic Auth Http Header, hoặc những field vào form, hoặc cookie, v.v.Sau đó, cỗ lọc đề xuất xác xắn bằng phương pháp đối chiếu tổ hợp username/password đó với một sản phẩm gì đó , chẳng hạn như database.Sau lúc authenticate thành công xuất sắc, cỗ thanh lọc yêu cầu kiểm tra user giành được phép truy vấn requested URI hay không.Nếu request vẫn tồn tại sau tất cả các lần bình chọn này, thì cỗ lọc hoàn toàn có thể chất nhận được request đưa đến DispatcherServlet của công ty, tức là
Controllers của công ty.FilterChainsXác minch trong thực tế: Trong khi code bên trên có thể vận động Lúc biên dịch, nó sớm xuất xắc muộn cũng dẫn cho một cỗ thanh lọc hóa học đầy mặt hàng tấn code cho các phép tắc authentication và authorization khác biệt.Trong nhân loại thực, bạn sẽ phân tách bộ thanh lọc này thành nhiều cỗ thanh lọc, kế tiếp các bạn _cha_in cùng nhau.Ví dụ: một request HTTPhường. sẽ…Trước tiên, đi qua LoginMethodFilter…Sau kia, trải qua AuthenticationFilter…Sau kia, chuyển qua AuthorizationFilter…Cuối thuộc, chạm vào servlet của người sử dụng.Khái niệm này được Hotline là FilterChain cùng câu lệnh sau cuối trong method ở bộ thanh lọc phía trên của bạn đích thực đã authorize mang đến thiết yếu chain đó:
Với một bộ thanh lọc (chain) điều này thì về cơ bản, chúng ta cũng có thể xử trí số đông sự việc authentication tốt authorization gồm vào áp dụng của bản thân nhưng không phải đổi khác vấn đề thực hiện vận dụng thực tế của công ty (nlỗi là
Controllers của bạn).Với hồ hết kiến thức kia, hãy thuộc khám phá Spring Security áp dụng phép màu bộ lọc này ra làm sao nhé.
FilterChain và Security Configuration DSL
Chúng ta đã bắt đầu đề cập đến Spring Security một ít khác thường, bằng cách đi theo hướng ngược trở lại từ bỏ chương thơm trước, ban đầu cùng với FilterChain của Spring Security.Spring’s DefaultSecurityFilterChain
Giả sử bạn tùy chỉnh thiết lập Spring Security đúng chuẩn cùng tiếp đến khởi động vận dụng website của bản thân mình. Quý khách hàng đã thấy thông báo sau:Nếu bạn không ngừng mở rộng một loại đó thành một danh mục, nó đang giống nhỏng Spring Security không những mua đặt một cỗ thanh lọc, rứa vào kia, nó thiết lập toàn thể một filterchain bao hàm 15 (!) bộ thanh lọc khác biệt.Vì vậy, lúc một HTTPRequest đến, nó sẽ đi qua vớ cả 15 cỗ lọc này, trước lúc request của người tiêu dùng sau cuối truy vấn vào
RestControllers của khách hàng. Thứ đọng từ cũng đặc trưng, bắt đầu trường đoản cú trên cùng list đó cùng trở lại đáy.

Phân tích FilterChain của Spring
Sẽ mất khôn cùng lâu để sở hữu một chiếc nhìn chi tiết về gần như bộ thanh lọc của chain này, dẫu vậy đây là lời lý giải cho một trong những cỗ thanh lọc kia. Vui lòng xem mã nguồn của Spring Security nhằm hiểu những bộ thanh lọc không giống.BasicAuthenticationFilter : Cố ráng kiếm tìm Basic Auth HTTP Header theo request cùng nếu như search thấy, nỗ lực tuyệt đối người tiêu dùng bằng username và password của header.UsernamePasswordAuthenticationFilter : Cố cầm kiếm tìm tham số request username/password hay POST body và ví như được search thấy, cố gắng authenticate user bằng những quý hiếm kia.DefaultLoginPageGeneratingFilter : Tạo trang login cho bạn, nếu như bạn không disable tác dụng đó. Sở lọc NÀY là nguyên do tại sao chúng ta nhận ra trang đăng nhập khoác định khi nhảy Spring Security.DefaultLogoutPageGeneratingFilter : Tạo trang logout cho mình, nếu khách hàng không disable hào kiệt đó.Xem thêm: Toán Tử Unary Là Gì ? Unary Nghĩa Là Gì Trong Tiếng Việt
FilterSecurityInterceptor : Thực hiện tại authorization của các bạn.Vì vậy, với một trong những cỗ lọc này, Spring Security cung cấp cho chính mình trang login / logout, tương tự như tài năng login bởi Basic Auth hoặc Form Logins, tương tự như một trong những nhân kiệt bổ sung như CsrfFilter, mà lại họ đã tìm hiểu sau.Nghỉ giữa hiệp : Những bộ lọc đó, đa phần, chính là Spring Security. Không rộng, không thua kém. Chúng làm toàn bộ quá trình. Những gì còn sót lại cho chính mình là cấu hình giải pháp chúng vận động, tức URL nào yêu cầu bảo vệ, URL làm sao bắt buộc bỏ qua mất và bảng cửa hàng tài liệu nào vẫn được áp dụng nhằm authenticate.Do kia, bước tiếp theo họ yêu cầu cẩn thận giải pháp thông số kỹ thuật Spring Security.
Cách thông số kỹ thuật Spring Security: WebSecurityConfigurerAdapter
Với các phiên bạn dạng Spring Security và/hoặc Spring Boot mới nhất, phương pháp để thông số kỹ thuật Spring Security là gồm một class:Được chụ thích bằngEnableWebSecurity.Extends WebSecurityConfigurer, về cơ phiên bản hỗ trợ cho bạn một DSL/methods cấu hình. Với phần đông cách thức kia, bạn có thể chỉ định và hướng dẫn phần lớn URI làm sao trong áp dụng của bản thân mình nhằm bảo đảm hoặc đều biện pháp đảm bảo an toàn như thế nào cần bật/tắt.Đây là giao diện của một WebSecurityConfigurerAdapter điển hình:
EnableWebSecurity // (1)public class WebSecurityConfig extends WebSecurityConfigurerAdapter // (1)
Overrideprotected void configure(HttpSecurity http) throws Exception // (2) http .authorizeRequests() .antMatchers("/", "/home").permitAll() // (3) .anyRequest().authenticated() // (4) .and() .formLogin() // (5) .loginPage("/login") // (5) .permitAll() .and() .logout() // (6) .permitAll() .and() .httpBasic(); // (7)
EnableWebSecurity, extends tự WebSecurityConfigurerAdapter.Bằng phương pháp override phương thức thông số kỹ thuật (HttpSecurity) của adapter, bạn sẽ đã có được một DSL bé dại xinch để bạn tất cả thể cấu hình FilterChain của chính bản thân mình.Tất cả các request đã đến / và /home được cấp phép - người tiêu dùng không phải authenticate nữa. Quý khách hàng sẽ sử dụng antMatcher , tức là bạn có thể sử dụng ký tự đại diện (*, * *,?) Trong chuỗi.Mọi request khác các phải người dùng authenticate trước , tức là user đề xuất login.quý khách hàng vẫn để khung login (username/password dưới dạng form), cùng với loginPage thiết lập ( /login ,Có nghĩa là không phải trang được tạo nên tự động của Spring Security). Bất kỳ ai cũng rất có thể truy vấn trang login nhưng mà không cần phải singin trước (permitAll; nếu không, Shop chúng tôi sẽ sở hữu Catch-22!).Cũng tương tự như nhỏng (5) mà lại là với trang logoutTrên không còn, chúng ta đang dần cho phép Basic Auth, nghĩa là gửi một HTTPhường Basic Auth Header để authenticate.Cách áp dụng DSL cấu hình của Spring SecurityPhải mất một thời gian để gia công quen thuộc cùng với DSL kia, mà lại các bạn sẽ tra cứu thấy các ví dụ rộng vào phần Câu hỏi thường xuyên gặp: AntMatchers: N hững ví dụ phổ biến .Điều quan trọng hiện nay đó là configure method này là nơi chúng ta chỉ định:URL như thế nào yêu cầu bảo đảm an toàn (đang authenticate()) cùng URL như thế nào được cấp phnghiền (allowAll ()).Những method authenticate nào được cấp phép (formLogin (), httpBasic ()) và bí quyết chúng được cấu hình.Nói vắn tắt: cấu hình security hoàn hảo của vận dụng của người sử dụng.Lưu ý : Quý Khách vẫn không cần phải override ngay lập tức nhanh chóng configure method của adapter, vì chưng nó mang định kèm theo với một implementation. Cụ thể nlỗi dưới đây:
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer protected void configure(HttpSecurity http) throws Exception http .authorizeRequests() .anyRequest().authenticated() // (1) .and() .formLogin().and() // (2) .httpBasic(); // (3)
Để tróc nã cập bất kỳ URI ( anyRequest()) làm sao trên vận dụng của công ty, bạn phải authenticate (authenticated()).Form login ( formLogin()) cùng với thiết lập mặc định được bật.Cũng nhỏng Basic HTTPhường. authentication( httpBasic()).C ấu hình khoác định này là nguyên do tại sao áp dụng của chúng ta bị khóa ngay lập tức sau khi chúng ta thêm Spring Security vào nó. Đơn giản buộc phải không?Tổng quát: Cấu hình DSL của WebSecurityConfigurerAdapterChúng ta vẫn hiểu được Spring Security gồm một số bộ lọc mà bạn cấu hình với class WebSecurityConfigurerAdapter
Configuration.Nhưng không đủ 1 phần đặc biệt quan trọng. Hãy rước BasicAuthFilter của Spring có tác dụng ví dụ. Nó hoàn toàn có thể extract username / password từ một HTTPhường. Basic Auth header, nhưng lại nó authenticate gần như lên tiếng này dựa trên điều gì?Đến đây thoải mái và tự nhiên dẫn họ tới thắc mắc về kiểu cách authentication vận động với Spring Security.
Authentication với Spring Security
Lúc nói đến authentication cùng Spring Security, các bạn bao gồm cha kịch phiên bản sau:Mặc định : Bạn có thể truy cập (hashed) password của user, cũng chính vì chúng ta bao gồm công bố chi tiết của bản thân mình (username, password) được lưu lại chẳng hạn trong một bảng database.Ít phổ biến hơn : Bạn không thể truy vấn password (hashed) của user. Đây là trường thích hợp nếu như user cùng password của khách hàng được lưu lại trữ ở 1 nơi khác, ví dụ như vào một sản phẩm làm chủ tính danh của bên đồ vật tía hỗ trợ các dịch vụ REST mang lại authentication. Hãy thử search hiểu: Atlassian Crowd.Cũng phổ biến : quý khách hàng muốn sử dụng OAuth2 hoặc “Đăng nhập bởi Google / Twitter / v.v.” (OpenID), khả năng kết hợp với JWT. Sau đó, không tồn tại điều nào bao gồm thể áp dụng thì bạn nên gửi thẳng mang đến phần OAuth2.Lưu ý : Tùy trực thuộc vào chúng ta lâm vào kịch phiên bản làm sao, bạn phải chỉ định nhữngBeans khác nhau nhằm Spring Security hoạt động, nếu không các bạn sẽ nhận ra những exception hơi cạnh tranh gọi (nlỗi NullPointerException nếu như bạn quên hướng đẫn PasswordEncoder). Hãy ghi ghi nhớ nó trong thâm tâm trí.Chúng ta hãy chu đáo nhị kịch bản đầu.
1. UserDetailsService: Có quyền truy vấn vào password của user
Hãy tưởng tượng bạn gồm một bảng database khu vực chúng ta lưu trữ user của bản thân mình. Nó có một vài cột, cơ mà đặc biệt quan trọng nhất là nó tất cả cột username cùng password, chỗ các bạn lưu trữ hashed password của user.create table users (id int auto_increment primary key, username varchar(255), password varchar(255));
Trong ngôi trường hợp này, Spring Security buộc phải bạn khẳng định nhì bean để thiết lập với chạy authenticationMột UserDetailsService.Một PasswordEncoderChỉ định một UserDetailsService dễ dàng nlỗi sau:
Beanpublic UserDetailsService userDetailsService() return new MyDatabaseUserDetailsService(); // (1)
MyDatabaseUserDetailsService implements UserDetailsService - một interface rất đối kháng giản gồm 1 method trả về một object UserDetails:
public class MyDatabaseUserDetailsService implements UserDetailsService UserDetails loadUserByUsername(String username) throws UsernameNotFoundException // (1) // 1. Load the user from the users table by username. If not found, throw UsernameNotFoundException. // 2. Convert/wrap the user to a UserDetails object & return it. return someUserDetails; public interface UserDetails extends Serializable // (2) String getUsername(); String getPassword(); // more methods: // isAccountNonExpired,isAccountNonLocked, // isCredentialsNonExpired,isEnabled
Một UserDetailsService cài (load) UserDetails qua username của user. Lưu ý rằng method chỉ nhận một tsi số: username (chưa phải password).Interface UserDetails có các method để đưa (hashed) password cùng một method để đưa username.UserDetails thậm chí là còn có rất nhiều method hơn, ví dụ như account sẽ hoạt động giỏi bị ngăn, báo cáo singin đã không còn hạn tốt user được cấp phép gì - mà lại bọn họ sẽ không còn nói đến ở chỗ này.Vì vậy, chúng ta có thể từ implement những interface này, giống hệt như bọn chúng ta đã làm cho ở bên trên, hoặc là sử dụng những interface hiện tại tất cả nhưng mà Spring Security cung cấp.Các Implementation sẵn cóMột xem xét nhỏ: quý khách hàng luôn luôn có thể tự bản thân thực hiện những interface UserDetailsService cùng UserDetails.Tuy nhiên, chúng ta có thể thay thế sửa chữa bằng các implementations tất cả sẵn của Spring Security mà lại chúng ta có thể sử dụng/configure/extend/override.JdbcUserDetailsManager, là 1 trong những UserDetailsService dựa trên JDBC (database). Quý Khách bao gồm thể cấu hình nó nhằm khớp với cấu trúc bảng/cột user của mình .InMemoryUserDetailsManager , giữ tất cả các cụ thể user in-memory cùng cực tốt cho việc demo.
Xem thêm: Chiếm Spotlight Nghĩa Là Gì ? Tìm Hiểu Ngay Chiếm Spotlight Có Ý Nghĩa Gì
org.springframework.security.core.userdetail.User, là 1 trong những implementation UserDetails mang định, hợp lý và phải chăng cơ mà bạn cũng có thể áp dụng. Điều đó Có nghĩa là có khả năng ánh xạ/xào luộc thân những entity/ bảng database của người tiêu dùng cùng class User này. Bên cạnh đó, bạn có thể chỉ việc có tác dụng cho các entity của chính mình implement interface UserDetails.Quy trình thao tác làm việc không thiếu của UserDetails: HTTP Basic AuthenticationBây tiếng, hãy quay trở lại HTTPhường Basic Authentication của người sử dụng, nhiều người đang bảo mật vận dụng của chính mình bởi Spring Security và Basic Auth. Đây là tất cả những gì vẫn diễn ra khi bạn hướng dẫn và chỉ định một UserDetailsService và cố gắng login:Extract tổ hợp username/password từ HTTP Basic Authentication header vào một bộ lọc. Quý khách hàng chưa phải làm cho bất cứ điều gì cả, nó đã tự ra mắt ẩn dưới tnóng màn bịt.Gọi MyDatabaseUserDetailsService của bạn nhằm download user tương ứng từ database, được bao quanh bên dưới dạng đối tượng người sử dụng UserDetails, có tác dụng lộ hashed password của user.Lấy password được extract trường đoản cú HTTP.. Basic Auth header, từ động băm nó và so sánh nó với hashed password tự object UserDetails của doanh nghiệp. Nếu cả nhì khớp, user sẽ được authenticate thành công.Đó là toàn bộ gì bắt buộc để authenticate. Nhưng đợi sẽ, có tác dụng biện pháp nào Spring Security băm được password trường đoản cú phía client (bước 3)? Và cùng với thuật toán thù nào?PasswordEncodersSpring Security quan yếu đoán thù một phương pháp vi diệu thuật toán băm password yêu mếm của khách hàng. Đó là lý do tại sao bạn phải hướng đẫn một
Bean khác, một PasswordEncoder. Giả sử nếu bạn muốn sử dụng chức năng hashed password kiểu BCrypt (mang định của Spring Security) cho tất cả những password của mình , bạn sẽ hướng dẫn và chỉ định
Điều gì sẽ xẩy ra nếu khách hàng có nhiều thuật tân oán băm password, bởi vì chúng ta tất cả một vài user cũ bao gồm password được lưu trữ bằng MD5 (đừng làm điều này) cùng rất nhiều user bắt đầu hơn cùng với Bcrypt hoặc thậm chí là là thuật toán thù đồ vật cha nlỗi SHA-256? Vậy thì bạn sẽ thực hiện cỗ mã hóa sau:
Beanpublic PasswordEncoder passwordEncoder() return PasswordEncoderFactories.createDelegatingPasswordEncoder();
Bộ mã hóa này hoạt động như vậy nào? Nó đang chu đáo hashed password của UserDetail (cho từ bảng database của khách hàng chẳng hạn), hiện giờ đề nghị bắt đầu cùng với một prefix. Prefix (tiền tố) đó, chính là cách thức hash của bạn! Bảng database của doanh nghiệp sau đó sẽ trông như vậy này:
2. AuthenticationProvider: Không gồm quyền truy cập vào password của user
Bây tiếng, hãy tưởng tượng rằng nhiều người đang sử dụng Atlassian Crowd để thống trị danh tính. Điều đó Có nghĩa là tất cả user và password của người sử dụng cho toàn bộ các vận dụng được lưu trữ trong Atlassian Crowd cùng không còn vào bảng database của doanh nghiệp nữa.Điều này có hai hàm ý:Bạn ko có password user vào ứng dụng của chính mình nữa, vì chưng chúng ta cần yếu từng trải Crowd chỉ hỗ trợ cho bạn các password đó.Tuy nhiên, chúng ta bao gồm một API REST cơ mà chúng ta cũng có thể đăng nhập bởi username với password của bản thân mình. (Một POST request đến điểm cuối /rest/usermanagement/1/authentication của REST).Nếu đúng như vậy, bạn không thể áp dụng UserDetailsService nữa, rứa vào kia, bạn phải implement với cung cấp AuthenticationProviderBean public AuthenticationProvider authenticationProvider() return new AtlassianCrowdAuthenticationProvider();
Một AuthenticationProvider đa số bao gồm 1 method và một implementation nlắp gọn hoàn toàn có thể trông như vậy này:
public class AtlassianCrowdAuthenticationProvider implements AuthenticationProvider Authentication authenticate(Authentication authentication) // (1) throws AuthenticationException String username = authentication.getPrincipal().toString(); // (1) String password = authentication.getCredentials().toString(); // (1) User user = callAtlassianCrowdRestService(username, password); // (2) if (user == null) // (3) throw new AuthenticationException("could not login"); return new UserNamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), user.getAuthorities()); // (4) // other method ignored
So với method UserDetails load (), nơi chúng ta chỉ có quyền truy cập vào username, giờ đây bạn đã tất cả quyền truy vấn để authenticate hoàn chỉnh, thường cất username và password.quý khách có thể có tác dụng bất kể điều gì bạn muốn để authenticate user, nlỗi Gọi một REST-service ví dụ điển hình.Nếu authenticate không thành công xuất sắc, bạn phải throw ra một exception.Nếu authenticate thành công, bạn phải return một UsernamePasswordAuthenticationToken được khởi tạo nên không hề thiếu. Nó là 1 trong những implementation của interface Authentication với cần được đặt trường được authenticate thành true (mà lại constructor được áp dụng sinh sống trên đã tự động đặt). Chúng ta đã đề cùa đến các authorities trong cmùi hương tiếp theo.Quy trình làm việc AuthenticationProvider đầy đủ: HTTPhường Basic AuthenticationBây giờ đồng hồ, hãy quay lại HTTPhường Basic Authentication của khách hàng, Tức là nhiều người đang bảo mật thông tin vận dụng của chính bản thân mình bằng Spring Security với Basic Auth. Đây là tất cả những gì vẫn xảy ra khi bạn chỉ định và hướng dẫn AuthenticationProvider cùng nỗ lực login:Extract tổ hợp username / password từ HTTPhường. Basic Authentication Header vào một bộ thanh lọc. Bạn chưa hẳn làm bất kể điều gì để thực hiện việc đó cả, nó sẽ từ bỏ diễn ra ẩn dưới tnóng màn bịt.Gọi AuthenticationProvider của bạn (ví dụ: AtlassianCrowdAuthenticationProvider) bằng username cùng password kia để bạn từ thực hiện authentication (ví dụ: hotline REST).Không gồm quá trình hash password hoặc gì đó giống như sẽ ra mắt, bởi vì về cơ bạn dạng ai đang ủy quyền đến mặt thứ cha triển khai kiểm tra username / password thực tế. Tóm lại sẽ là toàn bộ về AuthenticationProvider!Tóm tắt: AuthenticationProviderBài học kinh nghiệm tay nghề bỏ phần này là: nếu bạn đã áp dụng Spring Security và không tất cả quyền truy cập vào password của user, thì hãy implement với cung cấp một