`
san586
  • 浏览: 134783 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ss3ex与Lingo,ss3中spring security2使用的差别

阅读更多
spring security2中实现数据库管理认证和授权,版本号是spring security2.0.4,为简述方便,本文只列举关键代码。
认证:
<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对于他的实现中是重新设置下内存。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    ss3ex中使用UrlRewrite

    下面将详细介绍SS3EX中使用UrlRewrite的相关知识点。 首先,URL重写主要是通过配置文件(如本例中的`urlrewrite.xml`)来实现的。这个配置文件定义了一系列规则,用于将原始URL转换为重写后的URL。在SS3EX框架中,`...

    发布ss3ex的maven版本,取名叫sango吧

    总结来说,这个项目是关于将ss3ex转换成一个支持Maven的Java项目,便于管理和构建,同时也可能提供了一种工具,帮助开发者在他们的工作中更高效地使用或集成ss3ex。通过博客链接提供的信息,读者可以深入了解这个...

    SSD3ex2答案

    2007卡耐基软件工程网路教材 SSD3ex2答案

    springside3+ext源代码

    在项目中,Spring与Hibernate结合使用,实现了数据持久层的高效管理。JPA接口提供了统一的数据访问API,降低了与具体数据库系统的耦合度。同时,通过Struts2的拦截器和动作设计,实现了业务逻辑和视图的分离,提高了...

    ssd3ex5练习5

    ssd3ex5源码,自己写的,保证100分!

    SSD3 EX1-7

    在标签中,“SSD3”可能是课程的代号,而“JAVA”则指明了编程语言,这意味着我们将探讨如何使用Java来处理与SSD相关的任务。Java是一种广泛使用的、跨平台的编程语言,非常适合开发系统级软件,包括SSD控制器或管理...

    maven版ibatis

    - **MyBatis-Spring集成**:在Maven项目中,通常会结合Spring框架使用iBatis,实现事务管理和服务层的解耦。 - **XML配置**:iBatis的SQL语句通常写在XML配置文件中,包括映射文件(mapper.xml)和配置文件(mybatis...

    派特莱LCE-A 多层信号灯2D CAD Pole M2.pdf

    派特莱LCE-A 多层信号灯2D CAD Pole M2pdf,特点:高节能无需维护的LED多层信号灯,体积小可识别性强,特别匹配于各类中小型设备的外观设计。派特莱特有的混合棱镜切割灯罩,消除了可能存在的视觉盲点,大大提高了远...

    AURIXTC3XX_um_part1_v1.3.pdf

    根据提供的文档信息,我们可以提取和总结出关于AURIX TC3XX的重要知识点: ### AURIX TC3XX 概述 - **名称**: AURIX TC3XX 是一款基于 Infineon TriCore™ 架构的 32 位多核微控制器。 - **文档类型**: 该用户手册...

    MIP2G7MD电源模块图

    ### MIP2G7MD电源模块相关知识点 #### 概述 MIP2G7MD是一种高性能集成电源设备(IPD),特别设计用于满足多样化的电源规格需求。它基于前一代三端子IPD系列(MIP2EX/MIP3EX)进行改进升级,通过增加多项功能来提供更...

    AIT存储助力盲人护助中心数据保护成功应用案例

    它可以与前代的Sony AIT-2产品兼容,这意味着科罗拉多盲人护助中心无需频繁更换设备,既节省了成本,又保证了数据的连续性。这种兼容性策略为预算有限的非营利组织提供了一种经济高效的长期存储解决方案。 4. **...

    山东省枣庄市部分重点高中2020届高三数学上学期定时训练试题A卷201912230332

    4. 不等式ax^2+bx+2&gt;0的解集为{x|-1&lt;x&lt;2},说明其对应的二次方程有两个根-1和2,利用韦达定理可以求得a和b的关系,然后解不等式2x^2+bx+a&gt;0。 5. 向量a=(2,1),b=(1,-1),c=(k,2),题目中(a-b)⊥c,利用向量的垂直...

    matlab开发-用matlab解题

    在MATLAB开发中,利用MATLAB解题是一种高效且强大的工具,尤其在图像处理与计算机视觉领域。MATLAB以其简洁的语法和丰富的内置函数库,为科学家和工程师提供了便利的平台来解决各种复杂的数学问题。以下是一些基于...

    Sizzle v4.0.0.59

    Sizzle 是一套前端用智能来处理模块和组件依赖关系的框架。 它遵循 CommonJS 的运行规范来完成对各个模块的动态加载。...Sizzle 框架将被使用在 PJBlog4 新版本中,让后台更加代码逻辑化和模块化。

    练习二(龙版)答案.doc

    3. **期望(数学期望)**(Expectation):随机变量的期望表示其平均值,如第4题中的EX=,第9题中的EX=np=1.6,第13题中的E(z)=3EX-2。 4. **方差(Variance)**:随机变量的方差衡量其数值离散程度,如第4题中的DX...

    21版高考数学人教A版浙江专用大一轮复习核心考点·精准研析 3.4.2 导数与函数零点 含解析.doc

    【导数与函数零点】在数学中,导数是理解函数行为的关键工具,尤其是在寻找函数零点(即方程的根)时。导数揭示了函数的增减性,帮助我们判断何时函数可能达到最大值或最小值,这对于确定方程解的数量至关重要。 在...

    新健太郎通信协议(中文) - 副本1

    2. **适用**:此协议适用于所有使用HBP-9021/9020的通信场景,无论是在设备的开发阶段还是实际操作过程中。 3. **连接构成**:在PC与主CPU进行通信时,它们通过RS232C串行通信端口相连,具体是通过UART接口的TxD...

    2021版高考数学一轮复习第三章导数及其应用3.4.2导数与函数零点的综合问题练习理北师大版

    在例题1中,函数f(x) = 3ln x - x^2 + 2x - 3ln 3 - ,通过求导得到f'(x),并分析其正负,找出单调区间。发现f(x)在x=3处取得最大值,且当x趋于0和正无穷时,f(x)趋于负无穷,因此确定方程f(x) = 0只有一个解。 ...

Global site tag (gtag.js) - Google Analytics