证书管理方案读取时无需PIN码
生物特征不能被改变,不能被撤销——它们永远存在。如果有人得到它们(这是迟早的事),我们就完了。例如,现在我们使用指纹解锁手机,同时我们将手机作为大多数在线服务的通用“第二因素”,包括某些情况下的电子银行,欺诈正在发生(或已经发生)。
正如布鲁斯·施奈尔在一次演讲后
结果足以彻底废弃这些系统,并让各种指纹生物识别公司卷铺盖走人
另一方面,生物特征识别并不那么有用,也不那么令人愉快——只需输入PIN就可以了(但我们可以更改PIN)。
我已经子护照相关的风险是,电子护照有清晰的指纹图像,通过复杂的证书管理方案读取时无需PIN码。底线是,它们可以在你不理解的情况下从你的护照中泄露(如果中央数据库在此之前没有泄露的话)。幸运的是,还有其他方法可以保证护照的主人确实是被发给的那个人,而且不是伪造的。
但无论如何,我认为生物数据可以有一些未来的应用。在演讲快结束的时候,我试着想象它如何被用于一个全球性的、分布式的匿名电子身份识别方案。但是魔鬼总是在细节中。到目前为止,我们在细节上
但是最近我还是在我们的项目中引入了。不仅如此,团队对Scala毫无经验。我会试着解释为什么这不是个坏主意。
https://www.douban.com/note/837530441/
- 首先,也是最重要的一点——我遵循了自己的建议,只在一个小的辅助模块中介绍了它。我们没有验收测试,我们迫切需要一些,所以JBehave测试模块是scala项目的一个很好的候选。
- 测试代码与“常规”代码有些不同——不太一致、更“粗略”和有漏洞是可以的。另一方面,它可以受益于scala的表现力和更少的冗长,因为测试通常很难阅读,尤其是在设置阶段。因此,Scala似乎是一个不错的选择——你可以快速编写简洁的测试代码,而不用太担心从长远来看你会搬起石头砸自己的脚,或者多个团队成员以不同的方式做事(Scala慷慨地允许)。此外,在测试中你不必面对一大堆框架,因此——所有的语言概念(如隐含、部分函数、case对象、currying等)。)
- 我没有选择脚本语言(或者特别是groovy),因为我知道groovy几年前就有这个选项了)。它应该是一种JVM语言,因为我们想要重用我们的一些公共库。
- 偶尔学习新的编程语言对人们来说是有好处的,因为这会拓宽他们的视野。即使这并没有改变他们选择的语言。
- 我认为学习Scala可以更好地理解和使用Java 8 lambdas,因为在Scala中你可以“在它们的自然栖息地”体验它们。
- 我以前有使用Scala的经验,所以团队中有人可以提供帮助
(作为旁注——IntelliJ Scala支持现在比我上次使用它时更好了(不像基于Eclipse的Scala IDE,它仍然是坏的))
https://movie.douban.com/review/14637559/
如果用Scala编写验收测试代码像我想象的那么简单,那么这就意味着我们将会有更多更好的验收测试,这是实际的目标。这意味着我们在工作中使用了正确的工具,而不是锤子。
如果你需数据库操作中,如果您正在使用Hibernate…您用Envers,可以用hibernate事件监听器和spring事务同步来实现类似的功能。
首先,从事件监听器开始。您应该捕获所有的插入、更新和删除操作。但是有一个棘手的问题——如果您出于某种原因需要刷新会话,您不能用传递给事件侦听器的会话直接执行该逻辑。在我的例子中,我必须获取一些数据,hibernate开始向我抛出异常(“id为null”)。多个消息来源证实,您不应该在事件侦听器中与数据库进行交互。因此,您应该存储事件以供以后处理。您可以将监听器注册为spring
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
@Component public class AuditLogEventListener implements PostUpdateEventListener, PostInsertEventListener, PostDeleteEventListener { @Override public void onPostDelete(PostDeleteEvent event) { AuditedEntity audited = event.getEntity().getClass().getAnnotation(AuditedEntity. class ); if (audited != null ) { AuditLogServiceData.getHibernateEvents().add(event); } } @Override public void onPostInsert(PostInsertEvent event) { AuditedEntity audited = event.getEntity().getClass().getAnnotation(AuditedEntity. class ); if (audited != null ) { AuditLogServiceData.getHibernateEvents().add(event); } } @Override public void onPostUpdate(PostUpdateEvent event) { AuditedEntity audited = event.getEntity().getClass().getAnnotation(AuditedEntity. class ); if (audited != null ) { AuditLogServiceData.getHibernateEvents().add(event); } } @Override public boolean requiresPostCommitHanding(EntityPersister persister) { return true ; // Envers sets this to true only if the entity is versioned. So figure out for yourself if that's needed } } |
请注意AuditedEntity
–它是一个自定义标记注释(retention=runtime,target=type),您可以将它放在实体的顶部。
老实说,我没有也有春天在我的支配下,在我的AuditLogServiceData
我决定利用spring: