[Spring boot + Spring Security] Authentication with Custom Filter

1. Prepare Tools

  • IDE: Netbean 8.2
  • JDK: 1.8
  • Maven: 3.5.0

2. Target

Build project thỏa mãn các yêu cầu sau:

  • Sử dụng spring boot + spring security
    
  • xây dựng login page, home page.
    
  • Build 1 CustomFilter, chỉ xử lý các request đến từ địa chỉ 127.0.0.1
    
  • Sử dụng annotation configuration thay cho xml configuration.
    

3. Maven dependency

        <!-- Core starter, including auto-configuration support, logging and YAML -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- Starter for using Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

4. Project setup and description

1. Basic Project

https://viblo.asia/p/spring-boot-spring-security-basic-project-1VgZvEmpKAw

2. CustomFilter

Các filter được lọt vào mắt xanh của anh chàng DelegatingFilterProxy sẽ phải là con của ông GenericFilterBean. Mỗi Filter sẽ có một function chính là doFilter. Filter này làm nhiệm vụ thực hiện logic filter của mình dựa trên request đầu vào. Cụ thể ở đây, mình chỉ xử lý các request post tới địa chỉ login có ip là 127.0.0.1

       AntPathRequestMatcher matcher = new AntPathRequestMatcher("/login", "POST");
        if (!matcher.matches(request)) {
            fc.doFilter(req, res);
            return;
        }

        if (request.getRemoteHost().equals("127.0.0.1")) {

3. MyToken

Ở đây m tự tạo ra một custom một object Authentication. Object này sau khi xác thực xong sẽ được securityContextholder lưu trữ. MyToken sẽ có một vài thông tin cơ bản, bao gôm username, password và danh sách các quyền dược thao tác.

    private String userName;
    private String password;
    private ArrayList grantedAuthorities;
    private boolean isAuthenticated = false;

4. CustomAuthenticationProvider

Class được sinh ra chỉ để xử lý xác thực với các object dạng MyToken.

5. SecurityConfig

    @Bean(name = BeanIds.AUTHENTICATION_MANAGER)
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
    
        @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll();
        http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
    }

Custom Filter sẽ được thực hiện trước UsernamePasswordAuthenticationFilter.

5. Demo

6. Full Source

spring-security-custom-authentication-filter http://123link.vip/CjiL