当前位置: 首页 > 知识库问答 >
问题:

社交登录,spring-security-oauth2和spring-security-jwt?

暴向笛
2023-03-14

我正在开发一个rest服务,它将通过浏览器、单页应用程序和移动应用程序在浏览器中提供。现在我的服务没有Spring就可以工作了。oauth2客户机是在过滤器内部实现的,可以说是“手工”。

我正在尝试将其迁移到spring Boot。阅读了大量的手册和谷歌搜索了大量的信息,我正在努力了解以下内容是否对客户来说是可能的:

>

  • 通过Spring-Security-Oauth2提供的所有帮助,使用facebook oauth2服务进行授权(并获得access_token)。

    创建一个JWT并将其传递给客户机,以便所有进一步的请求都支持该JWT。

    因为在我看来spring boot是关于配置和声明的,我想要理解的是,这是否可以使用spring-security-oauth2和spring-security-jwt?

    我并不是在寻求解决方案,而只是从知识持有者的Yes/No,因为我对spring手册有很深的了解,答案会变得更深入。

  • 共有1个答案

    扶文光
    2023-03-14

    简短回答:是的,你能做到!

    您必须将安全依赖项添加到build.gradle或pom.xml文件:

    compile "org.springframework.boot:spring-boot-starter-security"
    compile "org.springframework.security:spring-security-config"
    compile "org.springframework.security:spring-security-data"
    compile "org.springframework.security:spring-security-web"
    
    compile "org.springframework.social:spring-social-security"
    compile "org.springframework.social:spring-social-google"
    compile "org.springframework.social:spring-social-facebook"
    compile "org.springframework.social:spring-social-twitter"
    

    然后,您必须将social config与安全配置一起添加到项目中:

    @Configuration
    @EnableSocial
    public class SocialConfiguration implements SocialConfigurer {
    
        private final Logger log = LoggerFactory.getLogger(SocialConfiguration.class);
    
        private final SocialUserConnectionRepository socialUserConnectionRepository;
    
        private final Environment environment;
    
        public SocialConfiguration(SocialUserConnectionRepository socialUserConnectionRepository,
                Environment environment) {
    
            this.socialUserConnectionRepository = socialUserConnectionRepository;
            this.environment = environment;
        }
    
        @Bean
        public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator,
                ConnectionRepository connectionRepository) {
    
            ConnectController controller = new ConnectController(connectionFactoryLocator, connectionRepository);
            controller.setApplicationUrl(environment.getProperty("spring.application.url"));
            return controller;
        }
    
        @Override
        public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer, Environment environment) {
            // Google configuration
            String googleClientId = environment.getProperty("spring.social.google.client-id");
            String googleClientSecret = environment.getProperty("spring.social.google.client-secret");
            if (googleClientId != null && googleClientSecret != null) {
                log.debug("Configuring GoogleConnectionFactory");
                connectionFactoryConfigurer.addConnectionFactory(
                    new GoogleConnectionFactory(
                        googleClientId,
                        googleClientSecret
                    )
                );
            } else {
                log.error("Cannot configure GoogleConnectionFactory id or secret null");
            }
    
            // Facebook configuration
            String facebookClientId = environment.getProperty("spring.social.facebook.client-id");
            String facebookClientSecret = environment.getProperty("spring.social.facebook.client-secret");
            if (facebookClientId != null && facebookClientSecret != null) {
                log.debug("Configuring FacebookConnectionFactory");
                connectionFactoryConfigurer.addConnectionFactory(
                    new FacebookConnectionFactory(
                        facebookClientId,
                        facebookClientSecret
                    )
                );
            } else {
                log.error("Cannot configure FacebookConnectionFactory id or secret null");
            }
    
            // Twitter configuration
            String twitterClientId = environment.getProperty("spring.social.twitter.client-id");
            String twitterClientSecret = environment.getProperty("spring.social.twitter.client-secret");
            if (twitterClientId != null && twitterClientSecret != null) {
                log.debug("Configuring TwitterConnectionFactory");
                connectionFactoryConfigurer.addConnectionFactory(
                    new TwitterConnectionFactory(
                        twitterClientId,
                        twitterClientSecret
                    )
                );
            } else {
                log.error("Cannot configure TwitterConnectionFactory id or secret null");
            }
    
            // jhipster-needle-add-social-connection-factory
        }
    
        @Override
        public UserIdSource getUserIdSource() {
            return new AuthenticationNameUserIdSource();
        }
    
        @Override
        public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) {
            return new CustomSocialUsersConnectionRepository(socialUserConnectionRepository, connectionFactoryLocator);
        }
    
        @Bean
        public SignInAdapter signInAdapter(UserDetailsService userDetailsService, JHipsterProperties jHipsterProperties,
                TokenProvider tokenProvider) {
            return new CustomSignInAdapter(userDetailsService, jHipsterProperties,
                tokenProvider);
        }
    
        @Bean
        public ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository, SignInAdapter signInAdapter) {
            ProviderSignInController providerSignInController = new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, signInAdapter);
            providerSignInController.setSignUpUrl("/social/signup");
            providerSignInController.setApplicationUrl(environment.getProperty("spring.application.url"));
            return providerSignInController;
        }
    
        @Bean
        public ProviderSignInUtils getProviderSignInUtils(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository) {
            return new ProviderSignInUtils(connectionFactoryLocator, usersConnectionRepository);
        }
    }
    
    public class CustomSignInAdapter implements SignInAdapter {
    
        @SuppressWarnings("unused")
        private final Logger log = LoggerFactory.getLogger(CustomSignInAdapter.class);
    
        private final UserDetailsService userDetailsService;
    
        private final JHipsterProperties jHipsterProperties;
    
        private final TokenProvider tokenProvider;
    
    
        public CustomSignInAdapter(UserDetailsService userDetailsService, JHipsterProperties jHipsterProperties,
                TokenProvider tokenProvider) {
            this.userDetailsService = userDetailsService;
            this.jHipsterProperties = jHipsterProperties;
            this.tokenProvider = tokenProvider;
        }
    
        @Override
        public String signIn(String userId, Connection<?> connection, NativeWebRequest request){
            try {
                UserDetails user = userDetailsService.loadUserByUsername(userId);
                UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                    user,
                    null,
                    user.getAuthorities());
    
                SecurityContextHolder.getContext().setAuthentication(authenticationToken);
                String jwt = tokenProvider.createToken(authenticationToken, false);
                ServletWebRequest servletWebRequest = (ServletWebRequest) request;
                servletWebRequest.getResponse().addCookie(getSocialAuthenticationCookie(jwt));
            } catch (AuthenticationException ae) {
                log.error("Social authentication error");
                log.trace("Authentication exception trace: {}", ae);
            }
            return jHipsterProperties.getSocial().getRedirectAfterSignIn();
        }
    
        private Cookie getSocialAuthenticationCookie(String token) {
            Cookie socialAuthCookie = new Cookie("social-authentication", token);
            socialAuthCookie.setPath("/");
            socialAuthCookie.setMaxAge(10);
            return socialAuthCookie;
        }
    }
    

    您可以在我的GitHub:https://github.com/ksadjad/oauth-test中找到示例项目

     类似资料:
    • 我想使用Spring Security设置一个中央身份验证/授权服务器,从那里我可以获取JWT令牌,然后我可以使用该令牌访问另一个Spring Security备份的REST服务器上的受限资源。 以下是我的流程: 我认为JWT最适合这个场景,因为它可以包含所有相关的数据,并且REST服务器可以是完全无状态的,只需解码令牌就可以获得所有必要的数据(role、clientid、email...)在RE

    • 我有一个Spring Boot应用程序并为其配置了Spring Security性,它使用带有简单AngularJS表单的自定义登录页面,我正在尝试通过它进行身份验证,但未成功。在我的MONTUserDetailsService loadUserByUsername(String参数)参数每次都为空,有人能帮我吗?我错过了什么吗? 这是我的表格: 这是我的js: 这是我的安全配置: 这是我每次都会

    • 我正在学习Spring Boot Security入门第五部分,以保护我的RESTful微服务。 我打算实现的简单流程是:- > 如果未经身份验证,用户将被重定向到一个自定义登录页,地址是'/login'。 用户提供他的凭据。 上面提到的链接中的入门指南使用了在。properties或。yml文件中配置的基本Auth和虚拟用户。 这是我尝试配置的方式:- 单击授权endpoint会将我重定向到“h

    • 我使用spring和security with创建了一个REST服务。当前,当我点击url时,我获得了访问令牌,然后使用它发送基本登录凭据,该凭据在文件中是静态的。如何使用数据库提供用户身份验证?

    • 是否可以为Spring Oauth2 Sso服务设置默认登录成功URL? 紧随塞纳里奥 null 有没有一种方法可以不重定向到上一个受保护的请求的资源,而是默认情况下重定向到'index.html'? 请让我知道,即使没有办法实现这一点

    • 在控制台中写入函数:anonymousUser true[ROLE_ANONYMOUS] 并且应该是user1 true[ROLE_USER]user1