java - 如何使用 MongoDB 实现 ReactiveUserDetailsS​​ervice

标签 java spring mongodb spring-security

在Spring security 5中出现了一个接口(interface)ReactiveUserDetailsService .

现在我的问题是如何使用以下方法实现 UserDetailsS​​ervice:

  • Spring-data-Mongo
  • Spring 安全 (5)

我有(内存中存储的用户)

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

我想要的:

@Document(collection = "user")
public class User implements UserDetails {

    @Id
    private Long id;
    private LocalDate createdAt;
    private String username;
    private String password;
    private boolean accountNonLocker;
    private boolean enabled;
    @DBRef
    private List<GrantedAuthority> grantedAuthorities;
    //getters and setters
}


@Component
public class SecUserDetailsService implements ReactiveUserDetailsService {

}

而且我不知道如何实现它。在网络上找不到任何资源。

最佳答案

已经找到解决方法:

  • UseAccount类中实现UserDetails接口(interface),并创建实现GrantedAuthority接口(interface)的Role类:

    作用

    @Data
    @Document
    public class Role implements GrantedAuthority {
        @Id
        private String id;
    
        @Override
        public String getAuthority() {
            return id;
        }
    }
    

    使用帐号

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Document
    public class UserAccount implements UserDetails {
    
        @Id
        private String id;
        private String username;
        private String password;
        private String firstName;
        private String lastName;
        private String idnp;
    
        @Email
        private String email;
    
        @Builder.Default()
        private boolean active = true;
    
        @Builder.Default()
        @DBRef
        private List<Role> roles = new ArrayList<>();
    
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return roles;
        }
    
        @Override
        public String getPassword() {
            return password;
        }
    
        @Override
        public String getUsername() {
            return username;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            return active;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            return active;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            return active;
        }
    
        @Override
        public boolean isEnabled() {
            return active;
        }
    
        @Override
        public String getName() {
            return firstName + " " + lastName;
        }
    }
    

  • 定义安全配置并在其中创建网络过滤器。

    @Configuration
    @EnableWebFluxSecurity
    public class SecurityConfiguration {
    
        @Bean
        SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
            return http
                .csrf().disable()
                .authorizeExchange()
                    .pathMatchers("/login", "/logout").permitAll()
                    .pathMatchers("/i18n/**",
                        "/css/**",
                        "/fonts/**",
                        "/icons-reference/**",
                        "/img/**",
                        "/js/**",
                        "/vendor/**").permitAll()
                .anyExchange()
                    .authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login")
                    .and()
                .logout()
                    .logoutUrl("/logout")
                    .and()
                .build();
        }
    
    
        //in case you want to encrypt password
        @Bean
        public BCryptPasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
    }
    

  • 创建存储库以从数据库中提取您的用户。
  • 最后一步是创建 UserDetailsS​​ervice

    @Component
    public class SecUserDetailsService implements ReactiveUserDetailsService {
    
        @Autowired
        public ReactiveUserAccountRepository reactiveUserAccountRepository;
    
    
        @Override
        public Mono<UserDetails> findByUsername(String username) {
            Mono<UserAccount> data = reactiveUserAccountRepository.findByUsername(username);
            return data.cast(UserDetails.class);
        }
    }
    
  • 关于java - 如何使用 MongoDB 实现 ReactiveUserDetailsS​​ervice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47570125/

    相关文章:

    java - Spring Injection - 线程安全

    java - Spring @Autowire 在 Kotlin 中不起作用

    c++ - 函数参数 "not declared in this scope"。参数在h文件中可见

    mongodb - mongoimport Docker失败:连接到数据库服务器时出错:没有可访问的服务器

    javascript - MongoDB/Javascript 范围问题

    java - 在JAVA中设置文档边距

    java - 使用 XPath 检索 html 标签的内容

    java - 在 Spring RestController 中显式将 POJO 转换为 JSON 的最佳方法

    java - 查找 Eclipse 对 Maven 项目所做的更改

    spring - 在 Spring Framework 中使用带有静态最终变量的 @Value 注释