使用SpringSocialConfigure时如何更改SocialAuthenticationFilter.FilterProcessURL?
Spring Social使用SpringSocialConfigure时如何更改SocialAuthenticationFilter.FilterProcessURL?,spring,spring-security,spring-social,spring-social-facebook,Spring,Spring Security,Spring Social,Spring Social Facebook,Spring SocialSocialAuthenticationFilter处理url/auth。如何更改此url? 有一个方法SocialAuthenticationFilter.setFilterProcessURL(String FilterProcessURL)。如何访问SocialAuthenticationFilter对象以使用此方法?(我使用springsocialconfigure,它会自动将SocialAuthenticationFilter添加到链中。)不幸的是,使用原始s
SocialAuthenticationFilter
处理url/auth
。如何更改此url?有一个方法
SocialAuthenticationFilter.setFilterProcessURL(String FilterProcessURL)
。如何访问SocialAuthenticationFilter
对象以使用此方法?(我使用springsocialconfigure
,它会自动将SocialAuthenticationFilter
添加到链中。)不幸的是,使用原始springsocialconfigure
无法设置已处理的url。查看代码,您可以“仅”流畅地配置诸如postLoginUrl
,postFailureUrl
,signupUrl
,ConnectionAddedDirectUrl
,defaultFailureUrl
和始终使用postFailureUrl
我想这是springsocialconfigure
中的一个遗漏,您可能希望在上提交一个问题
目前,只需使用SpringSocialConfigure
中的代码,并创建您自己的(小型)类。根据用户“Hille”的建议,我现在通过以下操作创建了自己的SpringSocialConfigure
:
a) 通过github()我复制了源代码并将其粘贴到我的自定义类中。b) 然后我可以设置
过滤器进程URL
——下面是一个示例:
public class MySpringSocialConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
@Override
public void configure(HttpSecurity http) throws Exception {
ApplicationContext applicationContext = http.getSharedObject(ApplicationContext.class);
UserIdSource userIdSource = getDependency(applicationContext, UserIdSource.class);
UsersConnectionRepository usersConnectionRepository = getDependency(applicationContext, UsersConnectionRepository.class);
SocialAuthenticationServiceLocator authServiceLocator = getDependency(applicationContext, SocialAuthenticationServiceLocator.class);
SocialUserDetailsService socialUsersDetailsService = getDependency(applicationContext, SocialUserDetailsService.class);
SocialAuthenticationFilter filter = new SocialAuthenticationFilter(
http.getSharedObject(AuthenticationManager.class),
userIdSource,
usersConnectionRepository,
authServiceLocator);
...
filter.setFilterProcessesUrl("/mysociallogin");
...
http.authenticationProvider(
new SocialAuthenticationProvider(usersConnectionRepository, socialUsersDetailsService))
.addFilterBefore(postProcess(filter), AbstractPreAuthenticatedProcessingFilter.class);
}
private <T> T getDependency(ApplicationContext applicationContext, Class<T> dependencyType) {
try {
T dependency = applicationContext.getBean(dependencyType);
return dependency;
} catch (NoSuchBeanDefinitionException e) {
throw new IllegalStateException("SpringSocialConfigurer depends on " + dependencyType.getName() +". No single bean of that type found in application context.", e);
}
}
}
公共类MySpringSocialConfigure扩展了SecurityConfigureAdapter{
@凌驾
public void configure(HttpSecurity http)引发异常{
ApplicationContext ApplicationContext=http.getSharedObject(ApplicationContext.class);
UserIdSource UserIdSource=getDependency(applicationContext,UserIdSource.class);
UsersConnectionRepository UsersConnectionRepository=getDependency(applicationContext,UsersConnectionRepository.class);
SocialAuthenticationServiceLocator authServiceLocator=getDependency(applicationContext,SocialAuthenticationServiceLocator.class);
SocialUserDetailsService socialUsersDetailsService=getDependency(applicationContext,SocialUserDetailsService.class);
SocialAuthenticationFilter=新的SocialAuthenticationFilter(
http.getSharedObject(AuthenticationManager.class),
userIdSource,
usersConnectionRepository,
authServiceLocator);
...
setFilterProcessesUrl(“/mysociallogin”);
...
http.authenticationProvider(
新的SocialAuthenticationProvider(用户连接存储库,socialUsersDetailsService))
.addFilterBefore(后处理(filter),AbstractPreAuthenticatedProcessingFilter.class);
}
私有T getDependency(ApplicationContext ApplicationContext,类dependencyType){
试一试{
T dependency=applicationContext.getBean(dependencyType);
返回依赖;
}捕获(无此项定义异常e){
抛出新的IllegalStateException(“SpringSocialConfigure依赖于”+dependencyType.getName()+”。在应用程序上下文中找不到该类型的单个bean。”,e);
}
}
}
谢谢-是的,通过创建自定义的配置器
可以对其进行设置。我已经在另外一个答案中发布了我的结果解决方案。我还在github-上提交了一个问题。您可能希望将代码编写得更“有弹性”,并继续使用现有的fluent方法,即添加if(filterProcessUrl!=null){filter.setfilterProcessUrl(filterProcessUrl);}
加上一个额外的setter,如public MySpringSocialConfigurer filterProcessUrl(字符串filterProcessUrl)
,其代码类似于userIdSource(userIdSource userIdSource)
。