- 浏览: 134783 次
- 性别:
- 来自: 武汉
最新评论
-
ping2010:
“备注:半推的第一个例子中,服务器是推向指定的ScriptSe ...
dwr3 Reverse Ajax学习小结 -
r4196503:
14行 copy(imgFile, newPath); 第一 ...
kindeditor上传图片的修改 -
muqingren:
你这个绑定多个表单对象能实现吗?
Spring MVC - Binding to multiple commands -
skying8603:
Util util = new Util(session); ...
dwr3 Reverse Ajax学习小结 -
soliucheng:
在修改数据的时候不需要吧,他会自己把版本号跟上。Hiberna ...
ss3ex中Hibernate的乐观锁使用
spring security2中实现数据库管理认证和授权,版本号是spring security2.0.4,为简述方便,本文只列举关键代码。
认证:
其中userDetailsService类的实现:
obtainGrantedAuthorities类的实现:
第一种,GrantedAuthority中存放的是role表中的name。
第二种,GrantedAuthority中存放的是reresource表中的name。
授权:
有2种实现,一是新写了一个FactoryBean,向默认的DefaultFilterInvocationDefinitionSource注入从ResourceDetailService中返回的RequestMap。
DefinitionSourceFactoryBean中代码:
ResourceDetailsServiceImpl中getRequestMap()代码,对应认证中GrantedAuthority中存放的是role表中的name而言,此处resourceMap中也就应该放置资源对应的role表的name:
第2中授权的实现,重写FilterInvocationDefinitionSource类。
对应认证中的第二种实现(GrantedAuthority中存放的是reresource表中的name),GrantedAuthority[]变量authorities实质上是单条url资源对应的name。
2种授权的实现,我分别列举了ss3ex和ss3中的实现,lingo文档中的实现基本类似于ss3,综上所述,授权时有新写一个FactoryBean和重写FilterInvocationDefinitionSource类2种实现,每种实现中又分别有对应2种不同的认证,所以个共有4种实现方案,本文列举了其中2种,另2种省略。
1、那么GrantedAuthority中到底应该放什么呢?
回答:这个没有要求,只要保证认证和授权时保持一致就行了。
2、ss3ex中资源是置入缓存中的,用户访问URL时,针对每个URL与缓存中的权限进行比较,而ss3中的(资源-角色[])是系统初始化时一次性读取放入内存中,待用户访问URL时分别与内存中的比较。两者的性能方面,差不多。
3、哪种在实际工作中适用些呢?
回答:如果你的URL是以“?”带有参数的话,2者都可以使用,ss3ex中需要写个缓存。如果你的URL中的规则不是“?”带有参数的,那么只要稍微修改下ss3ex中的实现方式了,即重写FilterInvocationDefinitionSource类的实现;而ss3中的做法是调用默认的FilterInvocationDefinitionSource实现DefaultFilterInvocationDefinitionSource类的构造函数,但是FilterInvocationDefinitionSource的默认实现类中的getAttributes方法又调用类中的lookupAttributes方法的实现,在lookupAttributes方法中是写死为截掉“?”参数的,这时如果要用这个DefaultFilterInvocationDefinitionSource类的话,还要想办法重写它里面的lookupAttributes方法。
4、修改资源时,ss3ex中是必须要重新设置缓存的,而lingo对于他的实现中是重新设置下内存。
认证:
<authentication-provider user-service-ref="userDetailsService"> <password-encoder hash="md5"> <salt-source user-property="username" /> </password-encoder> </authentication-provider>
其中userDetailsService类的实现:
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException { User user = securityManager.findUserByLoginName(userName); if (user == null) throw new UsernameNotFoundException("用户" + userName + " 不存在"); GrantedAuthority[] grantedAuths = obtainGrantedAuthorities(user); // san中无以下属性,暂时全部设为true. boolean enabled = true; boolean accountNonExpired = true; boolean credentialsNonExpired = true; boolean accountNonLocked = true; org.springframework.security.userdetails.User userdetail = new org.springframework.security.userdetails.User( user.getLoginName(), user.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuths); return userdetail; }
obtainGrantedAuthorities类的实现:
第一种,GrantedAuthority中存放的是role表中的name。
/** * 获得用户所有角色的权限集合. */ private GrantedAuthority[] obtainGrantedAuthorities(User user) { List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>(); GrantedAuthority ag=null; List<Role> roleList=userService.getRoleByLoginName(userName); for (Role role : roleList) { ag=new GrantedAuthorityImpl(role.getName()); authsList.add(ag); ag=null; } return authSet.toArray(new GrantedAuthority[authsList.size()]); }
第二种,GrantedAuthority中存放的是reresource表中的name。
/** * 获得用户所有角色的权限集合. */ private GrantedAuthority[] obtainGrantedAuthorities(User user) { List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>(); GrantedAuthority ag=null; for (Role role : user.getRoles()) { for(Resource res:role.getResources()){ ag=new GrantedAuthorityImpl(res.getName()); authsList.add(ag); ag=null; } } return authSet.toArray(new GrantedAuthority[authsList.size()]); }
授权:
有2种实现,一是新写了一个FactoryBean,向默认的DefaultFilterInvocationDefinitionSource注入从ResourceDetailService中返回的RequestMap。
<beans:bean id="filterSecurityInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor"> <custom-filter before="FILTER_SECURITY_INTERCEPTOR" /> <beans:property name="authenticationManager" ref="authenticationManager" /> <beans:property name="accessDecisionManager" ref="accessDecisionManager" /> <beans:property name="objectDefinitionSource" ref="databaseDefinitionSource" /> </beans:bean> <!-- DefinitionSource工厂,使用resourceDetailsService提供的URL-授权关系. --> <beans:bean id="databaseDefinitionSource" class="san.service.Impl.DefinitionSourceFactoryBean"> <beans:property name="resourceDetailsService" ref="resourceDetailsService" /> </beans:bean> <!-- 项目实现的URL-授权查询服务 --> <beans:bean id="resourceDetailsService" class="san.service.Impl.ResourceDetailsServiceImpl" />
DefinitionSourceFactoryBean中代码:
public class DefinitionSourceFactoryBean implements FactoryBean { public Object getObject() throws Exception { LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = getRequestMap(); UrlMatcher matcher = getUrlMatcher(); DefaultFilterInvocationDefinitionSource definitionSource = new DefaultFilterInvocationDefinitionSource( matcher, requestMap); return definitionSource; } private LinkedHashMap<RequestKey, ConfigAttributeDefinition> getRequestMap() throws Exception { LinkedHashMap<String, String> srcMap = resourceDetailsService .getRequestMap(); LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = new LinkedHashMap<RequestKey,ConfigAttributeDefinition>(); ConfigAttributeEditor editor = new ConfigAttributeEditor(); for (Entry<String, String> entry : srcMap.entrySet()) { RequestKey key = new RequestKey(entry.getKey(), null); editor.setAsText(entry.getValue()); requestMap.put(key, (ConfigAttributeDefinition) editor.getValue()); } return requestMap; } }
ResourceDetailsServiceImpl中getRequestMap()代码,对应认证中GrantedAuthority中存放的是role表中的name而言,此处resourceMap中也就应该放置资源对应的role表的name:
public LinkedHashMap<String, String> getRequestMap() throws Exception { List<Map> roleList = userDAO.getRoleByResource(""); LinkedHashMap<String, String> resourceMap = new LinkedHashMap<String, String>(); for (Map o : roleList) { String url = o.get("path").toString(); String role = o.get("role").toString(); if (resourceMap.containsKey(url)) { String value = resourceMap.get(url); resourceMap.put(url, value + "," + role); } else { resourceMap.put(url, role); } } return resourceMap; }
第2中授权的实现,重写FilterInvocationDefinitionSource类。
对应认证中的第二种实现(GrantedAuthority中存放的是reresource表中的name),GrantedAuthority[]变量authorities实质上是单条url资源对应的name。
public class DbFilterInvocationDefinitionSource implements FilterInvocationDefinitionSource, InitializingBean { …… public ConfigAttributeDefinition getAttributes(Object filter) throws IllegalArgumentException { GrantedAuthority[] authorities = new GrantedAuthority[0]; Resource resource = null; Collection resources = SecurityResourceCache.getAllCache(); for (Iterator it = resources.iterator(); it.hasNext();) { resource = (Resource) it.next(); String resPath = resource.getPath(); boolean matched = urlMatcher.pathMatchesUrl(resPath, requestURI); if (matched) { authorities = SecurityResourceCache.getAuthoritysInCache(resPath); break; } } if (authorities != null && authorities.length > 0) { String authoritiesStr = " "; for (int i = 0; i < authorities.length; i++) { authoritiesStr += authorities[i].getAuthority() + ","; } String authStr = authoritiesStr.substring(0, authoritiesStr .length() - 1); ConfigAttributeEditor configAttrEditor = new ConfigAttributeEditor(); configAttrEditor.setAsText(authStr.trim()); return (ConfigAttributeDefinition) configAttrEditor.getValue(); } return null; } }
2种授权的实现,我分别列举了ss3ex和ss3中的实现,lingo文档中的实现基本类似于ss3,综上所述,授权时有新写一个FactoryBean和重写FilterInvocationDefinitionSource类2种实现,每种实现中又分别有对应2种不同的认证,所以个共有4种实现方案,本文列举了其中2种,另2种省略。
1、那么GrantedAuthority中到底应该放什么呢?
回答:这个没有要求,只要保证认证和授权时保持一致就行了。
2、ss3ex中资源是置入缓存中的,用户访问URL时,针对每个URL与缓存中的权限进行比较,而ss3中的(资源-角色[])是系统初始化时一次性读取放入内存中,待用户访问URL时分别与内存中的比较。两者的性能方面,差不多。
3、哪种在实际工作中适用些呢?
回答:如果你的URL是以“?”带有参数的话,2者都可以使用,ss3ex中需要写个缓存。如果你的URL中的规则不是“?”带有参数的,那么只要稍微修改下ss3ex中的实现方式了,即重写FilterInvocationDefinitionSource类的实现;而ss3中的做法是调用默认的FilterInvocationDefinitionSource实现DefaultFilterInvocationDefinitionSource类的构造函数,但是FilterInvocationDefinitionSource的默认实现类中的getAttributes方法又调用类中的lookupAttributes方法的实现,在lookupAttributes方法中是写死为截掉“?”参数的,这时如果要用这个DefaultFilterInvocationDefinitionSource类的话,还要想办法重写它里面的lookupAttributes方法。
4、修改资源时,ss3ex中是必须要重新设置缓存的,而lingo对于他的实现中是重新设置下内存。
发表评论
文章已被作者锁定,不允许评论。
-
Document对象内容集合
2010-09-18 12:18 947Document对象内容集合 document 文挡对象 - ... -
tomcat6配置https
2010-03-04 12:37 4251tomcat6配置双向认证 1、 ... -
maven-eclipse-plugin 与aspectj
2010-02-06 17:32 7716问题1:最近一段时间以来,项目中使用maven-eclipse ... -
linux中使用broadcom型号卡上网
2010-01-19 15:31 4205确认下网卡型号: sansha ... -
用nginx-0.8.32和一个tomcat6.0.20搭建ss3ex
2010-01-15 14:14 15801、下载nginx-0.8.32和一个tomcat6.0.20 ... -
用apache_2.2.14和tomcat6.0.20搭建ss3ex
2010-01-13 18:40 17261、安装apache_2.2.14-win32-x86-no_ ... -
nginx+tomcat配置负载均衡和集群
2010-01-12 16:25 18181、下载nginx(nginx/Windows-0.8.32) ... -
ss3ex中的自定义URL格式
2009-11-23 22:21 2008自定义URL格式,本方法只是在模仿REST样的URL格式: 比 ... -
WEB框架中异步实现方案
2009-10-22 22:15 1686异步解决方案中除了JMS,AJAX,DWR等外的简单选择,就是 ... -
实现线程内和线程间传值,合理使用ThreadLocal
2009-10-10 08:55 6622以下均在ss3ex环境中 1、理解线程 用户请求一个URL,所 ... -
Struts2中页面上访问后台static类中的方法
2009-09-14 19:05 14811、在struts.xml中保证(或者设置) <cons ... -
读取excel文件
2009-09-09 10:41 1365读取excel文件 -
不用session、request传值的另一种解决方案
2009-08-13 19:40 1660不用session、request传值的另一种解决方案: pu ... -
发布ss3ex的maven版本,取名叫sango吧
2009-07-19 23:19 1248都在用maven,跟上步伐,发布一个maven版本的s ... -
tomcat调试maven2项目
2009-07-16 21:49 4792一、搭建maven项目(目的 ... -
eclipse3.4安装m2eclipse
2009-07-15 10:50 2965工作需要,必须要使用maven2。 eclipse版本:ecl ... -
kindeditor上传图片的修改
2009-06-27 12:19 19648最近做新闻系统,用了kindeditor,其中上传图片 ... -
预先抓取,外连接,和直接查询三者直接的区别
2009-06-15 17:51 1157预先抓取,外连接,和直接查询三者直接的区别: [1]. 预先抓 ... -
值集合映射 annotation
2009-06-15 13:29 913值集合映射 @CollectionOfElements ... -
ss3ex中Hibernate的乐观锁使用
2009-06-12 15:41 1499Hibernate支持乐观锁。当多个事务同时对数据库表 ...
相关推荐
下面将详细介绍SS3EX中使用UrlRewrite的相关知识点。 首先,URL重写主要是通过配置文件(如本例中的`urlrewrite.xml`)来实现的。这个配置文件定义了一系列规则,用于将原始URL转换为重写后的URL。在SS3EX框架中,`...
总结来说,这个项目是关于将ss3ex转换成一个支持Maven的Java项目,便于管理和构建,同时也可能提供了一种工具,帮助开发者在他们的工作中更高效地使用或集成ss3ex。通过博客链接提供的信息,读者可以深入了解这个...
2007卡耐基软件工程网路教材 SSD3ex2答案
在项目中,Spring与Hibernate结合使用,实现了数据持久层的高效管理。JPA接口提供了统一的数据访问API,降低了与具体数据库系统的耦合度。同时,通过Struts2的拦截器和动作设计,实现了业务逻辑和视图的分离,提高了...
ssd3ex5源码,自己写的,保证100分!
在标签中,“SSD3”可能是课程的代号,而“JAVA”则指明了编程语言,这意味着我们将探讨如何使用Java来处理与SSD相关的任务。Java是一种广泛使用的、跨平台的编程语言,非常适合开发系统级软件,包括SSD控制器或管理...
- **MyBatis-Spring集成**:在Maven项目中,通常会结合Spring框架使用iBatis,实现事务管理和服务层的解耦。 - **XML配置**:iBatis的SQL语句通常写在XML配置文件中,包括映射文件(mapper.xml)和配置文件(mybatis...
派特莱LCE-A 多层信号灯2D CAD Pole M2pdf,特点:高节能无需维护的LED多层信号灯,体积小可识别性强,特别匹配于各类中小型设备的外观设计。派特莱特有的混合棱镜切割灯罩,消除了可能存在的视觉盲点,大大提高了远...
根据提供的文档信息,我们可以提取和总结出关于AURIX TC3XX的重要知识点: ### AURIX TC3XX 概述 - **名称**: AURIX TC3XX 是一款基于 Infineon TriCore™ 架构的 32 位多核微控制器。 - **文档类型**: 该用户手册...
### MIP2G7MD电源模块相关知识点 #### 概述 MIP2G7MD是一种高性能集成电源设备(IPD),特别设计用于满足多样化的电源规格需求。它基于前一代三端子IPD系列(MIP2EX/MIP3EX)进行改进升级,通过增加多项功能来提供更...
它可以与前代的Sony AIT-2产品兼容,这意味着科罗拉多盲人护助中心无需频繁更换设备,既节省了成本,又保证了数据的连续性。这种兼容性策略为预算有限的非营利组织提供了一种经济高效的长期存储解决方案。 4. **...
4. 不等式ax^2+bx+2>0的解集为{x|-1<x<2},说明其对应的二次方程有两个根-1和2,利用韦达定理可以求得a和b的关系,然后解不等式2x^2+bx+a>0。 5. 向量a=(2,1),b=(1,-1),c=(k,2),题目中(a-b)⊥c,利用向量的垂直...
在MATLAB开发中,利用MATLAB解题是一种高效且强大的工具,尤其在图像处理与计算机视觉领域。MATLAB以其简洁的语法和丰富的内置函数库,为科学家和工程师提供了便利的平台来解决各种复杂的数学问题。以下是一些基于...
Sizzle 是一套前端用智能来处理模块和组件依赖关系的框架。 它遵循 CommonJS 的运行规范来完成对各个模块的动态加载。...Sizzle 框架将被使用在 PJBlog4 新版本中,让后台更加代码逻辑化和模块化。
3. **期望(数学期望)**(Expectation):随机变量的期望表示其平均值,如第4题中的EX=,第9题中的EX=np=1.6,第13题中的E(z)=3EX-2。 4. **方差(Variance)**:随机变量的方差衡量其数值离散程度,如第4题中的DX...
【导数与函数零点】在数学中,导数是理解函数行为的关键工具,尤其是在寻找函数零点(即方程的根)时。导数揭示了函数的增减性,帮助我们判断何时函数可能达到最大值或最小值,这对于确定方程解的数量至关重要。 在...
2. **适用**:此协议适用于所有使用HBP-9021/9020的通信场景,无论是在设备的开发阶段还是实际操作过程中。 3. **连接构成**:在PC与主CPU进行通信时,它们通过RS232C串行通信端口相连,具体是通过UART接口的TxD...
在例题1中,函数f(x) = 3ln x - x^2 + 2x - 3ln 3 - ,通过求导得到f'(x),并分析其正负,找出单调区间。发现f(x)在x=3处取得最大值,且当x趋于0和正无穷时,f(x)趋于负无穷,因此确定方程f(x) = 0只有一个解。 ...