Spring Security: Webflux 默認配置

默認配置

所謂默認配置, 就是對Spring Security不作任何配置. 讓它的自動配置起做用. 目的是對Spring Security 的 默認行爲有一個初步的直觀的瞭解.

第一步: 使用Intellj IDEASpring Initializr 建立項目

clipboard.png

clipboard.png

clipboard.png

項目建立完成會自動生成一個應用入口類java

package com.example.demowebfluxsecurityinmemory;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoWebfluxSecurityInMemoryApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoWebfluxSecurityInMemoryApplication.class, args);
    }
}

第二步: 建立一個控制器

package com.example.demowebfluxsecurityinmemory;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

import java.security.Principal;
import java.util.Collections;
import java.util.Map;

@RestController
public class UserController {
    @GetMapping("/")
    public Mono<Map<String, String>> hello(Mono<Principal> principal) {
        return principal
            .map(Principal::getName)
            .map(this::helloMessage);
    }

    private Map<String, String> helloMessage(String username) {
        return Collections.singletonMap("message", "Hello " + username + "!");
    }
}

mvn spring-boot:run 啓動, 會在控制檯輸出中看到一個水機生成的UUID格式的密碼:react

clipboard.png

最後, 打開 http://localhost:8080/login 便可顯示登陸頁面, 默認用戶名稱爲 user. 到這裏, Spring Security 的默認設置的樣子就是這樣的, 現實場景中是不可能這麼簡單的. 所以咱們須要對它進行定製web

定製

自定義配置(自定義用戶帳號)

添加一個配置類, 以下:spring

package com.example.demowebfluxsecurityinmemory;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;

@Configuration
public class SecurityConfig {
    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("user")
            .roles("USER")
            .build();
        UserDetails admin = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("admin")
            .roles("ADMIN")
            .build();
        return new MapReactiveUserDetailsService(user, admin);
    }
}

如今重啓服務器, 就可使用自定義的用戶名和密碼登陸了. 安全

ReactiveUserDetailsService 是Webflux Security的一個核心接口, 表明了Spring Security 安全體系中的用戶信息, 它只有一個接口方法Mono<UserDetails> findByUsername(String username);服務器

做用: 該接口方法的做用是從各類存儲中獲取用戶信息. 經過該接口拿到了用戶的信息, 就能夠經過判斷用戶的狀態進行認證, 受權等操做.app

這個接口的做用就一個: 獲取 UserDetails 對象.ide

package org.springframework.security.core.userdetails;
import reactor.core.publisher.Mono;
public interface ReactiveUserDetailsService {
    Mono<UserDetails> findByUsername(String username);
}

MapReactiveUserDetailsService 實現了 UserDetailsService 接口, 其 findByUsername 方法是從一個 Map 中去獲取 UserDetails 對象. 所以可以管理多個 UserDetails 對象.spring-boot

其實現代碼爲:ui

@Override
public Mono<UserDetails> findByUsername(String username) {
    String key = getKey(username);
    UserDetails result = users.get(key);
    return result == null ? Mono.empty() : Mono.just(User.withUserDetails(result).build());
}
相關文章
相關標籤/搜索