2012-02-15 69 views
4

在保存第一個域對象的默認導軌安裝中,它提供了一個奇特的隨機ID,如785787634或其他東西。 Grails給出1grails:隨機自動編號的

在grails中製作難以猜測和不太可能相交的自動生成的id的首選方法是什麼?

+0

順序自動生成的id的一個優點是它降低了插入到聚簇索引中的複雜性。調用隨機ID「更好」是主觀的。 – 2012-02-15 17:41:27

+0

記住這一點,你可以檢查一下:http://danlynn.com/grails/grails-gorm-and-uuids/ – 2012-02-15 17:44:44

+0

我聽說UUID可以影響性能。在你選擇它之前,你可能想要做一個基準 – 2012-02-15 18:00:44

回答

4

一種不同的方式來做到這一點是使用默認的ID作爲提供,但隨後使用UUID時,增加一個專門列您需要公開(非安全)訪問該項目。

我認爲這會工作得很好:

class Widget { 
    String uuid 

    static constraints = { 
     uuid unique: true 
    } 

    def beforeInsert() { 
     // optionally, replace the dashes by adding .replaceAll('-','') 
     uuid = UUID.randomUUID().toString() 
    } 
} 

那麼你可以使用像這樣的控制器:

// url: app/public/widget/48b5451a-0d21-4a36-bcc0-88b129852f1b 

PublicController { 
    def widget() { 
     Widget w = Widget.findByUuid(params.id) 
     ... 
    } 
} 

這是自動索引,所以它不是太緩慢,UUID是僅在公開查找小部件時才使用。如果你有一個人登錄,那麼你可以執行安全檢查,並使用app/widget/edit/1或類似的東西。

我不會依賴「隨機數」作爲安全的任何手段。即使數字不是連續的,猜測數字仍然有效。相對而言,猜測UUID幾乎是不可能的。但是,如果您有登錄帳戶,授權檢查是最好的。

+0

我其實不太關心安全性,因爲我是十字路口。也許我正在以這種錯誤的方式去解決問題..我會盡力隔離我遇到的問題併發佈一個新問題。 – Mikey 2012-02-16 00:31:17