DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
Ignite provides a few options to set custom attributes on client side - : per call (ServiceCallContext) or and per connection (UserAttributes). But Now there is no opportunity to specify set attributes on the "application level". Scenario is:
application attributes - an associative array of Strings specified on an application sideApplication need specify ApplicationAttributes. Business logic might depend on such attributes - application language, application name for audit, etc ([2], [4]).It's proposed to provide such the opportunity to set attributes for application. Then there will be hierarchy of attributes:
ServiceCallContextApplicationAttributesUserAttributes, SecuritySubjectUser defined functions might want The access to different level of attributes. For example, SecuritySubject can be used to provide fine-grained access control to cache data. For example, CacheInterceptor saves the subject id it the attributes must be provided for functions that are pre-created on Ignite cluster and aren't deployed by specific application. Examples:
CacheInterceptor saves the SecuritySubject along with data and it can be used for fine-grained access control in QuerySqlFunction.Service extracts attribute from ServiceCallContext and, if absent, get default one from ApplicationAttributes.It. Then it's proposed to introduce SessionContext API that is available from the functions and provides access to all this the attributes while processing data in hierarchical orderin all levels (call, application, connection).
Requirements:
Ignite, IgniteClient, JDBC).QuerySqlFunctionCacheInterceptorServiceComputeTask, ComputeJobAttributes API that aren't part of the IEP:
ClientListenerConnectionContext#attributes - it's actually how client stores UserAttribute in connection context.ComputeTaskSession#setAttribute - this mechanism is available only within Compute API. It allows attributes to be changed during task lifetime, use-case is different - send sync/async notifications between jobs about events happened during task lifetime....
#setClientInfo is arbitrary. The documentation recommends strictly limiting the set of attributes, but this is not necessary. For example, Oracle does not have such a limitation [5]. The setClientInfo array is completely translated into the getClientAttributes array ApplicationAttributes array.setClientInfo are passed along with each JdbcRequest (this requires a new feature in JdbcThinFeature)....
Ignite provides SessionContextProviderResource to access to SessionContext. Provider instead of direct instance of the context is used for optimization. Injecting instance
CacheInterceptor or QuerySqlFunction target class ...
...
QuerySqlFunction to inject the resource.| Code Block | ||
|---|---|---|
| ||
/** SessionContext interface. It's an entrypoint for all attributes. */
public class SessionContext {
/** @return Attribute by name. */
public @Nullable String getAttribute(String attrName);
/** @return Current SecuritySubject. */
public @Nullable SecuritySubject getSecuritySubject();
}
/** Example, use it in QuerySqlFunction. */
public static class UserDefinedFunctions {
/** */
@SessionContextProviderResource
public SessionContextProvider sesCtxProv;
/** @return Session ID set with application attributes. */
@QuerySqlFunction
public @Nullable String sessionId() {
SessionContext sesCtx = sesCtxProv.getSessionContext();
return sesCtx == null ? null : sesCtx.getAttribute("SESSION_ID");
}
}
|
...