对业务方法的保护,spring security提供了MethodSecurityInterceptor这种拦截器进行处理。这样进行方法调用的时候就能够进行安全处理了。但问题是:
如果用户不是用spring的getbean方式获取对象的话,这种业务方法保护不久失效了吗?
ApplicationContext ctx =
WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
bill obj = (bill)ctx.getBean("bill");
String get=obj.getBill(null);
String CallAddfromSpring;
try{
CallAddfromSpring=obj.addBill(null);//[b]这样调用是不成功的,因为通过MethodSecurityInterceptor禁止该用户访问add方法[/b]
}catch (Exception e){
CallAddfromSpring=" CallAddfromSpring Exception";
}
bill test=new BillImpl();
String DirectCallAdd=test.addBill(null);//[b]这样调用就是成功的。由于是直接生成的对象,我对add方法的保护失效了[/b]。
这样的安全机制算合理的吗?
合理。
你第二种方式已经脱离了spring容器的管理范围了。你不按照它的要求来,spring没办法管理到bean自然没办法做安全保证。
安全机制前提是bean要给spring容器托管,这样它才能产生代理类来拦截,这算是一种协议与约束,写代码的人你是没办法控制的,但是有约束的代码运行起来后是可控的。
jvm有安全机制,一般来说你跑在jvm上的class黑客是没办法获得的。
spring security更多的是业务层面的保证。
不错,挺厉害的