Thứ Hai, Tháng Mười Một 28, 2022
26 C
Ho Chi Minh City
spot_img

Spring Security: Bàn sâu về Authentication và Authorization (P2)

Must read

Openlivenft
Openlivenfthttps://openlivenft.info/
Trang tổng hợp thông tin nhanh - mới nhất về NFT, COIN, Metaverse, tài chính, crypto của OpenliveNFT
14 tháng 02, 2021 – 12279 lượt xem_Xem phần 1 tại đâyXem bài viết gốc tại đây _

Authorization với Spring Security

Cho tới giờ chúng ta mới chỉ nói về authentication, ví dụ: kiểm tra username và password.

Bây giờ tất cả chúng ta hãy xem xét quyền, hay đúng hơn là vai trò và quyền hạn trong Spring Security .

Authorization là gì?

Hãy xem website thương mại điện tử nổi bật của bạn. Nó hoàn toàn có thể gồm có những phần sau :

  • Chính trang web bán hàng. Giả sử URL của nó là www.youramazinshop.com.

  • Có thể là một khu vực dành cho các đại lý bán hàng, nơi họ có thể đăng nhập và xem một khách hàng gần đây đã mua những gì hoặc bưu kiện của họ ở đâu. URL của nó có thể là www.youramazinshop.com/callcenter.

  • Một khu vực quản trị riêng biệt, nơi quản trị viên có thể đăng nhập và quản lý các đại lý bán hàng hoặc các khía cạnh kỹ thuật khác (như chủ đề, hiệu suất, v.v.) của web bán hàng. URL của nó có thể là www.youramazinshop.com/admin.

Điều này có những ý nghĩa sau đây, vì chỉ authenticate thôi thì không còn đủ nữa :

  • Một người mua rõ ràng sẽ không hề truy vấn vào đại lý TT hoặc khu vực quản trị. Anh / cô ta chỉ được phép shopping trong website .
  • Một đại lý TT sẽ không hề truy vấn vào khu vực quản trị .
  • Trong khi đó, quản trị viên hoàn toàn có thể truy vấn web bán hàng, khu vực những đại lý TT và khu vực quản trị .

Nói một cách đơn thuần, bạn muốn được cho phép những quyền truy vấn khác nhau cho những user khác nhau, tùy thuộc vào quyền hạn hoặc vai trò của họ .

Authorities là gì? Vai trò (roles) là gì?

Đơn giản thôi :

  • Một authority ( ở dạng đơn thuần nhất ) chỉ là một chuỗi, nó hoàn toàn có thể là bất kể thứ gì như : user, ADMIN, ROLE_ADMIN hoặc 53 cr37_r0l3 .
  • Một vai trò là một authority có tiền tố ROLE_. Vì vậy, một vai trò được gọi ADMIN  cũng giống như một authority được gọi ROLE_ADMIN.

Sự phân biệt giữa vai trò và quyền hạn chỉ đơn thuần là khái niệm và vì thế thường khiến những người mới tham gia Spring Security hoảng sợ .

Tại sao có sự phân biệt giữa vai trò và quyền hạn?

Thành thật mà nói, tôi đã đọc tài liệu Spring Security cũng như một vài bài StackOverflow có tương quan đến câu hỏi này và tôi vẫn không hề cung ứng cho bạn một câu vấn đáp dứt khoát .

GrantedAuthority là gì? SimpleGrantedAuthority là gì?

Tất nhiên, Spring Security không được cho phép bạn trốn tránh bằng cách chỉ sử dụng Strings. Có một class Java đại diện thay mặt cho String authority của bạn, một class phổ cập chính là SimpleGrantedAuthority .

public final class SimpleGrantedAuthority implements GrantedAuthority {

private final String role;

@Override
public String getAuthority() {
    return role;
}
}

( Lưu ý : Cũng có những class authority khác, được cho phép bạn tàng trữ những object bổ trợ cùng với string của bạn, tôi sẽ không trình diễn chúng ở đây. Hiện tại, tất cả chúng ta sẽ chỉ sử dụng SimpleGrantedAuthority. )

1. UserDetailsService: Nơi lưu trữ và get authorities?

Giả sử bạn đang tàng trữ user trong ứng dụng của mình ( hãy nhớ lại UserDetailsService ), bạn sẽ có một bảng User .Bây giờ, bạn chỉ cần thêm một cột có tên “ authorities ” vào đó. Đối với bài viết này, tôi đã chọn một cột String đơn thuần ở đây, mặc dầu nó hoàn toàn có thể chứa nhiều giá trị được phân tách bằng dấu phẩy. Ngoài ra, tôi cũng hoàn toàn có thể có một bảng AUTHORITIES trọn vẹn tách biệt, nhưng so với khoanh vùng phạm vi của bài viết này thế này là đủ .

Lưu ý: Trở lại với Authorities là gì? Vai trò là gì?: Bạn save các authority, tức là String, vào cơ sở dữ liệu. Rất có thể các authority này bắt đầu với tiền tố ROLE_, vì vậy, xét về mặt Spring Security, các authority này cũng chính là các vai trò.

username password authorities
[email protected] {bcrypt}…​ ROLE_ADMIN
[email protected] {sha256}…​ ROLE_CALLCENTER

Bảng 2. Bảng Users với PermissionsĐiều duy nhất còn lại phải làm là kiểm soát và điều chỉnh UserDetailsService của bạn để read trong cột authorities đó .

public class MyDatabaseUserDetailsService implements UserDetailsService {

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
     User user = userDao.findByUsername(username);
     List grantedAuthorities = user.getAuthorities().map(authority -> new SimpleGrantedAuthority(authority)).collect(Collectors.toList()); // (1)
     return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities); // (2)
}

}
  1. Bạn chỉ cần ánh xạ bất kỳ thứ gì bên trong cột database của mình vào list SimpleGrantedAuthority là xong .
  2. Lần nữa, tất cả chúng ta đang sử dụng implementation UserDetails cơ bản của Spring Security ở đây. Bạn cũng hoàn toàn có thể sử dụng class của riêng mình tiến hành UserDetails và thậm chí còn hoàn toàn có thể không cần phải ánh xạ sau đó .

2. AuthenticationManager: Lưu trữ và get các authorities ở đâu?

Khi user đến từ một ứng dụng của bên thứ ba, như Atlassian Cloud, bạn sẽ cần tìm hiểu và khám phá xem họ đang sử dụng khái niệm gì để tương hỗ những authorities. Atlassian Crowd có những khái niệm về “ vai trò ”, nhưng không dùng khái niệm này để ủng hộ “ nhóm ” .Vì vậy, tùy thuộc vào mẫu sản phẩm thực tiễn bạn đang sử dụng, bạn cần ánh xạ đến Spring Security authority, trong AuthenticationProvider của bạn .

public class AtlassianCrowdAuthenticationProvider implements AuthenticationProvider {

    Authentication authenticate(Authentication authentication)
            throws AuthenticationException {
        String username = authentication.getPrincipal().toString();
        String password = authentication.getCredentials().toString();

        atlassian.crowd.User user = callAtlassianCrowdRestService(username, password); // (1)
        if (user == null) {
            throw new AuthenticationException("could not login");
        }
        return new UserNamePasswordAuthenticationToken(user.getUsername(), user.getPassword(), mapToAuthorities(user.getGroups())); // (2)
    }
            // other method ignored
}
  1. Lưu ý : Đây không phải là code Atlassian Crowd thực tiễn, nhưng vẫn ship hàng mục tiêu của nó. Bạn authenticate với một dịch vụ REST và lấy lại object User JSON, object này sau đó được quy đổi thành object atlassian.crowd. User .
  2. User đó hoàn toàn có thể là thành viên của một hoặc nhiều nhóm, ở đây chỉ là những strings. Bạn sau đó hoàn toàn có thể đơn thuần chỉ cần ánh xạ những nhóm này với “ SimpleGrantedAuthority ” của Spring .

Xem lại WebSecurityConfigurerAdapter dành cho authorities

Cho đến nay, tất cả chúng ta đã nói nhiều về việc tàng trữ và truy xuất những authorities cho User đã authenticate trong Spring Security. Nhưng làm thế nào để bạn bảo vệ những URL với những authority khác nhau với DSL của Spring Security ? Đơn giản thôi :

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
    .authorizeRequests()
      .antMatchers("/admin").hasAuthority("ROLE_ADMIN") // (1)
      .antMatchers("/callcenter").hasAnyAuthority("ROLE_ADMIN", "ROLE_CALLCENTER") // (2)
      .anyRequest().authenticated() // (3)
      .and()
    .formLogin()
      .and()
    .httpBasic();
}
}
  1. Để truy cập khu vực /admin, bạn (tức là user) cần được authenticate VÀ có authority (một string đơn giản) ROLE_ADMIN.

  2. Để truy cập khu vực /callcenter, bạn cần phải được authenticate VÀ có authority ROLE_ADMIN HOẶC ROLE_CALLCENTER.

  3. Đối với bất kể nhu yếu nào khác, bạn không cần vai trò đơn cử nhưng vẫn cần được authenticate .

Lưu ý rằng đoạn code ( 1,2 ) trên tương tự với code sau :

http.authorizeRequests()
    .antMatchers("/admin").hasRole("ADMIN") // (1)
    .antMatchers("/callcenter").hasAnyRole("ADMIN", "CALLCENTER") // (2)
  1. Thay vì gọi “hasAuthority”, bây giờ bạn gọi “hasRole”. Ghi chú : Spring Security sẽ tìm kiếm một authority được gọi ROLE_ADMIN  trên user được authenticate.

  2. Thay vì gọi “hasAnyAuthority”, bây giờ bạn gọi “hasAnyRole”. Ghi chú : Spring Security sẽ tìm kiếm một authority được gọi ROLE_ADMIN  hoặc ROLE_CALLCENTER  trên user đã authenticate.

hasAccess và SpEL

Cuối cùng cũng không kém phần quan trọng, cách mạnh nhất để thông số kỹ thuật authorization là với method access. Nó được cho phép bạn chỉ định khá nhiều biểu thức SpEL .

http.authorizeRequests()
    .antMatchers("/admin").access("hasRole('admin').
and hasIpAddress('192.168.1.0/24')
and @myCustomBean.checkAccess(authentication,request)") // (1)
  1. Bạn đang kiểm tra xem liệu user có ROLE_ADMIN, với IP address cụ thể cũng như một bean thông thường.

Để có cái nhìn tổng quan rất đầy đủ về những gì hoàn toàn có thể làm được với Spring’s Expression-Based Access Control, hãy xem tài liệu chính thức .

Các biện pháp bảo vệ khỏi bị khai thác

Có một loạt những cuộc tiến công phổ cập mà Spring Security giúp bạn chống lại. Bắt đầu với những cuộc tiến công theo thời hạn ( tức là Spring Security sẽ luôn băm password được phân phối khi login, ngay cả khi user không sống sót ) và kết thúc với những giải pháp bảo vệ chống lại những cuộc tiến công trấn áp bộ nhớ cache, đánh hơi nội dung, kích hoạt nhấp chuột, viết mã chéo website và còn nhiều nữa .Không thể đi sâu vào cụ thể của từng cuộc tiến công trong khoanh vùng phạm vi của bài giảng này. Do đó, tất cả chúng ta sẽ chỉ xem xét một giải pháp bảo vệ khiến hầu hết những người mới sử dụng Spring Security đau đầu nhất : Cross-Site-Request-Forgery .

Cross-Site-Request-Forgery: CSRF

Nếu bạn hoàn toàn mới sử dụng CSRF, bạn có thể muốn xem video YouTube này để theo kịp. Tuy nhiên, cách giải quyết nhanh chóng là, Spring Security mặc định bảo vệ mọi request POST (hoặc PUT / DELETE / PATCH) với một CSRF token hợp lệ.

Điều đó có nghĩa là gì ?CSRF và HTML được hiển thị phía severHãy tưởng tượng một form giao dịch chuyển tiền ngân hàng nhà nước hay bất kể form nào ( như form đăng nhập ) cho yếu tố đó, được @ Controllers của bạn hiển thị với sự trợ giúp của công nghệ tiên tiến tạo template như Thymeleaf hoặc Freemarker .

Với Spring Security được bật, bạn sẽ không thể submit form đó nữa . Bởi vì CSRFFilter của Spring Security đang tìm kiếm một parameter ẩn bổ sung trên bất kỳ request POST (PUT / DELETE) nào: cái gọi là CSRF token.

Theo mặc định, nó cứ tạo ra một token như vậy cho mỗi một HTTP session và tàng trữ ở đó. Và bạn cần bảo vệ inject nó vào bất kể form HTML nào của mình .

CSRF tokens & Thymeleaf

Vì Thymeleaf tích hợp tốt với Spring Security ( khi được sử dụng cùng với Spring Boot ), bạn chỉ cần thêm đoạn code sau vào bất kể form nào và bạn sẽ nhận được token tự động hóa được inject, từ session, vào form của bạn. Thậm chí tốt hơn, nếu bạn đang sử dụng “ th : action ” cho form của mình, Thymeleaf sẽ tự động hóa inject field ẩn đó cho bạn mà không cần phải thực thi theo cách thủ công bằng tay .

  1. Ở đây, tất cả chúng ta đang add parameter CSRF theo cách thủ công bằng tay .
  2. Ở đây, tất cả chúng ta đang sử dụng tương hỗ form của Thymeleaf .

Lưu ý : Để biết thêm thông tin về tương hỗ CSRF của Thymeleaf, hãy xem tài liệu chính thức .

CSRF & Các thư viện template khác

Tôi không hề trình diễn tổng thể những thư viện template trong phần này, nhưng phương sách ở đầu cuối là bạn luôn hoàn toàn có thể đưa CSRFToken vào bất kể method @ Controller nào của mình và chỉ cần add nó vào Mã Sản Phẩm để render nó thành một view hoặc truy vấn trực tiếp dưới dạng request attribute HttpServletRequest .

@Controller
public class MyController {
@GetMaping("/login")
public String login(Model model, CsrfToken token) {
    // the token will be injected automatically
    return "/templates/login";
}
}

CSRF & React hay Angular

Mọi thứ có một chút ít độc lạ so với ứng dụng Javascript, như ứng dụng single page React hoặc Angular. Đây là những gì bạn cần làm :

  1. Cấu hình cho Spring Security để sử dụng CookieCsrfTokenRepository, mạng lưới hệ thống này sẽ đưa CSRFToken vào một cookie “ XSRF-TOKEN ” ( và gửi cookie đó đến trình duyệt ) .
  2. Làm cho ứng dụng Javascript của bạn nhận giá trị cookie đó và gửi nó dưới dạng “ X-XSRF-TOKEN ” header với mọi request POST ( / PUT / PATCH / DELETE ) .

Để có ví dụ đầy đủ về React copy-and-paste, hãy xem bài đăng tuyệt vời trên blog này: https://developer.okta.com/blog/2018/07/19/simple-crud-react-and-spring-boot .

Tắt CSRFNếu bạn chỉ cung ứng một REST API vô định hình nơi mà sự bảo vệ CSRF không có ý nghĩa gì, bạn sẽ vô hiệu trọn vẹn bảo vệ CSRF. Đây là cách để bạn làm điều đó :

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
}
}

Spring Integrations

Spring Security & Spring Framework

Trong hầu hết bài viết này, bạn mới chỉ chỉ định thông số kỹ thuật bảo mật thông tin trên tầng web của ứng dụng của bạn. Bạn đã bảo vệ những URL nhất định bằng antMatcher hoặc regexMatchers bằng DSL của WebSecurityConfigurerAdapter. Đó là một cách tiếp cận trọn vẹn ổn và tiêu chuẩn để bảo mật thông tin .Ngoài việc bảo vệ tầng web của bạn, còn có ý tưởng sáng tạo “ bảo vệ theo chiều sâu ( defense in depth ) ”. Điều đó có nghĩa là ngoài việc bảo vệ URL, bạn hoàn toàn có thể bảo vệ chính tầng giải quyết và xử lý logic của mình. Hay @ Controllers, @ Components, @ Services hoặc thậm chí còn @ Repositories của bạn. Nói ngắn gọn là những bean trong ứng dụng Spring của bạn .

Method security

Cách tiếp cận đó được gọi method security  và hoạt động thông qua các annotation mà về cơ bản bạn có thể đặt trên bất kỳ public method nào trong Spring bean của mình. Bạn cũng cần enable method security một cách rõ ràng bằng cách đặt annotation @EnableGlobalMethodSecurity trên ApplicationContextConfiguration của bạn.

@Configuration
@EnableGlobalMethodSecurity(
prePostEnabled = true, // (1)
securedEnabled = true, // (2)
jsr250Enabled = true) // (3)
public class YourSecurityConfig extends WebSecurityConfigurerAdapter{
}
  1. Thuộc tính prePostEnabled cho phép hỗ trợ các annotation @PreAuthorize  và @PostAuthorize  của Spring. Hỗ trợ có nghĩa là Spring sẽ bỏ qua chú thích này nếu bạn không đặt nó thành true.

  2. Thuộc tính secureEnabled cho phép hỗ trợ annotion @Secured. Hỗ trợ ở đây có nghĩa là Spring sẽ bỏ qua chú thích này nếu bạn không đặt nó thành true.

  3. Thuộc tính jsr250Enabled cho phép hỗ trợ annotation @RolesAllowed. Hỗ trợ ở đây có nghĩa là Spring sẽ bỏ qua chú thích này nếu bạn không đặt thành true.

Sự khác biệt giữa @PreAuthorize, @Secured và @RolesAllowed là gì?

@ Secured và @ RolesAllowed về cơ bản giống nhau, mặc dầu @ Secured là một annotation dành riêng cho Spring đi kèm với dependency spring-security-core và @ RolesAllowed là một annotation được chuẩn hóa, nằm trong dependency javax.annotation – api. Cả hai annotation đều lấy một string authority / role làm value [email protected] PreAuthorize / @ PostAuthorize cũng là những annotation đơn cử ( mới hơn ) của Spring và mạnh hơn những annotation ở trên, vì chúng hoàn toàn có thể chứa không chỉ những authority / role mà còn chứa bất kể biểu thức SpEL valid nào .

Cuối cùng, tất cả các annotation này sẽ phát sinh AccessDeniedException nếu bạn thử truy cập một protected method với authority / role không đủ.

Vì thế, tất cả chúng ta hãy cùng xem cách những annotation này hoạt động giải trí .

@Service
public class SomeService {

    @Secured("ROLE_CALLCENTER") // (1)
    // == @RolesAllowed("ADMIN")
    public BankAccountInfo get(...) {

    }

    @PreAuthorize("isAnonymous()") // (2)
    // @PreAuthorize("#contact.name == principal.name")
    // @PreAuthorize("ROLE_ADMIN")
    public void trackVisit(Long id);

    }
}
  1. Như đã đề cập, @Secured có authority/role làm tham số. @RolesAllowed cũng tương tự như vậy. Lưu ý : Hãy nhớ rằng @RolesAllowed("ADMIN") sẽ check một authority được cấp ROLE_ADMIN.

  2. Như đã đề cập, @PreAuthorize ngoài chấp nhận các authorities còn có bất kỳ biểu thức SpEL valid nào. Đối với danh sách các biểu thức security tích hợp sẵn phổ biến như isAnonymous(), thay vì viết các biểu thức SpEL của riêng bạn, hãy xem tài liệu chính thức .

Tôi nên sử dụng annotation nào?

Đây đa phần là yếu tố về tính giống hệt, không cần quá ràng buộc bản thân vào những API dành riêng cho Spring .Nếu sử dụng @ Secured, hãy kiên trì sử dụng và đừng nhảy sang @ RolesAllowed trong 28 % những bean khác của bạn để nỗ lực chuẩn hóa .Để khởi đầu, bạn hoàn toàn có thể sử dụng luôn @ Secured và chuyển sang @ PreAuthorize ngay khi có nhu yếu .

Spring Security & Spring Web MVC

Đối với việc tích hợp với Spring WebMVC, Spring Security được cho phép bạn thực thi 1 số ít việc sau :

  1. Ngoài antMatchers và regexMatchers, bạn cũng hoàn toàn có thể sử dụng mvcMatchers. Sự độc lạ là, trong khi antMatchers và regexMatchers về cơ bản để match những chuỗi URI với những ký tự đại diện thay mặt, mvcMatchers hoạt động giải trí giống hệt như @ RequestMappings .
  2. Inject principal hiện đã được authenticate của bạn vào method @ Controller / @ RestController .
  3. Inject CSRFToken session hiện tại của bạn vào một method @ Controller / @ RestController .
  4. Handle đúng mực bảo mật thông tin để giải quyết và xử lý request không đồng nhất .
@Controller
public class MyController {

    @RequestMapping("/messages/inbox")
    public ModelAndView findMessagesForUser(@AuthenticationPrincipal CustomUser customUser, CsrfToken token) {  // (1) (2)

    // .. find messages for this user and return them ...
    }
}
  1. @ AuthenticationPrincipal sẽ inject một principal nếu user được authenticate hoặc null nếu không có user nào được authenticate. Principal này là object đến từ UserDetailsService / AuthenticationManager của bạn !
  2. Hoặc bạn hoàn toàn có thể inject CSRFToken session hiện tại vào từng method .

Nếu bạn không sử dụng annotation @ AuthenticationPrincipal, bạn sẽ phải tự mình tìm principal, trải qua SecurityContextHolder. Một kỹ thuật thường thấy trong di sản của những ứng dụng Spring Security .

@Controller
public class MyController {

    @RequestMapping("/messages/inbox")
    public ModelAndView findMessagesForUser(CsrfToken token) {
         SecurityContext context = SecurityContextHolder.getContext();
         Authentication authentication = context.getAuthentication();

         if (authentication != null && authentication.getPrincipal() instanceof UserDetails) {
             CustomUser customUser = (CustomUser) authentication.getPrincipal();
             // .. find messages for this user and return them ...
         }

         // todo
    }
}

Spring Security & Spring Boot

Spring Boot thực sự chỉ thông số kỹ thuật trước Spring Security cho bạn bất kỳ khi nào bạn thêm dependecy spring-boot-starter-security vào dự án Spring Boot của mình .Ngoài ra, toàn bộ những thông số kỹ thuật security đều được triển khai với những khái niệm Spring Security đơn thuần ( hãy nhớ : WebSecurityConfigurerAdapter, những quy tắc authentication và authorization ), không tương quan gì đến Spring Boot .Vì vậy, mọi thứ bạn đọc trong phần hướng dẫn này vận dụng 1 : 1 để sử dụng Spring Security với Spring Boot. Và nếu bạn không hiểu rõ về Security, đừng mong hiểu đúng cách cả hai công nghệ tiên tiến hoạt động giải trí cùng nhau .

Spring Security & Thymeleaf

Spring Security tích hợp tốt với Thymeleaf. Nó cung ứng một phương ngữ Spring Security Thymeleaf đặc biệt quan trọng, được cho phép bạn đặt những biểu thức security trực tiếp vào những mẫu HTML Thymeleaf của bạn .

This content is only shown to authenticated users.
This content is only shown to administrators.
This content is only shown to users.

Để có cái nhìn tổng quan vừa đủ và cụ thể hơn về cách cả hai công nghệ tiên tiến hoạt động giải trí cùng nhau, hãy xem tài liệu chính thức .

Câu hỏi thường gặp

Phiên bản Spring Security mới nhất là gì?

Kể từ tháng 5 năm 2020, là phiên bản 5.3.2 .Lưu ý rằng nếu bạn đang sử dụng những dependency Spring Security được xác lập bởi Spring Boot, bạn hoàn toàn có thể đang sử dụng phiên bản Spring Security cũ hơn một chút ít, như 5.2.1 .

Các phiên bản Spring Security cũ hơn có tương thích với phiên bản mới nhất không?

Spring Security gần đây đã trải qua một số ít biến hóa khá nặng. Do đó, bạn sẽ cần tìm những bài hướng dẫn chuyển đến những phiên bản được momg muốn của mình và thao tác trải qua chúng :

  • Spring Security 3. x đến 4. x → https://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-jc.html
  • Spring Security 4. x đến 5. x ( < 5.3 ) → https://docs.spring.io/spring-security/site/docs/5.0.15.RELEASE/reference/htmlsingle/#new ( không phải là hướng dẫn trong thực tiễn, nhưng là một cái gì đó mới )
  • Spring Security 5. x đến 5.3 → https://docs.spring.io/spring-security/site/docs/5.3.1.RELEASE/reference/html5/#new ( không phải là hướng dẫn thực tiễn, nhưng là một cái gì đó mới )

Tôi cần thêm những dependency nào để Spring Security hoạt động?

Dự án Plain Spring

Nếu bạn đang thao tác với một dự án Spring đơn thuần ( không phải Spring Boot ), bạn cần thêm hai dependency Maven / Gradle sau vào dự án của mình :


    org.springframework.security
    spring-security-web
    5.2.2.RELEASE


    org.springframework.security
    spring-security-config
    5.2.2.RELEASE

Bạn cũng sẽ cần cấu hình SecurityFilterChain trong cấu hình web.xml hoặc Java của mình. Xem cách thực hiện tại đây .

Dự án Spring Boot

Nếu bạn đang thao tác với một dự án Spring Boot, bạn cần thêm dependency Maven / Gradle sau vào dự án của mình :


    org.springframework.boot
    spring-boot-starter-security

Mọi thứ khác sẽ tự động hóa được thông số kỹ thuật cho bạn và bạn hoàn toàn có thể khởi đầu viết ngay lập tức WebSecurityConfigurerAdapter của mình .

Làm cách nào để truy cập user hiện đã được authenticate trong Spring Security?

Như đã đề cập trong bài viết, Spring Security tàng trữ user hiện đã được authenticate ( hay đúng hơn là SecurityContext ) trong một variable luồng cục bộ bên trong SecurityContextHolder. Bạn hoàn toàn có thể truy vấn nó như này :

SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Collection authorities = authentication.getAuthorities();

Lưu ý rằng Spring Security theo mặc định sẽ đặt AnonymousAuthenticationToken làm authentication trên SecurityContextHolder nếu như bạn chưa login. Điều này dẫn đến một số nhầm lẫn, vì mọi người thường mong đợi giá trị null tại đó.

AntMatchers: Các ví dụ phổ biến

Một ví dụ hiển thị những năng lực của antMatcher ( và regexMatcher / mvcMatcher ) hữu dụng nhất :

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
      .antMatchers("/api/user/**", "/api/ticket/**", "/index").hasAuthority("ROLE_USER")
      .antMatchers(HttpMethod.POST, "/forms/**").hasAnyRole("ADMIN", "CALLCENTER")
      .antMatchers("/user/**").access("@webSecurity.check(authentication,request)");
}

Làm cách nào để sử dụng trang login tùy chỉnh với Spring Security?

@Override
protected void configure(HttpSecurity http) throws Exception {
http
      .authorizeRequests()
          .anyRequest().authenticated()
          .and()
      .formLogin()
          .loginPage("/login") // (1)
          .permitAll();
}
  1. URL cho trang login tùy chỉnh của bạn. Ngay sau khi bạn chỉ định, trang login được tạo tự động sẽ biến mất.

Làm cách nào để login với Spring Security?

UserDetails principal = userDetailsService.loadUserByUsername(username);
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, principal.getPassword(), principal.getAuthorities());
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);

Làm cách nào để vô hiệu hóa CSRF chỉ cho một số đường dẫn nhất định?

@Override
    protected void configure(HttpSecurity http) throws Exception {
      http
       .csrf().ignoringAntMatchers("/api/**");
    }

Vây

Nếu bạn đã đọc đến đây, giờ đây bạn đã hiểu khá rõ về sự phức tạp của hệ sinh thái Spring Security, ngay cả khi không có OAuth2. Tóm lại :

  1. Sẽ hữu dụng nếu bạn có hiểu biết cơ bản về cách FilterChain của Spring Security hoạt động giải trí và những giải pháp bảo vệ mặc định khỏi bị khai thác thông tin của nó là gì ( hãy quay lại : CSRF ) .
  2. Cần hiểu sự độc lạ giữa authentication và authorization. Và cả những @ Beans nào bạn cần chỉ định cho quá trình authenticate đơn cử .
  3. Đảm bảo rằng bạn hiểu DSL của WebSecurityConfigurerAdapter của Spring Security cũng như method security dựa trên annotation .
  4. Cuối cùng nhưng không kém phần quan trọng, nó giúp kiểm tra lần nữa sự tích hợp với những framework và thư viện khác mà Spring Security có, như Spring MVC hoặc Thymeleaf .

Hôm nay đủ rồi, vì đó là một chuyến đi khá xa, phải không? Cảm ơn vì đã đọc!

Tham khảo Lộ trình Java Fullstack cho người mới bắt đầu

Khóa học – tại đâyHỗ trợ – Ms Mẫn 0963023185 ( zalo )

Source: https://openlivenft.info
Category : TIN COIN

Đánh giá bài post
- Advertisement -spot_img

More articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisement -spot_img

Latest article

Ethereum là gì? | OpenliveNFT