• Oh no ...

  • 怎么做 Token Authentication? at 2017年10月04日

    是否可以在 payload 加一个字段,放与密码相关的哈希,当用户重置密码后,之前的 token 就失效了。也不需要持久化 token。

  • 怎么做 Token Authentication? at 2017年10月03日
  • 我觉得也可行,简单的想法是在 setter 写入值的时候,按照前面设置的 @sign 实例变量的值存成不同名的实例变量,比如 @foo_1@foo_2,分别是 sign 1 和 2 的配置值。大概这样:

    config_class = Class.new do
      attrs.each do |attr|
        define_method attr do
          attr.eql?(:sign) ? @sign : instance_variable_get("@#{attr}_#{@sign}")
        end
        define_method "#{attr}=" do |val|
          attr.eql?(:sign) ? (@sign = val) : instance_variable_set("@#{attr}_#{@sign}", val)
        end
      end
    

    配置的时候就可以:

    config.sign = '1'
    config.foo = 'foo1'
    config.bar = 'bar1'
    
    config.sign = '2'
    config.foo = 'foo2'
    config.bar = 'bar2' 
    

    使用:

    MyConfig.config.sign = '1'
    MyConfig.config.foo # => 'foo1'
    

    手写的这一段,还没试过,可以参考一下 ... 不过我是觉得上面的 MyConfig.config_a 的用法更好,读某一套配置只需要一行。 再多写一点,可以继续把 sign 方法的名字可配置化,而不是硬编码。

  • 这不都是同名的 key 吗,不知道你的 yml 文件是怎么配置?

  • 「多套配置」是指:Cls.config_a.foo; Cls.config_b.foo?如果是这个意思,那么我粗糙地实现了一下:

    # configurable.rb
    module Configurable
      module Enable
        cattr_accessor :current_config
    
        def method_missing(method, *args)
          cattr_accessor method
          define_singleton_method method do
            self.current_config = method
    
            config = instance_variable_get("@#{current_config}_config")
            config.nil? ? self : config
          end
          send method
        end
      end
    
      def self.with(*attrs)
        # 使用配置属性定义匿名类
        config_class = Class.new do
          attr_accessor *attrs
        end
    
        # 为可混入的类方法定义匿名模块
        class_methods = Module.new do
          define_method :config do
            config_var = "@#{current_config}_config"
            instance_variable_set(config_var, config_class.new) if instance_variable_get(config_var).nil?
            instance_variable_get(config_var)
          end
    
          def configure
            yield config
          end
        end
    
        # 创建并返回新的模块
        Module.new do
          singleton_class.send :define_method, :included do |host_class|
            host_class.extend class_methods
          end
        end
      end
    
    end
    
    # my_config.rb
    class MyConfig
      extend Configurable::Enable
      include Configurable.with :foo
    end
    
    # Usage
    MyConfig.config_a.configure do |config|
      config.foo = 'bar'
    end
    MyConfig.config_b.configure do |config|
      config.foo = 'foo'
    end
    
    puts MyConfig.config_a.foo
    puts MyConfig.config_b.foo