小编Chr*_*ler的帖子

Docker复制并更改所有者

给出以下Dockerfile

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash
Run Code Online (Sandbox Code Playgroud)

在我复制的测试目录中,我已将文件权限设置为770.

如果我su john在容器内部进行操作,则无法访问测试目录中的任何文件或子目录.看来这个问题与aufs文件系统中的所有权有关,其中复制的目录仍由root拥有,权限设置为770.

是否有解决此问题的方法来正确设置权限?可以在复制之前将原始目录的权限设置为容器用户的uid.但这似乎更像是一个黑客.

file-permissions docker dockerfile

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

IntelliJ不会终止使用gradle构建的Spring Boot应用程序

我在Linux上使用IntelliJ 13.1并尝试按照示例http://spring.io/guides/gs/spring-boot/构建基本的REST应用程序

当我从IntelliJ中执行目标bootRun时,集成的tomcat服务器启动并且一切正常.

10:09:35: Executing external task 'bootRun'...
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:bootRun
Run Code Online (Sandbox Code Playgroud)

但是停止执行不会影响gradle任务:

10:11:40: External task execution finished 'bootRun'.
Run Code Online (Sandbox Code Playgroud)

我仍然可以访问配置端口上的tomcat实例.只关闭IntelliJ会破坏该过程.

我搜索了这个主题但找不到任何合理的答案.我想知道它是不是

  • gradle问题(使用gradle包装器版本1.11)
  • Linux问题(Ubuntu 12.04)
  • IntelliJ问题(IDEA 13.1.2)
  • Spring Boot问题(尝试了从1.0.0.RELEASE到1.1.0.M2的不同版本)

java spring intellij-idea gradle spring-boot

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

在OAuth2隐式授权中处理过期的访问令牌

OAuth2的规范规定授权服务器在使用隐式授权时不得发出刷新令牌.在我们的用例中,我们使用OAuth2保护RESTful API,并使用单页Javascript应用程序作为此API的客户端.由于在访问令牌过期后重定向到授权服务器非常困难,我们正在寻找更好的方法来获取新的有效令牌.我可以考虑两种不同的方法,并想知道哪一种可能更好:

  1. 使用隐藏的iframe重新请求有效的访问令牌.为此,必须包含一个参数,例如"prompt = none",它告诉OAuth提供者既不挑战认证,也不显示授权页面.如果用户已通过身份验证并已授权应用程序,则服务器将在URL#parameters中发回访问令牌.如果未满足上述条件之一,它将重定向,并出现错误,如#error = authentication%20lost.通过这种行为,我们可以使用具有隐式流的短期访问令牌.

  2. 我们可以使用一个额外的范围(例如离线)来告诉服务器分发刷新令牌.即使原始规范说隐式流不会发出刷新令牌(如果客户端仅将OAuth用于第一次授权,这是正确的),您可以自由地为您的特定应用程序定义自己的作用域.您应该考虑仅允许来自知名客户端的此范围.

这两种方法都与OpenID Connect非常相似.不幸的是,目前OpenID Connect的实现并不多.因此,第一步是扩展OAuth2服务器,直到OIC更受欢迎.

那么哪种方法应该首选?

编辑:令牌端点需要客户端身份验证,这仅适用于机密客户端,如服务器端应用程序.使用第二种方法,只有在我们的情况下,RESTful API才能使资源提供者刷新令牌并将其发送回客户端.我认为这会带来安全风险.所以我们可能只有一种有效的方法.

restful-authentication single-sign-on oauth-2.0 single-page-application

29
推荐指数
1
解决办法
7984
查看次数

Delphi Rtti:探索接口的属性?

有没有办法用Rtti探索界面的属性?

以下代码不起作用:

procedure ExploreProps;
var
  Ctx: TRttiContext;
  RttiType: TRttiType;
  RttiProp: TRttiProp;
begin
  RttiType := Ctx.GetType(TypeInfo(IMyInterface));
  for RttiProp in RttiType.GetProperties do
    Writeln(RttiProp.ToString);
end;
Run Code Online (Sandbox Code Playgroud)

有没有人解决方法如何正确地做到这一点?

delphi interface rtti

9
推荐指数
1
解决办法
2750
查看次数

Spring Security OAuth2,版本2.0中带有自定义TokenGranter.+

在以前版本的OAuth2中,可以通过将自定义标记granter添加到<authorization-server>元素中的xml配置来添加它.

我想知道如何使用AuthorizationServerConfigurerAdapter使用Java Config扩展授权服务器,而不会丢失包含隐式,客户端凭据,刷新令牌和授权代码授权类型的默认配置.

首次尝试使用@Component创建TokenGranter:

@Component("customTokenGranter")
public class CustomTokenGranter {
     //implementation
}
Run Code Online (Sandbox Code Playgroud)

这导致依赖性解决异常,因为构造Granter所需的tokenServices无法自动装配.

第二次尝试使用configure方法

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception
{
    endpoints
        .tokenGranter(new CustomTokenGranter(endpoints.getTokenServices(),
                endpoints.getClientDetailsService(), endpoints.getOAuth2RequestFactory()));

}
Run Code Online (Sandbox Code Playgroud)

使用此选项,将不会注册默认授权类型.

我也尝试了低阶的第二种配置,但没有成功.我还可以做些什么来添加自定义授权类型?

java spring spring-security-oauth2 spring-java-config

8
推荐指数
3
解决办法
8762
查看次数

Rtti访问复杂数据结构中的字段和属性

正如在Rtti数据处理和Delphi 2010中的一致性中已经讨论的那样,通过使用一对TRttiField和实例指针访问成员,可以达到原始数据和rtti值之间的一致性.对于只有基本成员类型(例如整数或字符串)的简单类,这将非常容易.但是,如果我们有结构化的字段类型呢?

这是一个例子:

TIntArray = array [0..1] of Integer;

TPointArray = array [0..1] of Point;

TExampleClass = class
  private
    FPoint : TPoint;
    FAnotherClass : TAnotherClass;
    FIntArray : TIntArray;
    FPointArray : TPointArray;
  public  
    property Point : TPoint read FPoint write FPoint; 
    //.... and so on
end;
Run Code Online (Sandbox Code Playgroud)

为了方便成员访问,我想构建一个成员节点树,它提供了一个获取和设置值,获取属性,序列化/反序列化值等的接口.

TMemberNode = class
  private
    FMember : TRttiMember;
    FParent : TMemberNode;
    FInstance : Pointer;
  public
    property Value : TValue read GetValue write SetValue; //uses FInstance
end;
Run Code Online (Sandbox Code Playgroud)

所以最重要的是获取/设置值,这是通过使用TRttiField的GetValue和SetValue函数完成的 - 如前所述.

那么FPoint成员的实例是什么?假设Parent是TExample类的Node,其中实例是已知的,成员是一个字段,那么Instance将是:

FInstance := Pointer …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-2010

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

Delphi Rtti用于通用上下文中的接口

对于一个框架,我编写了一个包装器,它接受任何对象,接口或记录类型来探索其属性或字段.类声明如下:

TWrapper<T> = class 
private
  FType : TRttiType;
  FInstance : Pointer;
  {...}
public
  constructor Create (var Data : T);
end;
Run Code Online (Sandbox Code Playgroud)

在构造函数中,我尝试获取进一步处理步骤的类型信息.

constructor TWrapper<T>.Create (var Data : T);
begin
FType := RttiCtx.GetType (TypeInfo (T));
if FType.TypeKind = tkClass then
  FInstance := TObject (Data)
else if FType.TypeKind = tkRecord then
  FInstance := @Data
else if FType.TypeKind = tkInterface then
  begin
  FType := RttiCtx.GetType (TObject (Data).ClassInfo); //<---access violation
  FInstance := TObject (Data);
  end
else
  raise Exception.Create ('Unsupported type');
end;
Run Code Online (Sandbox Code Playgroud)

我想知道这个访问冲突是否是delphi编译器中的错误(我正在使用XE).在进一步调查之后,我写了一个简单的测试函数,它表明,要求类名也会产生这个异常:

procedure TestForm.FormShow (Sender …
Run Code Online (Sandbox Code Playgroud)

delphi generics interface rtti

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

SW-Design:Delphi中的类层次结构适配器(泛型与下行)

我想对以下问题提出一些建议:假设你想为VCL控件编写适配器.所有适配器应具有相同的基类,但在包装特殊控件方面有所不同(例如,从TEdit获取值与从TSpinEdit获取值不同).所以第一个想法就是创建一个类层次结构

TAdapter = class
end;

TEditAdapter = class (TAdapter)
end;

TSpinEditAdapter = class (TAdapter)
end;
Run Code Online (Sandbox Code Playgroud)

现在我想引入一个字段来保存对vcl控件的引用.在我的特殊适配器中,我想 - 当然 - 使用具体的子类.但是Base类还应该包含一个引用(例如,如果我想使用适配器使控件可见).

可能性1(物业存取中的向下):

TAdapter = class
protected
  FCtrl : TControl;
end;

TEditAdapter = class (TAdapter)
  public
    property Control : TEdit read GetControl write Setcontrol;
end;
{...}
function TEditAdapter.GetControl : TEdit;
begin
  Result := FCtrl as TEdit;
end;
Run Code Online (Sandbox Code Playgroud)

因此,如果我实现一个特定的方法,我使用属性Control,如果我在基类中执行某些操作,则使用protected字段.

可能性2(使用通用基类):

TAdapter = class
end;

TAdapter <T : TControl> = class (TAdapter)
protected
  FCtrl : T;
end;

TEditAdapter = class (TAdapter <TEdit>)
end;
Run Code Online (Sandbox Code Playgroud)

您更喜欢哪种解决方案?还是有第三种解决方案,哪种更好? …

delphi generics inheritance software-design downcast

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

变体记录的 Rtti

我尝试用 Delphi 2010 编写一种对象/记录序列化器,想知道是否有办法检测记录是否是变体记录。例如 Types.pas 中定义的 TRect 记录:

TRect = record
case Integer of
  0: (Left, Top, Right, Bottom: Longint);
  1: (TopLeft, BottomRight: TPoint);
end; 
Run Code Online (Sandbox Code Playgroud)

由于我的序列化程序应该在我的数据结构上递归工作,因此它将下降到 TPoint 记录并在我的序列化文件中生成冗余信息。有没有办法通过获取记录中的详细信息来避免这种情况?

delphi serialization records rtti delphi-2010

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

如何在Delphi 2010中使用RTTI设置任意类型的事件处理程序?

阅读帖子后如何通过新的RTTI设置事件处理程序?,我想知道是否有可能更动态地解决这个问题.例如,我想将任何组件的ALL事件处理程序设置为nil.

使用TValue.From <TNotifyEvent> (SomeMethod)不起作用有两个原因:1.类型未知(可能是TNotifyEvent,TMouseEvent等)2.我不能将'SomeMethod'设置为nil(无效转换)

在旧的RTTI风格中,我会做类似的事情:

var
  NilMethod: TMethod;
begin
[...]
NilMethod.Data := nil;
NilMethod.Code := nil;
SetMethodProp (AComponent,PropertyName,NilMethod);
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-2010

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