代码之家  ›  专栏  ›  技术社区  ›  Den B

无法在spring boot中自动连接SessionRegistry

  •  2
  • Den B  · 技术社区  · 6 年前

    我有从spring应用程序迁移过来的spring引导应用程序。一切正常。我决定添加一些与SessionRegistry相关的新函数。我发现sessionRegistry不能自动连接。 只是显示不能自动连线。找不到'SessionRegistry'类型的bean。 我认为这可能是创意问题,并试图运行项目与此编译问题,但应用程序没有启动:


    应用程序启动失败


    说明:

    SessionUtils中构造函数的参数0需要找不到类型为“org.springframework.security.core.session.SessionRegistry”的bean。

    行动:

    考虑在配置中定义一个类型为“org.springframework.security.core.session.SessionRegistry”的bean。

    这是我尝试使用SessionRegistry的类的示例:

        import org.springframework.security.core.session.SessionRegistry;
    
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.session.SessionInformation;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class SessionUtils {
    
        private final SessionRegistry sessionRegistry;
    
        @Autowired
        public SessionUtils(SessionRegistry sessionRegistry) {
            this.sessionRegistry = sessionRegistry;
        }
    
        public void expireUserSessions(String username) {
            for (Object principal : sessionRegistry.getAllPrincipals()) {
                if (principal instanceof User) {
                    UserDetails userDetails = (UserDetails) principal;
                    if (userDetails.getUsername().equals(username)) {
                        for (SessionInformation information : sessionRegistry.getAllSessions(userDetails, true)) {
                            information.expireNow();
                        }
                    }
                }
            }
        }
    }
    

    我试图添加@ComponentScan,但没有帮助。 我的应用程序.类代码:

        import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
    import org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration;
    import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
    import org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration;
    import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
    
    /**
     * Main class for Spring Boot
     */
    @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class,
            FreeMarkerAutoConfiguration.class, HttpEncodingAutoConfiguration.class, WebMvcAutoConfiguration.class})
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    有人有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Deb    6 年前

    你需要在你的 configuration 班级:

    @Bean
    SessionRegistry sessionRegistry() { 
        return new SessionRegistryImpl(); 
    }
    

    你可以把它保存在你的应用程序类中。

    public class Application {
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
        @Bean
        public SessionRegistry sessionRegistry() {
            return new SessionRegistryImpl();
    
        }
    }