小编Pet*_*ete的帖子

用于内部REST通信的OAuth + spring安全性

建立

我们正在使用Java和Spring开发分布式应用程序,其中我们现有的客户端前端(包括自己的身份验证,数据库,帐户等)使用REST调用来访问我们的新服务器以获取其他服务.我们想用Oauth保护这些资源.

访问权限应受角色或帐户的限制.但是,除了现有帐户之外,我们不希望客户端上的用户担心任何其他身份验证.同时,我们需要为第三方应用程序提供一种方法,以便在对服务器进行某种注册后从外部访问某些资源(这就是我们首先分发的原因).

因此,我们在服务器端设置了spring security,以提供应该用于限制对资源的访问的帐户.该用户应登录客户端上,然后只能够访问这些服务器资源分配给他.我们有一些注册过程,在客户端设置用户以便能够访问服务器服务,因此我认为应该在那里进行任何帐户设置.

所以问题是

如何让客户端获取受保护资源的访问令牌,而无需用户登录其服务器端帐户?

如何在不需要任何用户输入的情况下设置服务器端帐户?

我的想法

这不行

我想我要告诉客户一个在服务器端为该用户创建的新帐户(但是,我将如何选择和传递密码?)或将客户端帐户同步到服务器,以及使用这些凭据来针对服务器对客户端进行身份验证并生成访问令牌.但是这可以节省多少?此外,服务器在其帐户上具有更高的安全性(单向加密,盐渍密码),我真的不想通过使用较少保存的客户端帐户来妥协.

也许这会吗?

也许要走的路是在第一次身份验证期间告诉服务器有关客户端帐户的信息,在服务器端创建一个帐户,在客户端存储生成的令牌,然后针对服务器使用该令牌为每个后续服务器验证客户端请求..?服务器是否能够通过该令牌为每个请求使用其服务器端帐户登录客户端?我需要一个特殊的资源用于初始(2条腿?)握手,只能从客户端服务器访问,对吧?

另外:哪个更适合OAuth 1或2的任务?

我希望有人能理解我的问题并帮助我解决可能的误解和知识差距(我现在正在阅读Oauth和Spring安全文档,所以如果我想出更清晰的图片,那么我会更新该做什么)

谢谢你的帮助!

java rest oauth spring-security oauth-2.0

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

从HTTP GET请求参数生成搜索SQL

我们有一个带有hibernate后端的Java Web应用程序,它提供REST资源.现在,我们面临的任务是实现由get请求中的查询参数控制的通用搜索:

some/rest/resource?name_like=foo&created_on>=2012-09-12&sort_by_asc=something
Run Code Online (Sandbox Code Playgroud)

或类似的.

  • 我们不想预定义所有可能的参数(name,created_on,something)
  • 我们不想分析请求String来获取控制字符(比如> =)
  • 我们也不想实现自己的语法来反映_eq _like _goe等等(作为控制字符的替代或补充)

是否有某种框架可以提供从GET请求参数到数据库查询的映射的帮助?

由于我们知道我们正在获取哪个REST资源,因此我们有实体/表(select).可能还需要预先定义将要执行的JOIN以限制搜索的深度.

但除此之外,我们希望REST消费客户端能够执行任何搜索,而无需预定义某个参数和某个控制序列将如何转换为搜索.


现在我正在尝试在Mysemas QueryDSL上构建一些半自动解决方案.它允许我预定义列和排序列的位置,我正在进行简单的字符串比较,以检测参数中的'_like','_ loe',...等内容,然后激活相应的预定义搜索部分.与SQL字符串没什么不同,只是它的SQL注入证明类型保存.

但是我仍然必须告诉我的搜索对象它应该能够处理查询"寻找名字像'???'的人".现在这没关系,因为我们只在内部使用REST资源并且很好地隔离了实际的搜索创建.如果我们需要进行更多搜索,我们现在可以添加更多预定义.但是,我们是否应该在未来的某个时间公开我们的REST资源,这将不会那么好.


所以我们想知道,必须有一些框架或最佳实践或推荐的解决方案来解决这个问题.我们不是第一个想要这个的人.例如Redmine通过REST接口提供所有资源,我可以随意查询.或Facebook及其Graph API.我敢肯定那些人不只是预定义所有可能性,而是创建了一些通用语法.我们希望尽可能多地节省这些努力并使用可用的解决方案.

就像我说的,我们正在使用Hibernate,因此SQL或HQL解决方案可以很好,或者像QueryDsl这样的实体构建.(还有关于SQL注入的安全问题)

有什么建议?想法?我们自己必须自己做吗?

java sql rest hibernate hql

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

找不到元素“ehcache”的声明

我正在我的 Web 应用程序中实现 url 缓存。我在运行时在 ehcache.xml 文件中有错误。我正在使用 spring 2.5 jar 文件。

缓存文件

<?xml version="1.0" encoding="UTF-8"?>

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"
    monitoring="autodetect" dynamicConfig="true" maxBytesLocalOnHeap="2m"
    maxBytesLocalOffHeap="2m" maxBytesLocalDisk="2m">


    <defaultCache eternal="false" maxElementsInMemory="1000"
        overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />

    <cache name="videoItemsCache" eternal="false"
        maxElementsInMemory="1000" timeToIdleSeconds="1200" timeToLiveSeconds="1200"
        overflowToDisk="false" diskPersistent="false"
        memoryStoreEvictionPolicy="LRU" />

</ehcache>
Run Code Online (Sandbox Code Playgroud)

错误是:

ERROR: VideoClubPortal 27-Sep-2012 11:53 context.ContextLoader Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 6 in XML document from ServletContext resource [/WEB-INF/ehcache.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 31; cvc-elt.1: Cannot find the declaration of element …
Run Code Online (Sandbox Code Playgroud)

java spring ehcache

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

Hibernate忽略扩展类的@Table(name ="...") - 创建的表名都是小写的

我们通过Hibernate自动创建表格,方法是:

@Table(name = "some_table") 
Run Code Online (Sandbox Code Playgroud)

过去常用于"普通"实体.但是当我们有一个抽象基类时:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class PersonBankAccount extends AbstractPersistable<Long> {
Run Code Online (Sandbox Code Playgroud)

延伸的

@Entity
@Table(name = "person_bank_account")
public class PersonBankAccountSimple extends PersonBankAccount {
Run Code Online (Sandbox Code Playgroud)

命名数据库中的结果表

personbankaccount
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

自动发电机说:

table not found: PersonBankAccount 
Run Code Online (Sandbox Code Playgroud)

当他第一次创建并重新运行时,他说:

table found: personbankaccount
Run Code Online (Sandbox Code Playgroud)

就像我说的,对于普通的表格,一切正常.

java entity hibernate jpa

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

我可以删除Hibernate单表继承中的discriminator列吗?

我们对应用程序中的每个表使用单表继承.这允许同一应用程序堆栈的不同实例与相同的DAO一起工作,而它们的实体可能略有不同,可能包含该实例特有的信息.抽象类定义基本表结构,如果该实例需要,扩展定义其他列:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "client")
public abstract class Client extends AbstractPersistable<Long> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

申请A:

@Entity
public class ClientSimple extends Client {
    private String name;
    // getter, setter
}
Run Code Online (Sandbox Code Playgroud)

申请B:

@Entity
public class ClientAdvanced extends Client {
    private String description;
    // getter, setter
}
Run Code Online (Sandbox Code Playgroud)

现在DAO可以处理Client应用程序A和B的对象,但是应用程序B可以为其客户端对象定义其他信息,这些信息可以由应用程序B特有的管理器方法读取:

申请A:

Client client = new ClientSimple();
clientDao.save(client);
Run Code Online (Sandbox Code Playgroud)

申请B:

Client client = new ClientAdvanced();
clientDao.save(client);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这意味着每个表中都有一个DTYPE列(或者我可能选择的任何其他名称).有没有办法摆脱这个?我们不需要它,它正在耗尽数据库空间......

谢谢!


编辑

重要提示:@MappedSuperclass不起作用.我们使用QueryDSL作为我们的HQL抽象层.这需要为类型保存查询自动生成查询类型类.但是,只有在使用注释抽象类时才会正确生成这些@Entity.

这是必要的,因为我们想Client在实际查询ClientSimple应用程序A和 …

java inheritance hibernate single-table-inheritance querydsl

5
推荐指数
2
解决办法
7576
查看次数

Freemarker + Spring MVC教程

我是Spring MVC和Freemarker的新手.到目前为止,我已经使用了JSF,并且我对Ruby on Rails有一些经验(关于RESTful模式......).

我已经配置了我的Spring Web应用程序,现在我已经准备好尝试一些基本的东西,比如表单等等,但我找不到任何有关使用带有freemarker的Spring MVC的教程.由于我既没有使用Spring MVC也没有Freemarker的经验,所以我很遗憾从哪里开始......

我应该先尝试了解freemarker吗?我觉得Spring MVC,来自taglibs的appart,只是为我提供了一种在Spring上下文中设置RESTful MVC应用程序的方法,就是这样......?

感谢有用的链接,甚至更好的一些好书!

java spring freemarker spring-mvc

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

结合DispatcherServlet,ContextLoaderListener和SpringSecurity

我有一个很难解决的问题..试图将所述3种技术整合到我们的webapp中..我们想要使用

  1. Spring Web
  2. Spring MVC作为视图技术(带有freemarker)
  3. Spring Security作为安全层

但无论我配置web.xml和其他上下文文件的哪种方式,我都无法让所有内容同时工作.使用我当前的配置一切都会正常工作,但SpringSecurity不会拦截URL模式

一些谷歌搜索(和公共感觉)告诉我,组合DispatcherServlet和ContextLoaderListener可能是一个问题.

所以这是我的配置.(抱歉这么多文字,感谢阅读):

web.xml中:

<!-- Needed by Spring -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dw-manager-context.xml</param-value>
</context-param>

<!-- Needed by Spring MVC -->
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- Needed by Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

我的servlet-context.xml:

<!-- Scan for controllers -->
<context:component-scan base-package="dw.manager" />

<!-- Need to declare annotation driven transactions again so …
Run Code Online (Sandbox Code Playgroud)

java hibernate servlets spring-mvc spring-security

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

下拉框 - 从Spring MVC模型/上下文到使用freemarker形成

这应该是非常基本的,但我在网上找不到任何关于它的东西,只是我看起来不能装在一起的点点滴滴......

我们正在使用带有freemarker的Spring MVC.现在我想在页面中添加一个表单,允许我从预定义列表中选择一个值(需要在后端访问数据库).

我的控制器:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ModelAndView get(@PathVariable Integer id) {

    // stuff..
    ModelAndView mav = new ModelAndView();

    mav.addObject("targetObject", new TargetObject());
    mav.addObject("options", Arrays.asList("a", "b", "c"));
    mav.setViewName("someview");

    return mav;
}
Run Code Online (Sandbox Code Playgroud)

我发现freemarkers spring支持spring.ftl,似乎我应该使用<@spring.formSingleSelect>我尝试过这样的:

someView.ftl:

<#import "../spring.ftl" as spring />

<form action="somePath" method="POST">
    <@spring.formSingleSelect "targetObject.type", "options", " " />
    <input type="submit" value="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

因此targetObject.type由宏看起来自动绑定.

但是如何让我的选项进入freemarker seequence以便宏可以创建选项?

现在我得到:

Expected collection or sequence. options evaluated instead to freemarker.template.SimpleScalar on line 227, column 20 in spring.ftl.
The …
Run Code Online (Sandbox Code Playgroud)

java spring freemarker spring-mvc

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

可以/应该在spring security中为每个请求刷新OAuth2令牌

我们使用username-password grant将我们的JS客户端连接到我们的REST服务器.在某种程度上,oauth/token返回的令牌是我们的会话,因为它允许在有限的时间内访问后端.

每当我们使用令牌向后端发出请求时,我们都想刷新该会话/令牌.

我知道服务器发出了这个刷新令牌,我可以使用它在令牌过期后刷新令牌.

问题是:我不想让客户端负责捕获令牌过期的异常,并在令牌过期之前重新验证或安排刷新.我希望令牌能够刷新,直到它在有限的时间内不再使用 - 就像会话一样.(我也不希望它发出每个"数据"请求的刷新请求,虽然我想我记得读过,刷新令牌只有一次...?!)

有没有办法在Spring安全性中做到这一点,还是我必须构建一些令牌存储或我选择的任何部分的自定义实现?

因为我无法找到答案(因此是帖子)我在想:也许这样做是不明智的,尽管我不明白为什么.如果我可以窃取令牌,我也可以窃取刷新令牌.所以我想我真的没有看到首先有一个刷新令牌的重点..

编辑

为了回应Luke Taylor的回答,我将澄清我们的用例.

  • 我们有一个REST服务器,可以保存人员等应用程序数据.但也提供访问我们的内容管理,并允许客户发布到Facebook.它封装了应用程序逻辑和数据存储
  • 我们已经有一个完全成熟的客户端应用程序,它有自己的安全层,只是通过客户端凭证流访问我们的REST服务器上的数据.谁可以做客户端决定的事情
  • 我们有几个中小型应用程序,比如facebook上的联系人应用程序,它们也使用客户端凭据访问REST服务器上的数据
  • 我们现在正在开发一个客户端应用程序,只使用javascript访问REST层来完成大客户端应用程序所做的所有工作,但还需要提供一种方法来验证单个用户并允许多租户.因此,此新客户端应用程序使用用户名 - 密码授予进行身份验证,并使用方法级别安全性来授权用户

因此,我们有一个REST服务器,需要提供对我们可信赖的应用程序的完全访问权限,该应用程序执行自己的安全性工作,同一服务器需要为新的多租户javascript客户端应用程序的用户提供访问权限.在生产中,我们将有几个REST服务器,每个服务器都有自己的数据库,但核心总是相同,所以理论上一个服务器应该能够处理所有.

java spring spring-security oauth-2.0 spring-security-oauth2

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

使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

我在 S3 上有很多文件,需要对其进行压缩,然后通过 S3 提供压缩文件。目前,我将它们从流压缩到本地文件,然后再次上传该文件。这会占用大量磁盘空间,因为每个文件大约有 3-10MB,而且我必须压缩多达 100.000 个文件。所以一个 zip 的容量可以超过 1TB。所以我想要一个这样的解决方案:

使用 Lambda Node 从 S3 上的文件在 S3 上创建 zip 文件

这里可以看出,zip 是直接在 S3 上创建的,而不占用本地磁盘空间。但我只是不够聪明,无法将上述解决方案转移到Java中。我还发现有关 java aws sdk 的冲突信息,称他们计划在 2017 年更改流行为。

不确定这是否有帮助,但这就是我到目前为止所做的(Upload是我保存 S3 信息的本地模型)。我刚刚删除了日志记录和其他内容以提高可读性。我认为我不会占用下载空间,将 InputStream 直接“管道”到 zip 中。但就像我说的,我也想避免使用本地 zip 文件并直接在 S3 上创建它。然而,这可能需要使用 S3 作为目标而不是 FileOutputStream 创建 ZipOutputStream。不知道如何做到这一点。

public File zipUploadsToNewTemp(List<Upload> uploads) {
    List<String> names = new ArrayList<>();

    byte[] buffer = new byte[1024];
    File tempZipFile;
    try {
      tempZipFile = File.createTempFile(UUID.randomUUID().toString(), ".zip");
    } catch (Exception e) {
      throw new ApiException(e, …
Run Code Online (Sandbox Code Playgroud)

java amazon-s3 amazon-web-services java-stream aws-sdk

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