我正在寻找一种最佳实践和有效的解决方案来保护多个微服务,通过REST与Web客户端应用程序进行通信.
目前的设置:
这些微服务是用Java构建的,使用Spring Framework并运行到Docker容器中.
客户端是Angular 2应用程序.
我创建了一个新的μService,它将充当" 网关 ",并且是我的Web客户端和我的其他服务之间的唯一通信点.
我从远程身份验证API检索JWT加密令牌(让我们称之为LOCK)
我正在考虑的解决方案:
我可以将登录JWT存储到cookie中,然后将其发送到网关.
网关嵌入最终有效负载,发送给相关的μService令牌,并将用户存储在数据库中.
然后,微服务获取查询,在远程认证服务中检查用户角色,如果足够,则返回结果为200的状态.
编辑
我们需要在我们的μServices配置单元中安装RabbitMQ Broker,从而使用WebSockets.为了以与保护REST API相同的方式保护WebSockets,我不确定我们是否仍应该在网关中管理安全性,并且可能自己在微服务级别管理它.因为很多消息都会传输,我们应该摆脱一个会减慢速度的中间件.
问题:
这是一个好习惯吗?什么可以做得更好?你有没有做过满足同样需求的事情的例子?非常感谢您的分享和想法.
我的目标是在Android 6.0上测试VoLTE(Voice-over-LTE)设置,为此我必须使用CarrierConfig和TelephonyManager API.
这些API需要运营商身份验证级别,这意味着:使用授权到UICC的ACL(访问控制列表)中的一个签名应用程序(也称为临时用户的SIM卡,但实际上,SIM存储在UICC中).
我已经读过AVD Manager拥有它自己的模拟UICC,我可以在虚拟设备中看到一些SIM信息.我需要能够:
第二种选择似乎更容易,但在这两种情况下我都找不到好的信息.
非常感谢你对这个问题的启示!
编辑:
我也找到了这个主题:https://android.stackexchange.com/questions/111928/how-to-change-original-unchangeable-iccid-sim-card-serial-from-an-avd但它基本上导致了一个博客我之前已经检查过(更改SIM序列号,IMEI和IMSI),AVDManager源代码不再可用.
我对这些技术相当陌生,我需要一个推销来理解做事的好方法。我有一个 Employee 实体,我想通过对端点进行 GET 查询来列出它们。在对字段应用过滤器后,我必须返回一个员工页面。目前,GET 查询上的 Pageable 有效,但我的过滤器无效。
这是我的 REST 端点:
@RequestMapping(value = "/employees",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
@Transactional(readOnly = true)
public ResponseEntity<List<EmployeeDTO>> getAllEmployees(Pageable pageable, String filters) throws URISyntaxException, JSONException {
JSONObject sfilters = null;
try {
sfilters = new JSONObject(filters.trim());
} catch (JSONException e) {
e.printStackTrace();
}
// I wish this on could works, but still have to update it if we add fields to our Employee entity
Page<Employee> page = employeeRepository.findAllByCompanyIdAndFirstnameLikeAndLastnameLike(
userService.getUserWithAuthorities().getCompany().getId(),
sfilters.get("firstname").toString(),
sfilters.get("lastname").toString(),
pageable); …Run Code Online (Sandbox Code Playgroud) 我正在使用 Redux 和 RxJS Angular (4) 实现来将状态和操作反应性地管理到我的应用程序中。
我正在监听一个事件(产品列表中所选产品 ID 的更改),因此我们将其称为selectedProductId$.
当相关的发射器发出一个新的 selectedId 值时,我想从这个 Observable 值中执行 a 操作switchMap,以及从其他两个 Observables 中发出的最新值(比如说;productDetails$和productComments$)。
因此,“触发更改”应该是 selectedProductID,我们将switchMap使用 ProductDetails 和 ProductComments 的最新值进行操作。
我试过这个:
// subscribed to the 3 observable passed in combineLatest
fetchProduct$: Observable<any>;
this.fetchProduct$ = Observable.combineLatest(
this.selectedProductId$,
this.productComments$,
this.productDetails$
).switchMap(
result => Observable.of(
{
'uuid': result[0],
'comments': result[1],
'details': result[2]
}
)
);
Run Code Online (Sandbox Code Playgroud)
然后我订阅这个 observable 并在传递的值上放置一个断点:
this.fetchProductSubscription = this.fetchProduct$.subscribe(result => this.someFn(value));
Run Code Online (Sandbox Code Playgroud)
它可以工作,但每次三个 Observables 之一检测到状态变化时都会被调用。我也尝试过 Observable.forkJoin,但从文档来看,它等待三个 Observable …
我想从邮件中将附件文件转换为流类型.但是如何创建流?我正确地获取邮件项目(内容,主题,附件).请参阅以下链接: EWS托管API:获取附件我尝试执行以下操作:
int nbAttachments = message.Attachments.Count;
FileAttachment[] attachedFiles = new FileAttachment[nbAttachments];
for (int i=0; i < nbAttachments; i++)
{
attachedFiles[i] = message.Attachments[i] as FileAttachment;
}
for (int i = 0; i < attachments.Length; i++)
{
if (attachments[i].Name != null)
{
AttachmentCreationInformation infoAttachment = new AttachmentCreationInformation();
attachments[i].Load(infoAttachment.ContentStream);
infoAttachment.FileName = attachments[i].Name;
newItem.AttachmentFiles.Add(infoAttachment);
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,不要担心我做了很多测试和管理异常但是把所有代码都放在这里并不重要.
我发现这篇文章:MSDN论坛并尝试以下方法:
FileStream stream = new FileStream(attachments [i] .Name,FileMode.Open);
byte [] byteArray = new byte [stream.Length];
stream.Read(byteArray,0,Convert.ToInt32(stream.Length));
stream.Close();
(这里我的文字被打破了,因为我无法将其转换为代码格式,所以对于斜体来说很抱歉......今天运气不好)
但它搜索本地驱动器上的附件...... …
我有一个简短的问题,似乎很简单,但到目前为止我找不到任何答案。
我想在 Elasticsearch 节点上检索给定日期字段的最后一个文档。但我想要最后一个文档,仅用于包含特定字段的文档。
例如,假设我想获取包含字段“ promotionCode ”的最后一次购买:
询问 :
http://elasticsearch:9200/store1/purchase/_search?q=vendor:Marie&size=1&sort=date:desc
Run Code Online (Sandbox Code Playgroud)
其中store1是我的索引,购买文档类型。
现在假设我的 ElasticSearch 中有这两个文档:
"hits": [
{
"_index": "store1",
"_type": "purchase",
"_id": "1",
"_score": 1,
"_source": {
"date": "2016-03-16T12:53:16.000Z",
"vendor": "Marie",
"promotionCode": "XYZ123"
}
},
{
"_index": "store1",
"_type": "purchase",
"_id": "2",
"_score": 1,
"_source": {
"date": "2016-03-18T12:53:16.000Z",
"vendor": "Marie"
}
}
]
Run Code Online (Sandbox Code Playgroud)
上面的查询将检索 id 2 的文档,但我的结果中不会有任何字段“ promotionCode ”。
如果我想获取包含特定字段的最后一个文档,我该怎么做?
我探索了“字段”过滤器,但如果不包含该字段,它只会发回无效文档,并且我阅读了源过滤但不确定它是否在做我想要的......
非常感谢您的任何提示!
我想使用 CriteriaBuilder 构建一个查询,并将谓词添加到 where 指令中,以从潜在的 ENUM 值列表中过滤我的对象字段之一。
尽管有类似的帖子:使用 CriteriaBuilder 过滤数据以将枚举值与文字进行比较不起作用
我没能让我的代码工作。这是“简化”的对象:
//BUNCH OF ANNOTATIONS
public class Action {
@Column(name = "CONTEXT")
@Enumerated(EnumType.STRING)
private ActionContext context = ActionContext.SALE;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的枚举是:
public enum ActionContext {
SALE,
ORDER,
OTHER
}
Run Code Online (Sandbox Code Playgroud)
在我的过滤器中,我可以收到诸如“销售,订单”之类的内容。
所以我创建了一个自定义规范,当我构建它时,我正在这样做:
private List<Predicate> filters = new ArrayList<>();
//...
// filterValue is a String, it can be "SALE,ORDER" for ex.
case CONTEXT_FILTER_NAME:
if (filterValue != null && !filterValue.isEmpty()) {
String[] contextTokens = filterValue.split(",");
CriteriaBuilder.In<String> inClause = cb.in(root.get(CONTEXT_FILTER_NAME));
Arrays.asList(contextTokens).forEach(inClause::value);
filters.add(inClause);
} …Run Code Online (Sandbox Code Playgroud)