作者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
1F:→ qrtt1:order 建立时,会记录下 order 与 user 对应关系。这样就有 03/14 10:50
3F:→ qrtt1:查出 order owner 的方法了。检查二者是否一致,是怕 owner 03/14 10:51
4F:→ qrtt1:把它的 url 给人(或被偷了)。做 token 验证也可以防不合法 03/14 10:52
5F:→ qrtt1:的存取。不过,用 aop 或 filter 能做到查核操作 flow 03/14 10:53
6F:→ qrtt1:是不是属於正常的情况。 03/14 10:53
7F:→ qrtt1:当然,可能我想太简单,你想太复杂 :P 所以,搭不上线 orz 03/14 10:54
8F:→ cyclone350:我想我理解q大的意思了。我再去研究spring security 03/14 23:38
9F:→ cyclone350:有没有功能符合这种需求。 03/14 23:40
10F:→ qrtt1:ps. 我只是一般而论,俺没用 spring security 的经验qq 03/15 10:00
11F:推 kiwatami:同意q大 session + user-order的mapping物件就可以解决 03/29 22:51