小编tjh*_*s66的帖子

使用AWS IAM或Cognito进行Spring安全性

我编写了几个为RESTful API提供服务的Spring 4后端Web应用程序.我甚至设法通过Spring Web Security来保护它们.

在一种情况下,我们安装了自己的OpenAm实例.转到客户端UI的用户可以登录OpenAM,客户端Web应用程序会在cookie中获取令牌.我们将该标记传递到标头内的后端,然后Spring Security使用CustomeUserDetailsS​​ervice来检查该标记是否对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已经为我做了这个.

在此先感谢您的帮助!

java spring-mvc spring-security amazon-iam

7
推荐指数
1
解决办法
5474
查看次数

Spring 与 Spring Boot 集成 SFTP 示例

我们正在为 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)

java sftp spring-integration

6
推荐指数
1
解决办法
4万
查看次数

LocalDate MySQL 持久性返回之前的日期

我已经在 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)

我的 …

mysql spring hibernate jpa-2.0 java-8

5
推荐指数
1
解决办法
846
查看次数

Java Maven Project作为目录而不是jar出现在另一个项目中

所以,我创建了一个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.

jar maven maven-jar-plugin

4
推荐指数
1
解决办法
2877
查看次数

在春季安全测试中模拟自定义用户

我们正在使用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示例,这意味着我们有一个UserDetailsS​​ervice传递给第三方,传递了令牌,现在我们有了用户名,密码和用户的角色。这通常运行良好。我们确实创建了一个CustomUserDetailsS​​ervice,如下所示:

public class CustomUserDetailsService implements UserDetailsService
{
     @Override
     public UserDetails loadUserByUsername(String accessToken) throws 
       UsernameNotFoundException, …
Run Code Online (Sandbox Code Playgroud)

spring-mvc spring-security junit4

4
推荐指数
1
解决办法
2807
查看次数

Spring 和 MappingJackson2HttpMessageConverter 和 registerModule

我们正在使用最新的 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>\n
Run 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());\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,我想做的是配置“spring-servlet”和“MappingJackson2HttpMessageConverter”,以便我可以添加要注册的模块。

\n\n

是的,我们还没有开始使用@Configuration,我们仍在使用XML,我根本不介意。

\n\n

谢谢你的帮助!

\n

java spring json spring-mvc jackson-modules

3
推荐指数
1
解决办法
4489
查看次数

Java 8 Base64 JWT 令牌转换为 JSON

所以,我在网络上和 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)

java jwt java-8 base64url

3
推荐指数
1
解决办法
5944
查看次数

由 Open API 3 YAML 文件生成的 Spring Boot API RESTful 端点的单元测试

我有一个使用 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

3
推荐指数
1
解决办法
2571
查看次数

JDBC类型的无方言映射:-9与Hibernate 4和SQL Server 2012

我正在使用最新的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)

java sql sql-server jdbc hibernate-mapping

2
推荐指数
1
解决办法
5134
查看次数

JQueryUI selectmenu - 删除所有选项

我从一个安静的网络服务中填充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)

jquery-ui jquery-ui-selectmenu

2
推荐指数
1
解决办法
5852
查看次数