我使用OAuth2Authentication Using example from here的对流器将TokenStore存储到MongoDB中
但仍在抱怨
org.springframework.data.mapping.model.MappingInstantiationException:无法使用带有参数的构造函数NO_CONSTRUCTOR实例化org.springframework.security.authentication.usernamePasswordauthenticationToken
应用程序启动时,我会收到这些日志
2019-11-13 12:31:47.191 WARN 18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从接口com.mongodb.DBObject注册到类org.springframework.security.oauth2.provider.OAuth2Authentication作为读取转换器,尽管它不会从商店支持的类型转换!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.197警告18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.LocalDateTime注册到类org.joda.time.LocalDateTime作为读取转换器,尽管它没有。不能从商店支持的类型转换!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.199警告18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.LocalDateTime注册到类org.joda.time.LocalDateTime作为读取转换器,尽管它没有。不能从商店支持的类型转换!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.200 WARN 18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.LocalDateTime注册到类java.time.Instant作为读取转换器,尽管它不会转换从商店支持的类型!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.200警告18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.Instant注册到类java.time.LocalDateTime作为读取转换器,尽管它不会转换从商店支持的类型!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.213警告18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.LocalDateTime注册到类org.joda.time.LocalDateTime作为读取转换器,尽管它没有。不能从商店支持的类型转换!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.213警告18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.LocalDateTime注册到类org.joda.time.LocalDateTime作为读取转换器,尽管它没有。不能从商店支持的类型转换!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.214 WARN 18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.LocalDateTime注册到类java.time.Instant作为读取转换器,尽管它不会转换从商店支持的类型!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.214警告18477 --- [restartedMain] osdata.convert.CustomConversions:将转换器从类java.time.Instant注册到类java.time.LocalDateTime作为读取转换器,尽管它不会转换从商店支持的类型!您可能想在转换器实现中检查注释设置。 2019-11-13 12:31:47.239信息18477 --- [restartedMain] t.g.e.p.uaa.config.MongoDbConfiguration:使用凭据配置mongoTemplate。
OAuth2AuthenticationReadConverter.java
import com.mongodb.DBObject;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.security.authentication.usernamePasswordauthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.OAuth2Request;
import my.package.Users;
@ReadingConverter
public class OAuth2AuthenticationReadConverter implements Converter<DBObject,OAuth2Authentication> {
@Override
@SuppressWarnings("unchecked")
public OAuth2Authentication convert(DBObject source) {
System.out.println(source);
DBObject storedRequest = (DBObject) source.get("storedRequest");
OAuth2Request oAuth2Request = new OAuth2Request((Map<String,String>) storedRequest.get("requestParameters"),(String) storedRequest.get("clientId"),null,true,new HashSet((List) storedRequest.get("scope")),null);
DBObject userauthorization = (DBObject) source.get("userauthentication");
Object principal = getPrincipalObject(userauthorization.get("principal"));
Authentication userauthentication = new usernamePasswordauthenticationToken(principal,(String) userauthorization.get("credentials"),getauthorities((List) userauthorization.get("authorities")));
OAuth2Authentication authentication = new OAuth2Authentication(oAuth2Request,userauthentication);
return authentication;
}
private Object getPrincipalObject(Object principal) {
if (principal instanceof DBObject) {
DBObject principalDBObject = (DBObject) principal;
Users user = new Users(principalDBObject);
return user;
} else {
return principal;
}
}
private Collection<GrantedAuthority> getauthorities(List<Map<String,String>> authorities) {
Set<GrantedAuthority> grantedAuthorities = new HashSet<GrantedAuthority>(authorities.size());
for (Map<String,String> authority : authorities) {
grantedAuthorities.add(new SimpleGrantedAuthority(authority.get("role")));
}
return grantedAuthorities;
}
}
AuthorizacionServerConfiguration.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.Authenticationmanager;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.error.DefaultwebresponseExceptionTranslator; import org.springframework.security.oauth2.provider.error.webresponseExceptionTranslator;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
@Slf4j
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("authenticationmanagerBean")
private Authenticationmanager authenticationmanager;
@Autowired
private CustomTokenStore tokenStore;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private CustomClientDetailsService oauthClientDetailsService;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(oauthClientDetailsService);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationmanager(authenticationmanager).tokenStore(tokenStore)
.exceptionTranslator(loggingExceptionTranslator());
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) {
oauthServer.tokenKeyaccess("permitAll()").checkTokenaccess("isAuthenticated()")
.passwordEncoder(passwordEncoder);
}
@Bean
@Primary
public DefaultTokenServices defaultTokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore);
return defaultTokenServices;
}
@Bean
public webresponseExceptionTranslator<OAuth2Exception> loggingExceptionTranslator() {
return new DefaultwebresponseExceptionTranslator() {
@Override
public ResponseEntity<OAuth2Exception> translate(Exception e) throws Exception {
log.error("Oauth2 Exception: ",e);
// Carry on handling the exception
ResponseEntity<OAuth2Exception> responseEntity = super.translate(e);
HttpHeaders headers = new HttpHeaders();
headers.setall(responseEntity.getHeaders().toSingleValueMap());
OAuth2Exception excBody = responseEntity.getBody();
return new ResponseEntity<>(excBody,headers,responseEntity.getStatusCode());
}
};
} }
MongoDbConfiguration.java
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimplemongoDbFactory;
import org.springframework.data.mongodb.core.convert.CustomConversions;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.util.StringUtils;
import my.package.OAuth2AuthenticationReadConverter;
@Configuration
public class MongoDbConfiguration extends AbstractMongoConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(MongoDbConfiguration.class);
@Autowired
private ApplicationContext applicationContext;
@Value("${mongodb.authentication-database}")
private String mongoauthDBName;
@Value("${mongodb.host}")
private String mongoServer;
@Value("${mongodb.port}")
private int mongoPort;
@Value("${mongodb.database}")
private String mongoDBName;
@Value("${mongodb.username}")
private String mongoDbLogin;
@Value("${mongodb.password}")
private String mongoDbPassword;
@Autowired
private MappingMongoConverter mongoConverter;
@Override
protected String getDatabaseName() {
return mongoDBName;
}
@Bean
public Mongo mongo() throws Exception {
return new Mongo(mongoServer,mongoPort);
}
@Override
@Bean
public MongoTemplate mongoTemplate() throws Exception {
mongoConverter.setCustomConversions(customConversions());
if (!StringUtils.isEmpty(mongoDbLogin)) {
LOG.info("Configuring mongoTemplate with credentials.");
MongoDbFactory mongoDbFactory = new SimplemongoDbFactory(mongoClient(),mongoDBName);
return new MongoTemplate(mongoDbFactory,mongoConverter);
} else {
LOG.info("Configuring mongoTemplate without credentials.");
MongoDbFactory mongoDbFactory = new SimplemongoDbFactory(mongoClient(),mongoConverter);
}
}
@Override
@Bean()
public CustomConversions customConversions() {
List<Converter<?,?>> converterList = new ArrayList<>();
OAuth2AuthenticationReadConverter converter = new OAuth2AuthenticationReadConverter();
converterList.add(converter);
return new CustomConversions(converterList);
}
private String getcontextProperty(final String propertyKey) {
return applicationContext.getEnvironment().getProperty(propertyKey);
}
@Override
public MongoClient mongoClient() {
ServerAddress serverAddress = new ServerAddress(mongoServer,mongoPort);
MongoCredential credential = MongoCredential.createCredential(mongoDbLogin,mongoauthDBName,mongoDbPassword.toCharArray());
MongoClientOptions options = MongoClientOptions.builder()
.writeConcern(WriteConcern.ACKNOWLEDGED)
.build();
return new MongoClient(serverAddress,credential,options);
}
}
有人可以协助吗?