启用Spring Social日志记录

4
我有一个Spring MVC应用程序,使用Spring Social Facebook实现Facebook登录。在我的本地机器上运行良好,但目前在我的暂存环境中无法正常工作。我的问题是我无法弄清楚出了什么问题。当我尝试登录时,我被重定向到Facebook以授权该应用程序。这部分运作良好。但是,当我授权该应用程序时,发生的一切就是我被重定向回http://example.com/signin?error=provider#_=_,这会导致404 Not Found错误。
这对于调试错误的来源并不十分有用,并且查看我的Tomcat日志文件时,我找不到任何可以帮助我找到错误的信息。没有堆栈跟踪、错误消息或类似的信息。我已经在项目中启用了log4j,但我没有看到来自Spring Social的任何日志记录。实际上,我不确定如何配置Spring Social的日志记录,但我在我的log4j2.xml文件中尝试了以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>

    <Loggers>
        <Logger name="com.example" level="trace">
            <AppenderRef ref="Console" />
        </Logger>

        <Logger name="org.springframework.social" level="all">
            <AppenderRef ref="Console" />
        </Logger>

        <Logger name="org.springframework.social.facebook" level="all">
            <AppenderRef ref="Console" />
        </Logger>

        <Logger name="org.springframework.social.security" level="all">
            <AppenderRef ref="Console" />
        </Logger>

        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

然而,我在控制台中看不到任何Spring Social日志。如果我像以下这样在我的应用程序中写入日志,日志记录就可以正常工作,所以日志记录应该没问题。
@Controller
public class IndexController {
    private static Logger logger = LogManager.getLogger(IndexController.class);

    @RequestMapping("/")
    public String home() {
        logger.debug("Hello there from logger!");
        return "home";
    }
}

我该如何配置Spring Social的日志记录?我找到了一些配置log4j的示例(例如用于Spring Social测试的一个示例),但除此之外没有其他内容。我认为该库支持此功能,否则我不知道如何调试错误。还有其他方法可以找出触发错误的原因吗?
以下是我的Spring Social配置,尽管我认为在这种情况下它并不重要。
@Configuration
public class SocialConfig {
    @Autowired
    private DataSource dataSource;

    @Autowired
    private TextEncryptor textEncryptor;

    @Autowired
    private AccountService accountService;

    @Autowired
    private AccountRepository accountRepository;

    @Value("${facebook.app.id}")
    private String facebookAppId;

    @Value("${facebook.app.secret}")
    private String facebookAppSecret;

    @Bean
    public ProviderSignInController providerSignInController() {
        ProviderSignInController controller = new ProviderSignInController(this.connectionFactoryLocator(), this.usersConnectionRepository(), new SpringSecuritySignInAdapter(this.accountRepository));
        controller.addSignInInterceptor(new RedirectToPreviousPageInterceptor(controller));

        return controller;
    }

    @Bean
    public ConnectionFactoryRegistry connectionFactoryLocator() {
        ConnectionFactoryRegistry connectionFactoryRegistry = new ConnectionFactoryRegistry();
        List<ConnectionFactory<?>> connectionFactories = new ArrayList<ConnectionFactory<?>>();
        connectionFactories.add(this.facebookConnectionFactory());
        connectionFactoryRegistry.setConnectionFactories(connectionFactories);

        return connectionFactoryRegistry;
    }

    @Bean
    public FacebookConnectionFactory facebookConnectionFactory() {
        FacebookConnectionFactory connectionFactory = new FacebookConnectionFactory(this.facebookAppId, this.facebookAppSecret);
        connectionFactory.setScope("email");

        return connectionFactory;
    }

    @Bean
    public JdbcUsersConnectionRepository usersConnectionRepository() {
        JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(this.dataSource, this.connectionFactoryLocator(), this.textEncryptor);
        repository.setConnectionSignUp(this.accountService);

        return repository;
    }
}

非常感谢您的预先协助。

1个回答

0

经过多次尝试和错误,我终于解决了这个问题。原来我的项目依赖关系不正确,Spring Framework 的日志记录没有通过 slf4j 正确地发送到 log4j。我使用了以下 Maven 依赖项:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.2</version>
</dependency>

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.2</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.2</version>
</dependency>

然后我使用问题中发布的log4j2.xml为Spring Framework启用了日志记录,并在亿万条日志中找到了以下内容:

ERROR org.springframework.social.connect.web.ProviderSignInController - Exception while completing OAuth 2 connection: 
java.lang.IllegalArgumentException: Unable to initialize due to invalid secret key
    at org.springframework.security.crypto.encrypt.CipherUtils.initCipher(CipherUtils.java:110) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.security.crypto.encrypt.AesBytesEncryptor.encrypt(AesBytesEncryptor.java:65) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.security.crypto.encrypt.HexEncodingTextEncryptor.encrypt(HexEncodingTextEncryptor.java:36) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    at org.springframework.social.connect.jdbc.JdbcConnectionRepository.encrypt(JdbcConnectionRepository.java:236) ~[spring-social-core-1.1.0.RELEASE.jar:1.1.0.RELEASE]
    at org.springframework.social.connect.jdbc.JdbcConnectionRepository.addConnection(JdbcConnectionRepository.java:167) ~[spring-social-core-1.1.0.RELEASE.jar:1.1.0.RELEASE]
    at org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository.findUserIdsWithConnection(JdbcUsersConnectionRepository.java:89) ~[spring-social-core-1.1.0.RELEASE.jar:1.1.0.RELEASE]
    at org.springframework.social.connect.web.ProviderSignInController.handleSignIn(ProviderSignInController.java:260) ~[spring-social-web-1.1.0.RELEASE.jar:1.1.0.RELEASE]
    at org.springframework.social.connect.web.ProviderSignInController.oauth2Callback(ProviderSignInController.java:217) [spring-social-web-1.1.0.RELEASE.jar:1.1.0.RELEASE]
    ...
Caused by: java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1034) ~[?:1.8.0_20]
    at javax.crypto.Cipher.implInit(Cipher.java:800) ~[?:1.8.0_20]
    at javax.crypto.Cipher.chooseProvider(Cipher.java:859) ~[?:1.8.0_20]
    at javax.crypto.Cipher.init(Cipher.java:1370) ~[?:1.8.0_20]
    at javax.crypto.Cipher.init(Cipher.java:1301) ~[?:1.8.0_20]
    at org.springframework.security.crypto.encrypt.CipherUtils.initCipher(CipherUtils.java:105) ~[spring-security-core-3.2.5.RELEASE.jar:3.2.5.RELEASE]
    ... 85 more

正如您所看到的,这是因为密钥长度过长造成的,因为默认情况下JDK仅支持128位加密,由于政策原因。为了解决这个问题,我遵循了this SO question中的建议。详细说明在this excellent blog post中。对于OS X,JAVA_HOME位于/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home,因此您需要将文件粘贴到/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home/jre/lib/security。这个问题是因为我在开发机器上使用了一个noOpText文本加密器,当我把应用程序移到暂存环境时,我将应用程序设置为使用一个querable text encryptor。在确保密钥长度不再受限制为128位后,我必须增加userconnection表的accesstoken列的长度为varchar(255)。就是这样!现在它可以正确工作。

我希望这能帮助到处于类似情况的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接