我编写了几个为RESTful API提供服务的Spring 4后端Web应用程序.我甚至设法通过Spring Web Security来保护它们.
在一种情况下,我们安装了自己的OpenAm实例.转到客户端UI的用户可以登录OpenAM,客户端Web应用程序会在cookie中获取令牌.我们将该标记传递到标头内的后端,然后Spring Security使用CustomeUserDetailsService来检查该标记是否对OpenAM有效.如果是这样,我们在Spring Security Context中创建一个User,分配角色,然后我们看看这些角色是否对API有效.如果是,则执行API,否则,用户将获得401安全错误.我相信这是OAuth2.
我们还设法与Okta做同样的事情.我们拥有自己的客户端Web UI和我们自己的登录页面.用户界面调用Okta并获得两(2)个令牌.我们连接这些令牌并将其传递给后端,后端执行我们上面描述的相同过程.我也认为这是Oauth2.
我现在正在开发一个新项目,这次我想用AWS IAM保护我的web应用程序,因为前端和后端将托管在AWS EC2实例上.
我一直在网上搜索确切知道如何做到这一点.有一个AWS IAM SDK,还有AWS Cognito.我对IAM的初步调查没有显示出Oauth2,我看到了OpenID和SAML.我知道我对OpenID与Oauth2和SAML缺乏了解.
所以,我正在寻找任何代码库,示例代码或文档的链接,这些链接将帮助我使用AWS IAM和/或Cognito通过Spring Security保护我的后端API.顺便说一下,我不想使用Spring API网关,因为Spring Web Security已经为我做了这个.
在此先感谢您的帮助!
我们正在为 Spring 应用程序使用最新的 Spring Boot,并为 SFTP 使用最新的 Spring Integration。我访问过 Spring Integration SFTP 文档站点,并按原样采用了 Spring Boot 配置:
@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost("localhost");
factory.setPort(port);
factory.setUser("foo");
factory.setPassword("foo");
factory.setAllowUnknownKeys(true);
return new CachingSessionFactory<LsEntry>(factory);
}
@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
fileSynchronizer.setDeleteRemoteFiles(false);
fileSynchronizer.setRemoteDirectory("/");
fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.xml"));
return fileSynchronizer;
}
@Bean
@InboundChannelAdapter(channel = "sftpChannel")
public MessageSource<File> sftpMessageSource() {
SftpInboundFileSynchronizingMessageSource source =
new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
source.setLocalDirectory(new File("ftp-inbound"));
source.setAutoCreateLocalDirectory(true);
source.setLocalFilter(new AcceptOnceFileListFilter<File>());
return source;
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() …Run Code Online (Sandbox Code Playgroud) 我已经在 StackOverflow 上多次看到这个问题,而且大多数情况下都是使用 Spring Boot 配置的 Spring Boot 应用程序。我已按照所有步骤进行操作,但仍然存在此问题。如果我不能很快解决这个问题,我将不得不回到旧的 java.util.Date 以便将我的数据保存到数据库中......至少它没有问题。所以,我有一个 Spring 5.1.2.Release 应用程序,带有 Hibernate 5.4.0.Final、hibernate-java8 依赖项和最新的 MySQL Connector 8.0.13。
我从以前的帖子和网络上的其他文章中了解到,如果数据库设置为 UTC,但应用程序在另一个时区运行,在我的情况下为 EST 的 GMT-5,那么这个问题可能会弹出。
所以,这里是技术细节:我的 MySQL 连接看起来像:
hibernate.connection.url=jdbc:mysql://localhost:3306/my_db?
serverTimezone=UTC&useLegacyDatetimeCode=false&useTimezone=true
Run Code Online (Sandbox Code Playgroud)
连接字符串,在 applicationContext.xml 中使用:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${hibernate.connection.driver.class}</value>
</property>
<property name="url">
<value>${hibernate.connection.url}</value>
</property>
<property name="username">
<value>${hibernate.connection.username}</value>
</property>
<property name="password">
<value>${hibernate.connection.password}</value>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
我的 applicationContext.xml 中的 Hibernate 属性如下所示:
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">${hibernate.cglib.use_reflection_optimizer}</prop>
<prop key="useUnicode">true</prop>
<prop key="useLegacyDatetimeCode">false</prop>
<prop key="serverTimezone">UTC</prop>
<prop key="useTimezone">true</prop>
<prop key="hibernate.jdbc.time_zone">UTC</prop>
</props>
</property>
Run Code Online (Sandbox Code Playgroud)
我的 …
所以,我创建了一个Spring Maven项目,一个Dao项目,它很棒.所有代码都在正确的位置,所有单元测试都运行,我可以进行mvn clean安装.我可以在目标目录中看到有一个构建jar,其中的所有内容看起来都很好.我还可以确认,当我检查我的本地.m2 /存储库时,我刚刚构建的最新jar就在那里.
这是pom.xml的一小部分:
<modelVersion>4.0.0</modelVersion>
<groupId>com.tom.myproject</groupId>
<artifactId>myproject-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>My Project DAO</name>
Run Code Online (Sandbox Code Playgroud)
现在,我正在为我的UI创建一个新的Spring Maven Web项目,这个pom.xml开始如下:
<modelVersion>4.0.0</modelVersion>
<version>0.0.1-SNAPSHOT</version>
<groupId>com.tom.myproject</groupId>
<artifactId>myproject-ws</artifactId>
<name>My Web Project</name>
<packaging>war</packaging>
Run Code Online (Sandbox Code Playgroud)
同样在这个pom.xml文件中,我拥有的第一个依赖项之一是:
<!-- My DAO ProjectDependencies -->
<dependency>
<groupId>com.tom.myproject</groupId>
<artifactId>myproject-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我可以在eclipse中看到,当我尝试从这个dao jar访问类时,这似乎工作正常.当我在这里编译代码时,一切正常.当我做一个"mvn clean install"来构建这个战争时,我可以看到目标目录,所有需要的类和jar都进来了,显然在WEB-INF中有hibernate,logging和spring类./lib目录.
现在这是问题所在的部分...为什么myproject-dao在WEB-INF/lib下显示为WEB-INF/lib/myproject-dao-0.0.1-SNAPSHOT.jar但显示为目录,而不是一个罐子?
当然,当我拉入其他罐子时,它们只是.jar文件而不是目录.
我应该补充一点,当您在maven依赖项下查看Eclipse项目时,所有其他jar的图标将它们显示为文件.myproject-dao.jar的图标使用文件夹/目录的图标,因此显然正在创建名为"myproject-dao.jar"的目录,而不是将内容压缩到jar文件中的文件.
当我构建war文件并部署war时,应用程序说它找不到myproject-dao.jar目录中的任何类.我必须从WEB-INF/lib目录中删除FOLDER"myproject-dao.jar"并手动复制FILE"myproject-dao.jar".然后我可以清楚地看到图标,这意味着这确实是一个文件.
这可能是一个简单的修复,所以如果你可以帮助我,那将是很好的.
回答:
我没有使用maven-assembly-plugin.但是,我确实发现了问题所在.
我的DAO项目和WEB项目都在同一个工作区中,DAO项目是打开的,因此,Eclipse中显示的maven依赖项是一个文件夹图标,而不是jar图标.当我关闭DAO项目并回顾WEB项目pom.xml文件中的maven依赖项时......现在它将图标显示为jar而不是文件夹.
所以,我必须用maven构建我的dao.jar文件,当它成功时,就完成了.然后我必须在Eclipse中关闭项目.在我的web项目pom.xml文件中,该图标现在将其显示为jar文件,并且在构建时,它将拉入jar.
我想这是一个好处,如果一个人正在处理几个先前的项目,你真的有机会在战争运行时查看jar文件中的内容.
在我的情况下,我知道我的dao.jar正在工作,所以我可以构建它,关闭项目,然后在我需要的地方使用那个jar.
我们正在使用Spring 4.3.9.RELEASE和Spring Security 4.2.3.RELEASE,所以这些是我们已经看到的一些最新版本。我们有一个RESTful(spring-mvc)后端,我们在这里使用Spring Web Security来对API进行基于角色的访问。
我们有一个看起来像这样的控制器:
@RequestMapping(value = "/create", method = RequestMethod.POST, produces = "application/json", headers = "content-type=application/json")
public @ResponseBody MyObjectEntity createMyObject(@RequestBody MyObjectEntity myObj) throws MyObjectException
{
UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
CustomUser user = null;
if (userDetails instanceof CustomUser)
{
user = ((CustomUser) userDetails);
}
String email = user.getEmail();
MyObjectEntity myObj = MyObjectService.createMyObject(myObj, email);
if (SecurityContextHolder.getContext().getAuthentication() != null)
{
SecurityContextHolder.getContext().setAuthentication(null);
}
return myObj;
}
Run Code Online (Sandbox Code Playgroud)
我们知道用户已经使用用户名和密码从网站登录。我们知道用户界面有一个令牌,并且令牌在标头中传递。我们的安全性使用SiteMinder示例,这意味着我们有一个UserDetailsService传递给第三方,传递了令牌,现在我们有了用户名,密码和用户的角色。这通常运行良好。我们确实创建了一个CustomUserDetailsService,如下所示:
public class CustomUserDetailsService implements UserDetailsService
{
@Override
public UserDetails loadUserByUsername(String accessToken) throws
UsernameNotFoundException, …Run Code Online (Sandbox Code Playgroud) 我们正在使用最新的 Spring 4.2.x,最近从 Jackson Mapper 2.6.3 升级到 2.8.8,现在我们正在注册模块。
\n\n这是 spring-servlet.xml 的一部分:
\n\n<mvc:annotation-driven>\n <mvc:message-converters register-defaults="true">\n <bean\n class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">\n <property name="objectMapper">\n <bean class="com.fasterxml.jackson.databind.ObjectMapper">\n <property name="dateFormat">\n <bean class="java.text.SimpleDateFormat">\n <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>\n </bean>\n </property>\n </bean>\n </property>\n </bean>\n </mvc:message-converters>\n</mvc:annotation-driven>\nRun Code Online (Sandbox Code Playgroud)\n\n这是我们在代码中映射 json 文件的内容:
\n\n\xe2\x80\x82 ObjectMapper mapper = new ObjectMapper();\n mapper.registerModule(new ParameterNamesModule());\n mapper.registerModule(new Jdk8Module());\n mapper.registerModule(new JavaTimeModule());\nRun Code Online (Sandbox Code Playgroud)\n\n因此,我想做的是配置“spring-servlet”和“MappingJackson2HttpMessageConverter”,以便我可以添加要注册的模块。
\n\n是的,我们还没有开始使用@Configuration,我们仍在使用XML,我根本不介意。
\n\n谢谢你的帮助!
\n所以,我在网络上和 StackOverflow 上对此做了一些研究,我尝试了很多,我发现的多种建议。问题是我正在登录我们运行良好的 Oauth2 服务之一。我得到了一个 Oath2 JWT 令牌。我知道这是 Base64 编码的,我可以将令牌放入 jwt.io 和 www.base64decode.org,这两个站点都可以正确解析令牌。
我使用的是 Java 8 Base64 工具,代码如下所示:
public String getTokenProperty(String token, String propertyName)
{
byte[] bytes = Base64.getUrlDecoder().decode(token);
String decodedString = new String(bytes, StandardCharsets.UTF_8);
System.out.println("Decoded: " + decodedString);
return (new JSONObject(decodedString)).getString(propertyName);
}
Run Code Online (Sandbox Code Playgroud)
错误发生在解码器线上,如下所示:
java.lang.IllegalArgumentException: Illegal base64 character 2e
Run Code Online (Sandbox Code Playgroud)
我用来自 Oauth2 服务的令牌尝试了这个,我从 Syncope 得到了一个令牌,我从 Auth0 得到了一个令牌......都返回了 JWT Base64 编码的令牌。使用来自这些不同服务器的所有这些令牌,我得到了同样的错误。
我想使用标准的 Java 8 Base64,但我想我可能需要使用外部第三方 Base64 解码器。
任何帮助都会很棒。谢谢!
令牌如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik1qSTRRVFEwT1VRNU9VSXlSVEV6TlRBd05UVXpSVVExTlVOR05FVkVORGRDTlRnM016VXdRZyJ9.eyJodHRwczovL2JpdG9vbXRyYWRlci5uZXQvYXV0aG9yaXphdGlvbiI6eyJncm91cHMiOlsiQ29uc3VtZXJzIl0sInJvbGVzIjpbIlVzZXIiXX0sImlzcyI6Imh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vIiwic3ViIjoiYXV0aDB8NWNhNTE5NzZjYzMzZjUxMTBhYWNkYmM0IiwiYXVkIjpbImh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vYXBpL3YyLyIsImh0dHBzOi8vYml0em9vbS5hdXRoMC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNTU5MzIzNDI1LCJleHAiOjE1NTk0MDk4MjUsImF6cCI6IlliRGFSelRVQkFtZEFrSExqdjZ0bEI3U05xSTF1RlNtIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBhZGRyZXNzIHBob25lIHJlYWQ6Y3VycmVudF91c2VyIHVwZGF0ZTpjdXJyZW50X3VzZXJfbWV0YWRhdGEgZGVsZXRlOmN1cnJlbnRfdXNlcl9tZXRhZGF0YSBjcmVhdGU6Y3VycmVudF91c2VyX21ldGFkYXRhIGNyZWF0ZTpjdXJyZW50X3VzZXJfZGV2aWNlX2NyZWRlbnRpYWxzIGRlbGV0ZTpjdXJyZW50X3VzZXJfZGV2aWNlX2NyZWRlbnRpYWxzIHVwZGF0ZTpjdXJyZW50X3VzZXJfaWRlbnRpdGllcyIsImd0eSI6InBhc3N3b3JkIn0.St7097L1ZAlBWcAPrie-8CGV2F3Fr8uNYpSDVKSPVPF4zBZrmm62_UAj7Ssux8AjUy0LhjiF3kLpNph2L7yrpUREw6TyGJwQasfdVtM5VzRYUcy-fOGyRSqPQorbzxJQZzs2pyDJm-2hMQ0McJ37ubKIWrHFD5McMedN6THK7g5TExX47XCRPcOuCEWm3bf3zdWF2LEGhCw_c-lcZDwlb4ePkO721XjSWtrXEBvxc8scFNaHDt7VOnrSze4XK_LO8eE8bHRq6qUrWf1csYucK--aHazBsvfdl-6QDRk-tOBM-LdXJMT7H8Ih6trxVmZofQjr2dQ4j_3DTVoU3eLdog
Run Code Online (Sandbox Code Playgroud)
更新:
我从 java,util.Base64 切换到 org.apache.commons.codec.binary.Base64 并且这似乎有点工作,我现在没有收到错误。
String decodedString = new String(bytes, StandardCharsets.UTF_8); …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Spring Boot(最新版本)并创建一个具有 RESTful api 的后端的应用程序。传统上,我创建了如下控制器:
@RestController
@RequestMapping("/contacts")
public class ContactController {
@Autowired
private ContactService service;
@RequestMapping(value = "/contactId/{contactId}",
method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody ContactEntity getContactById(@PathVariable("contactId") long contactId) {
ContactEntity contactEntity = service.getContactById(contactId);
return contactEntity;
}
Run Code Online (Sandbox Code Playgroud)
集成测试一直是这样的:
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = ServiceContextConfiguration.class)
@ComponentScan("com.tomholmes.springboot.phonebook.server")
@Transactional
@WebAppConfiguration
public class ContactControllerTest {
@Test
public void testGetContactById() throws Exception {
MockHttpServletRequestBuilder requestBuilder =
MockMvcRequestBuilders.get(BASE_URL + "/contactId/6");
this.mockMvc.perform(requestBuilder)
.andDo(print())
.andExpect(status().isOk());
}
}
Run Code Online (Sandbox Code Playgroud)
多年来,它一直作为“代码优先”API 正常工作。现在,我正在使用 OpenAPI 3 和 YAML 文件处理合约优先的 API。API 是在与以前相同的位置生成的,我希望测试能够像以前一样工作,但事实并非如此。
因此,一项资源:
[https://www.hascode.com/2018/08/testing-openapi-swagger-schema-compliance-with-java-junit-and-assertj-swagger/#API_Test]建议我使用assertj …
junit spring-boot junit-jupiter openapi-generator springdoc-openapi-ui
我正在使用最新的Hibernate 4.2.7.SP1以及实体管理器和验证器等.我使用的是Microsoft SQL Server 2012.
我试图使用的代码是:
StringBuffer sb = new StringBuffer();
sb.append("SELECT vr.account_name as account FROM MY_VIEW_RECEIVABLES vr;");
String sql = sb.toString();
System.out.println("MyInvoiceDAO: getInvoices: SQL=" + sql);
SQLQuery q = this.sessionFactory.getCurrentSession().createSQLQuery(sql);
q.addScalar("account");
q.setResultTransformer(Transformers.aliasToBean(InvoiceDTO.class));
List results = q.list();
Run Code Online (Sandbox Code Playgroud)
仅供参考:MY_VIEW_RECEIVABLES是一个视图,"account_name"字段是一个NVARCHAR(120)
我得到的问题是:
org.springframework.orm.hibernate4.HibernateSystemException:没有JDBC类型的Dialect映射:-9; 嵌套异常是org.hibernate.MappingException:没有JDBC类型的Dialect映射:-9
at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:185)
正如我的搜索,我得到它,方言无法确定数据类型,因此我必须添加标量映射...但是我尝试通过添加:
q.addScalar("account");
Run Code Online (Sandbox Code Playgroud)
但那没用.
几个解决方案表明我应该创建一个类,如:
public class SQLServerNativeDialect extends SQLServerDialect
{
public SQLServerNativeDialect()
{
super();
registerColumnType(Types.VARCHAR, "nvarchar($l)");
registerColumnType(Types.CLOB, "nvarchar(max)");
}
public String getTypeName(int code, int length, int precision, int scale) throws HibernateException
{
if (code != 2005)
{ …Run Code Online (Sandbox Code Playgroud) 我从一个安静的网络服务中填充jquery-ui没有问题.
// get data from web-service
var subjectResponse = data.SiteSubjectResponse;
// The jquery-UI selectmenu
var $subjectOptions = $('#subjectOptions');
for(var i = 0; i < subjectResponse.length; i++)
{
// Build the Option
var $option = $('<option/>');
var subjectName = subjectResponse[i].name;
var subjectId = subjectResponse[i].id;
$option.text(subjectName).val(subjectId);
$subjectOptions.append($option);
}
// set the default item to the first item
$('#subjectOptions').val(subjectResponse[0].clinicalTrialSubjectId);
// refresh jquery-ui selectmenu
$('#subjectOptions').selectmenu('refresh', true);
Run Code Online (Sandbox Code Playgroud)
问题是我想要删除此选择菜单中的所有先前项目,因此我知道使用标准jquery这是常用的.
// clear all options first, if any are there, used to work
$('#subjectOptions').find('option').remove().end();
Run Code Online (Sandbox Code Playgroud)
我看到这个解决方案也列在StackOverflow上,但它似乎也没有用.
$("#subjectOptions option").each(function(index, option) …Run Code Online (Sandbox Code Playgroud)