<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>will7v (超级威)</title>
    <link>https://ruby-china.org/will7v</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>求助：如何记录可读的操作行为日志</title>
      <description>&lt;p&gt;求助大家个问题：&lt;/p&gt;

&lt;p&gt;对于 Project（项目）这个 model，与之相关联的有很多其他 model，比如，文档 Documents( project has_many documents)，意向 Interests(projects HABTM interests) 等&lt;/p&gt;

&lt;p&gt;需求：&lt;/p&gt;

&lt;p&gt;要记录下所有的操作行为日志，以后要获取查看，要记录的日志应该包括两部分 &lt;strong&gt;线索&lt;/strong&gt; 和 &lt;strong&gt;可读文本&lt;/strong&gt;，可读文本是要后面输出的，所以想在保存日志的时候拼好存起来，到时直接输出可读文本，线索留底。&lt;/p&gt;

&lt;p&gt;举个场景：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;修改关联的对象，如 interests，线索类似是"interests: { amount: 20, rating: 5, ...  }"，输出的文本是"who 在 when 修改了 what（项目）的意向 aaa 的属性，新的值为 xxx"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;做了某个动作，动作可以包括修改或创建多个对象，线索类似 { followers: 1, 2, 3, sector: 2, leader: 4 } , 输出的文本是"who 在 when 推进了项目，新的领导是 xxx4，新的协同者是 xxx1,xxx2,xxx3, 区域改为 中国" &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;想到的解决方案：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;类似 event-sourcing 的方法，删除和修改（哪怕是一个字段的修改）只做增量，用 before_create 回调记录的日志 log，对应到某条记录：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;参考：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://martinfowler.com/eaaDev/EventSourcing.html" rel="nofollow" target="_blank" title=""&gt;Event Sourcing&lt;/a&gt;
&lt;a href="http://scottsmerchek.com/2015/08/04/taking-the-d-out-of-crud-with-soft-updates/" rel="nofollow" target="_blank" title=""&gt;Taking D out of CRUD&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;遇到问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;碰到场景 2，本来想的效果是一条记录，现在会因为修改多个对象要记录多条&lt;/li&gt;
&lt;li&gt;某些对象有 is_removed 属性，就算记录了 version，前面的 version 是 is_removed: true，后面修改了的话，前面的还是会被查出来，除非删除的时候还要动原来的记录，这与全部增量的原则不符&lt;/li&gt;
&lt;li&gt;表可能会很大，如果要往另一个历史表迁就还要考虑其他问题，而且每个表都要对应出一个历史表&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;手动硬写，命令式记录日志，先用 changed_attributes 检查被修改的字段，针对每个要记录的动作手动 merge 其他线索，再 before_save 用动作对应的文本模版写文本&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;参考：&lt;/p&gt;

&lt;p&gt;&lt;a href="http://api.rubyonrails.org/classes/ActiveModel/Dirty.html" rel="nofollow" target="_blank" title=""&gt;Dirty&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;一点也不优雅，把代码搞的很难看，有时还会碰到问题（比如 grape declared(params)，碰到这个效果&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# controller&lt;/span&gt;
&lt;span class="no"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;declared&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;remark&lt;/span&gt;
  &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;logdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@current_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# model&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;logdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="n"&gt;clues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;changed_attributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 这里拿到的self.changed_attributes 是{ "remark"=&amp;gt;"#&amp;lt;Hashie::Mash funding_id=1 remark=\"hello\"&amp;gt;"} &lt;/span&gt;
  &lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;event_id: &lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;clues_cached: &lt;/span&gt;&lt;span class="n"&gt;cues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;要针对每个动作写一个方法来拼线索和文本&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;求各位高手指点一个优雅点的方法，或者其他好的思路&lt;/strong&gt;&lt;/p&gt;</description>
      <author>will7v</author>
      <pubDate>Wed, 18 May 2016 16:03:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/30059</link>
      <guid>https://ruby-china.org/topics/30059</guid>
    </item>
    <item>
      <title>前后端分离，App 和 Web 端关于用户验证接口的一些疑惑</title>
      <description>&lt;p&gt;目前我们是前后端分离，关于用户鉴权部分的接口，web 和 app 想共用一套&lt;/p&gt;

&lt;p&gt;web 端原来的方案：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;token 用 jwt 包一层，只是用了加密的功能，没有 jwt 的过期，关于 token 有效性和失效时间的管理是用存表判断来管理。前端把下发的 jwt 存在 cookie 里，每次            服务端读取 cookie 里的 token 鉴权。&lt;/li&gt;
&lt;li&gt;尽量用了 RESTful 的规范，幂等的只读接口是用 GET，可能有副作用的用 POST。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;现在 app 端开始做对接，app 同事认为 POST 比 GET 更安全（实际抓包的话都是暴露的），GET 请求的话他把 jwt 放在 url 的参数里，认为这样不安全，请问&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;前后端分离时各位是怎么设计用户验证这块接口的，有什么更好的方案吗？&lt;/li&gt;
&lt;li&gt;app 端除了把 token 放在 url 或者 request 的 header 里，还有什么更好的方案吗？&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>will7v</author>
      <pubDate>Fri, 22 Apr 2016 11:46:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/29828</link>
      <guid>https://ruby-china.org/topics/29828</guid>
    </item>
  </channel>
</rss>
