作者cyclone350 (老子我最神)
看板java
標題Re: [問題] Java實作security的極限
時間Fri Mar 14 10:26:29 2014
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 123.193.201.124
: → cyclone350:前面Order的例子是參考王者歸來的書 03/13 22:46
: → qrtt1:為什麼不檢查 order user == current user 就好? 03/14 08:22
: → cyclone350:我想問的就是如何有效果的達到這件事 03/14 08:58
: → qrtt1:session, token, https !? 03/14 09:32
q大所提的算是很實際的已知條件
前篇文章一開始有提及說,我們可以在每次set前都檢查User資料
current user資料包含從Session拿... 從https拿... 或是從DB撈值判斷,
anyway,這種很實際的說法被我省略掉了,
因為不論如何,這種作法都必須在set前做檢查。
在DynamicProxy作法裡,set必須多傳一個參數進去,如何把參數傳進去
當然是可透過技術上的方式,例如在set前透過session抓到current user
抓到後再呼叫 setProductName("theName",user)。
應該說我要問的的確跟技術有點關係,但我想達到的目標比較像是設計方法
讓我分派下去的PG可以著重在商業邏輯撰寫,而不是在邏輯撰寫中夾雜
許多權限的分派,或記憶體控管之類等等....
也就是問問看是否有更AOP的作法
其中JSR250我說"可以理解",意思是使用@RolesAllowed("ROLE_ADMIN")
背後做法可以去整個 applicationContext 或 webContainer 去拿到 current user
如何拿當然包刮 session, https, db ... 之類的
但是這個值是死的,我只能判斷 current user 是不是等於 ROLE_ADMIN
想要動態的方式如下
例如像是這樣
public class order {
@Owner
private String orderUser;
private String productName;
@AllowByOwner
public void setOrderUser(String orderUser) {
this.orderUser = orderUser;
}
@AllowByOwner
private void setProductName(String productName) {
this.productName = productName
}
}
可是這樣子要如何在背後程式實作,我是沒有想法的...
我可以從各種方式抓到 current user...
但是我不知道如何用哪種方式抓到 order user...
我也不確定透過反射機制是否可以達到這樣的做法
雖然我訂了 @Owner 介面,但是不知道如何實作
也許我沒理解q大所要回答的意思
主要還是在問更彈性的設計來達到security的效果。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.218.64.133
→ qrtt1:order 建立時,會記錄下 order 與 user 對應關係。這樣就有 03/14 10:50
→ qrtt1:查出 order owner 的方法了。檢查二者是否一致,是怕 owner 03/14 10:51
→ qrtt1:把它的 url 給人(或被偷了)。做 token 驗證也可以防不合法 03/14 10:52
→ qrtt1:的存取。不過,用 aop 或 filter 能做到查核操作 flow 03/14 10:53
→ qrtt1:是不是屬於正常的情況。 03/14 10:53
→ qrtt1:當然,可能我想太簡單,你想太複雜 :P 所以,搭不上線 orz 03/14 10:54
→ cyclone350:我想我理解q大的意思了。我再去研究spring security 03/14 23:38
→ cyclone350:有沒有功能符合這種需求。 03/14 23:40
→ qrtt1:ps. 我只是一般而論,俺沒用 spring security 的經驗qq 03/15 10:00
推 kiwatami:同意q大 session + user-order的mapping物件就可以解決 03/29 22:51