gpt4 book ai didi

java - 无法使用带参数的构造函数 NO_CONSTRUCTOR 实例化 org.springframework.security.authentication.UsernamePasswordAuthenticationToken

转载 作者:可可西里 更新时间:2023-11-01 10:00:34 25 4
gpt4 key购买 nike

我正在使用 MongoDB 编写自己的 TokenStore (org.springframework.security.oauth2.provider.token.TokenStore) 实现。为此,我使用了 the code of Iain Porter .我能够在 mongo 中保留 token 。

我通过 Autowiring 我的自定义 TokenStore 的一个实例来做到这一点,然后我将它传递给端点。因此,我可以毫无问题地登录,但无法从资源服务器的 mongo 存储库中检索 token 。

我的猜测是,将数据库中的对象转换/映射回 Java 对象时存在一些问题,该类是 OAuth2AuthenticationReadConverter不是调用适当的时间。

请有人帮忙完成这项任务。

最佳答案

您需要创建一个转换器并注册它,因为 Spring Mongo 不会为您做这件事。

创建转换器

    package com.erranda.abraham.api.security;

import com.erranda.abraham.entity.Person;
import com.mongodb.DBObject;

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 java.util.*;

/**
* @version 1.0
* @author: Iain Porter
* @since 23/05/2013
*/
//Hackery to deserialize back into an OAuth2Authentication Object made necessary because Spring Mongo can't map clientAuthentication to authorizationRequest
@ReadingConverter
@SuppressWarnings("rawtypes")
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, null, null, 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;
Person user = new Person (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;
}

}

然后您需要在您的 mongodb 配置中注册转换器

package com.erranda.abraham;

import com.erranda.abraham.api.security.OAuth2AuthenticationReadConverter;
import com.mongodb.Mongo;

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.authentication.UserCredentials;
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.repository.config.EnableMongoRepositories;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class MongoDbConfiguration extends AbstractMongoConfiguration {

private static final Logger LOG = LoggerFactory.getLogger(MongoDbConfiguration.class);
private static final String MONGO_DB_SERVER = "mongo.db.server";
private static final String MONGO_DB_PORT = "mongo.db.port";
private static final String MONGO_DB_NAME = "mongo.db.name";
private static final String MONGO_DB_LOGON = "mongo.db.logon";
private static final String MONGO_DB_PASSWORD = "mongo.db.password";
private static final String SPRING_PROFILES_ACTIVE = "spring.profiles.active";

@Autowired
private ApplicationContext applicationContext;

@Value("${" + MONGO_DB_SERVER + "}")
private String mongoServer;
@Value("${" + MONGO_DB_PORT + "}")
private int mongoPort;
@Value("${" + MONGO_DB_NAME + "}")
private String mongoDBName;
@Value("${" + MONGO_DB_LOGON + "}")
private String mongoDbLogin;
@Value("${" + MONGO_DB_PASSWORD + "}")
private String mongoDbPassword;

@Override
protected String getDatabaseName() {
return mongoDBName;
}

@Override
@Bean
public Mongo mongo() throws Exception {
return new Mongo(mongoServer, mongoPort);
}

@Override
@Bean
public MongoTemplate mongoTemplate() throws Exception {
if (!StringUtils.isEmpty(mongoDbLogin)) {
LOG.info("Configuring mongoTemplate with credentials.");
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo(), mongoDBName, new UserCredentials(mongoDbLogin, mongoDbPassword));
return new MongoTemplate(mongoDbFactory, mappingMongoConverter());
} else {
LOG.info("Configuring mongoTemplate without credentials.");
MongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongo(), mongoDBName);
return new MongoTemplate(mongoDbFactory, mappingMongoConverter());
}
}


@Override
@Bean
public CustomConversions customConversions() {
List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>();
OAuth2AuthenticationReadConverter converter = new OAuth2AuthenticationReadConverter();
converterList.add(converter);
return new CustomConversions(converterList);
}



private String getContextProperty(final String propertyKey) {
return applicationContext.getEnvironment().getProperty(propertyKey);
}
}

如果适合您,请不要忘记标记为正确。

基于 https://github.com/iainporter/oauth2-provider

关于java - 无法使用带参数的构造函数 NO_CONSTRUCTOR 实例化 org.springframework.security.authentication.UsernamePasswordAuthenticationToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com