SPRING BOOT
Cách sử dụng Spring Scheduled trong Spring Boot Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java Hướng dẫn Upload file với Spring Boot trong Java Hướng dẫn download file với Spring Boot trong Java Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java Spring Boot là gì? Tại sao sử dụng Spring Boot trong Java Cài đặt Spring Boot trong Java, code một project Spring Boot cơ bản RESTful API là gì? Cách hoạt động của RESTful API trong Spring Boot RESTful API hoạt động qua giao thức HTTP như thế nào? CRUD đơn giản với RESTful API trong Spring Boot Java Các thuộc tính của Spring Boot trong Java Hướng dẫn sử dụng Thymeleaf và Spring Boot trong Java Hướng dẫn sử dụng FreeMarker với Spring Boot trong Java Hướng dẫn sử dụng JSP và Spring Boot trong Java Cách dùng Logging trong Spring Boot Kiến trúc 3layer trong Spring Boot là gì? Cách hoạt động thế nào? Hướng dẫn sử dụng Apache Tiles với Spring Boot trong Java Sử dụng nhiều ViewResolver trong Spring Boot Java Giới thiệu về Spring Boot Actuator trong ứng dụng Spring Boot Cách dùng Spring JDBC trong ứng dụng Spring Boot Java Spring Data JPA trong Spring Boot là gì? Spring Data JPA có gì hay? Tương tác giữa Spring Boot, JPA và cơ sở dữ liệu H2 Cách dùng Spring Email trong Spring Boot Sử dụng @bean trong ứng dụng Spring Boot Cách chuyển HTTP sang HTTPS trong Spring Boot Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền Cách triển khai Spring Boot trên Tomcat Server Sử dụng JUnit để tạo unit test trong Spring Boot Cách test RESTful API trong Spring Boot Tạo ứng dụng Chat với Spring Boot và Websocket Tạo trang web đa ngôn ngữ với Spring Boot trong Java Sử dụng Twitter Bootstrap trong Spring Boot Hướng dẫn sử dụng Interceptor trong Spring Boot Cách tạo Restful Client bằng RestTemplate trong Spring Boot Cách dùng Spring Boot và MongoDB trong Java Cách dùng Spring Boot và Mustache trong Java Cách dùng Groovy trong Spring Boot Java
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Cách dùng Spring Security trong Spring Boot để xác thực và phân quyền

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Spring Security để xác thực và phân quyền trong ứng dụng Spring Boot.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong các ứng dụng web hiện nay, việc xác thực và phân quyền là rất quan trọng để bảo vệ thông tin và đảm bảo an toàn cho người dùng. Với sự phát triển của Spring Framework, Spring Security đã trở thành một trong những framework phổ biến nhất để xây dựng các chức năng bảo mật trong ứng dụng.

1. Giới thiệu Spring Security

spring security png

Spring Security

Spring Security là gì?

Spring Security là một framework phổ biến của Spring được sử dụng để xác thực và phân quyền cho các ứng dụng Java. Spring Security cung cấp cho các nhà phát triển các công cụ cần thiết để thiết lập xác thực và phân quyền cho ứng dụng của họ, cũng như hỗ trợ các tính năng bảo mật khác như bảo vệ chống tấn công CSRF (Cross-Site Request Forgery), XSS (Cross-Site Scripting), và hạn chế số lần truy cập bị giới hạn.

Tầm quan trọng của việc xác thực và phân quyền trong ứng dụng web.

Việc xác thực và phân quyền trong ứng dụng web là rất quan trọng để đảm bảo an toàn và bảo mật cho hệ thống, bảo vệ thông tin người dùng và tránh những hành động bất hợp pháp như truy cập trái phép vào dữ liệu hoặc tài khoản của người dùng.

Bài viết này được đăng tại [free tuts .net]

2. Ba tính chất quan trọng của Spring Security

Khái niệm cơ bản về xác thực trong Spring Security.

Xác thực (authentication) là quá trình xác nhận danh tính của người dùng, đảm bảo rằng họ có quyền truy cập vào hệ thống. Việc xác thực đúng cách sẽ giúp tránh được những tấn công giả mạo hoặc lừa đảo thông tin. Các phương pháp xác thực phổ biến bao gồm đăng nhập bằng tài khoản và mật khẩu, sử dụng mã xác thực hai yếu tố, hoặc xác thực bằng vân tay hoặc khuôn mặt.

Sau đây là một ví dự xác thực dựa trên mật khẩu:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .withUser("user")
        .password("{noop}password")
        .roles("USER");
}

Trong ví dụ trên, chúng ta đã cấu hình xác thực dựa trên mật khẩu sử dụng InMemoryAuthenticationProvider. Chúng ta đã định nghĩa một người dùng có tên "user" và mật khẩu là "password" và gán cho nó vai trò "USER".

Khái niệm cơ bản về phân quyền trong Spring Security.

Phân quyền (Authorization): Phân quyền là quá trình quyết định người dùng có quyền truy cập vào tài nguyên nào trong hệ thống. Spring Security cung cấp nhiều cách để phân quyền như sử dụng Annotation, Expression-based, v.v.

Ví dụ:

@RestController
@RequestMapping("/api")
@PreAuthorize("hasRole('USER')")
public class ApiController {
    // code
}

Trong ví dụ trên, chúng ta đã sử dụng @PreAuthorize để áp dụng phân quyền truy cập cho API "/api". Nó chỉ cho phép người dùng có vai trò "USER" truy cập API này.

Khái niệm cơ bản về Authentication Provider trong Spring Security.

Authentication Provider: Authentication Provider là một đối tượng chịu trách nhiệm xác thực người dùng. Spring Security có một số Authentication Provider được tích hợp sẵn như InMemoryAuthenticationProvider, JDBC Authentication Provider, LDAP Authentication Provider, v.v. Bạn cũng có thể tạo ra các Authentication Provider tùy chỉnh của riêng mình.

Ví dụ:

@Configuration
@EnableWebSecurity
public class OAuth2SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/oauth2/**", "/login/**", "/logout/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
    }

    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(
                ClientRegistration.withRegistrationId("google")
                        .clientId("client-id")
                        .clientSecret("client-secret")
                        .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
                        .redirectUriTemplate("{baseUrl}/oauth2/callback/{registrationId}")
                        .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
                        .scope("openid", "profile", "email")
                        .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
                        .tokenUri("https://www.googleapis.com/oauth2/v4/token")
                        .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
                        .userNameAttributeName(IdTokenClaimNames.SUB)
                        .jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")
                        .clientName("Google")
                        .build()
        );
    }

    @Bean
    public OAuth2UserService<OAuth2UserRequest, OAuth2User> oAuth2UserService() {
        DefaultOAuth2UserService delegate = new DefaultOAuth2UserService();
        return request -> {
            OAuth2User user = delegate.loadUser(request);
            // customize the user object if needed
            return user;
        };
    }
}

Trong ví dụ trên, chúng ta đã cấu hình xác thực dựa trên OAuth2 sử dụng Google làm nhà cung cấp dịch vụ xác thực. Chúng ta đã cấu hình để cho phép truy cập vào các API "/oauth2/", "/login/", và "/logout/**" mà không cần xác thực. Các API khác sẽ yêu cầu người dùng xác thực trước khi truy cập được. Chúng ta cũng đã cung cấp thông tin về Google OAuth2 Client và cấu hình một OAuth2UserService để xử lý thông tin người dùng trả về từ Google.

3. Cấu hình Spring Security trong ứng dụng Spring Boot

Cấu hình các dependency và configuration để sử dụng Spring Security trong ứng dụng Spring Boot.

Cấu hình dependency: Đầu tiên nếu muốn sử dụng Spring Security trong ứng dụng Spring Boot, bạn cần thêm các dependency sau vào file pom.xml:

<dependencies>
    <!-- Spring Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- Spring Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot DevTools (optional) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Cấu hình configuration:

Sau khi thêm các dependency trên vào file pom.xml, bạn cần tạo file cấu hình Spring Security trong ứng dụng của mình. Để làm điều này, bạn có thể tạo một class SecurityConfig và extends từ lớp WebSecurityConfigurerAdapter. Sau đó, bạn có thể sử dụng phương thức configure() để thiết lập cấu hình bảo mật cho ứng dụng của mình.

Ví dụ:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }
 
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");
    }
}

Trong ví dụ trên, chúng ta đã thiết lập cấu hình bảo mật cho ứng dụng bằng cách cho phép truy cập vào các trang "/" và "/home" mà không cần xác thực, nhưng yêu cầu xác thực đối với các trang khác. Chúng ta cũng đã cấu hình cho phép đăng nhập và đăng xuất, và sử dụng đăng nhập trong bộ nhớ để xác thực người dùng.

Tạo một cấu hình đơn giản để bảo vệ các trang web bằng cách yêu cầu đăng nhập.

Để bảo vệ các trang web bằng cách yêu cầu đăng nhập sử dụng Spring Security, bạn có thể sử dụng cấu hình sau:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .and()
            .logout();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER");
    }
}

Trong cấu hình này, chúng ta đã sử dụng @EnableWebSecurity để bật tính năng bảo vệ các trang web bằng Spring Security. Chúng ta đã ghi đè phương thức configure(HttpSecurity http) để cấu hình chính sách bảo mật cho ứng dụng. Ở đây, chúng ta đã cấu hình để yêu cầu đăng nhập cho tất cả các yêu cầu, sử dụng phương thức formLogin() để hiển thị trang đăng nhập mặc định của Spring Security, và cấu hình phương thức logout() để cho phép người dùng đăng xuất.

Chúng ta cũng đã ghi đè phương thức configure(AuthenticationManagerBuilder auth) để cấu hình xác thực người dùng. Sử dụng inMemoryAuthentication() để cấu hình người dùng được lưu trữ trong bộ nhớ. Trong ví dụ này, chúng ta đã tạo một người dùng với tên đăng nhập "user" và mật khẩu "{noop}password" (chúng ta sử dụng "{noop}" để đánh dấu rằng mật khẩu không được mã hóa). Người dùng này có vai trò "USER".

Với cấu hình này, bất kỳ yêu cầu nào đến ứng dụng đều sẽ yêu cầu người dùng đăng nhập trước khi truy cập được trang. Bạn có thể tùy chỉnh cấu hình này để phù hợp với nhu cầu của ứng dụng của mình.

4. Các câu hỏi thường gặp

Làm thế nào để cấu hình Spring Security trong ứng dụng Spring Boot?

Bạn có thể cấu hình Spring Security trong ứng dụng Spring Boot bằng cách tạo một lớp cấu hình và kế thừa từ lớp WebSecurityConfigurerAdapter. Trong lớp này, bạn có thể cấu hình chính sách bảo mật và phương thức xác thực.

Làm thế nào để xác thực người dùng trong Spring Security?

Bạn có thể xác thực người dùng trong Spring Security bằng cách sử dụng các Authentication Provider được hỗ trợ sẵn. Ví dụ: In-memory Authentication Provider, JDBC Authentication Provider, LDAP Authentication Provider, và OAuth 2.0 Authentication Provider.

Làm thế nào để phân quyền trong Spring Security?

Bạn có thể phân quyền trong Spring Security bằng cách sử dụng các Access Control Expression (ACE), có thể được cấu hình trong phương thức configure(HttpSecurity http) của lớp cấu hình Spring Security. ACE cho phép bạn xác định chính sách bảo mật cho từng URL hoặc tài nguyên riêng lẻ trong ứng dụng của mình.

5. Tổng kết và kết luận

Trên đây là những kiến thức cơ bản về Spring Security để xác thực và phân quyền trong ứng dụng Spring Boot. Mình hy vọng bài viết đã giúp các bạn hiểu rõ hơn về các khái niệm và tính năng của Spring Security và có thể áp dụng vào các dự án của mình một cách hiệu quả.

Cảm ơn các bạn đã dành thời gian đọc bài viết này. Nếu có bất kỳ thắc mắc hoặc góp ý nào, xin vui lòng để lại comment bên dưới.

Cùng chuyên mục:

Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java

Hướng dẫn Upload file với Spring Boot và jQuery Ajax trong Java

Hướng dẫn download file với Spring Boot trong Java

Hướng dẫn download file với Spring Boot trong Java

Hướng dẫn Upload file với Spring Boot trong Java

Hướng dẫn Upload file với Spring Boot trong Java

Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java

Hướng dẫn CRUD với Spring Boot, REST và AngularJS trong Java

Cách sử dụng Spring  Scheduled trong Spring Boot

Cách sử dụng Spring Scheduled trong Spring Boot

Cách dùng Groovy trong Spring Boot Java

Cách dùng Groovy trong Spring Boot Java

Cách dùng Spring Boot và Mustache trong Java

Cách dùng Spring Boot và Mustache trong Java

Cách dùng Spring Boot và MongoDB trong Java

Cách dùng Spring Boot và MongoDB trong Java

Cách tạo Restful Client bằng RestTemplate trong Spring Boot

Cách tạo Restful Client bằng RestTemplate trong Spring Boot

Hướng dẫn sử dụng Interceptor trong Spring Boot

Hướng dẫn sử dụng Interceptor trong Spring Boot

Sử dụng Twitter Bootstrap trong Spring Boot

Sử dụng Twitter Bootstrap trong Spring Boot

Tạo trang web đa ngôn ngữ với Spring Boot trong Java

Tạo trang web đa ngôn ngữ với Spring Boot trong Java

Tạo ứng dụng Chat với Spring Boot và Websocket

Tạo ứng dụng Chat với Spring Boot và Websocket

Sử dụng JUnit để tạo unit test trong Spring Boot

Sử dụng JUnit để tạo unit test trong Spring Boot

Cách triển khai Spring Boot trên Tomcat Server

Cách triển khai Spring Boot trên Tomcat Server

Cách test RESTful API trong Spring Boot

Cách test RESTful API trong Spring Boot

Duyệt cây nhị phân bằng phương pháp inOder trong Java

Duyệt cây nhị phân bằng phương pháp inOder trong Java

Xóa node của cây nhị phân tìm kiếm trong Java

Xóa node của cây nhị phân tìm kiếm trong Java

Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java

Bảo mật Spring Boot RESTful Service sử dụng Basic Authentication trong Java

Xác định đường biên(boundary traversal) của cây nhị phân trong Java

Xác định đường biên(boundary traversal) của cây nhị phân trong Java

Top