- 浏览: 400990 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
xxbb77:
说的有点道理
保持好奇心,把时间花在刀刃上 -
JavaAiHaoZhezh:
有时候需要学会放手,别让自己太劳累 -
1011729483:
你好:楼主我想请问一下刚开始你访问项目进去login.jsp页 ...
菜鸟-手把手教你把Acegi应用到实际项目中(2) -
zhglance:
很赞,胜过好多出版物
程序员必备:Linux日常维护命令 -
zizhi9999:
为什么我的总是说timeout呢 很急 啊
利用SNMP获取、走访节点值
在实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业应用更加安全。既然密码的加密如此之重要,那么Acegi(Spring Security)作为成熟的安全框架,当然也我们提供了相应的处理方式。
针对用户密码的加密工作,DaoAuthenticationProvider同时暴露了passwordEncoder和saltSource属性。PasswordEncoder和SaltSource是可选的属性,PasswordEncoder负责对认证库中的密码进行加解密。而SaltSource则是在产生密码时给它加点“盐”,以增强密码在认证库中的安全性。Acegi安全系统提供的PasswordEncoder实现中包括MD5、SHA和明文编码。
Acegi提供了三种加密器:
PlaintextPasswordEncoder---默认,不加密,返回明文.
ShaPasswordEncoder---哈希算法(SHA)加密
Md5PasswordEncoder---消息摘要(MD5)加密
Acegi安全系统提供了两个SaltSource的实现:
SystemWideSaltSource,它用同样的"盐"对系统中所有的密码进行编码
ReflectionSaltSource只对从UserDetails对象返回的获得这种"盐"的指定属性进行检查。请参考JavaDoc以获取对这些可选特性的更详细信息。
图1为Acegi内置的PasswordEncoder继承链。默认时,DaoAuthenticationProvider会实例化PlaintextPasswordEncoder对象,即应对用户密码未进行加密处理的情况。
图2为Acegi内置的SaltSource继承链。默认时,SaltSource的取值为null,即未启用密码私钥。
1、 PlaintextPasswordEncoder明文密码
在使用明文密码期间,如果系统允许登录用户不区分密码大小写,则应设置ignorePasswordCase属性值为true。
在Acegi安全配置文件中添加:
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="inMemDaoImpl" /> <!-- 增加 --> <property name="passwordEncoder" ref="plaintextPasswordEncoder" /> </bean> <!-- 增加 --> <bean id="plaintextPasswordEncoder" class="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder"> <property name="ignorePasswordCase" value="true"></property> </bean>
2、 ShaPasswordEncoder哈希算法(SHA)加密
在Acegi安全配置文件中添加:
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="inMemDaoImpl" /> <!-- 增加 --> <property name="passwordEncoder" ref="shaPasswordEncoder" /> <!-- <property name="passwordEncoder" ref="shaMessageDigestPasswordEncoder" /> --> </bean> <!-- 增加, 以下两种配置方式等效 --> <bean id="shaPasswordEncoder" class="org.acegisecurity.providers.encoding.ShaPasswordEncoder"> <constructor-arg> <value>256</value> </constructor-arg> <property name="encodeHashAsBase64" value="false"></property> </bean> <!-- <bean id="shaMessageDigestPasswordEncoder" class="org.acegisecurity.providers.encoding.MessageDigestPasswordEncoder"> <constructor-arg> <value>SHA-256</value> </constructor-arg> <property name="encodeHashAsBase64" value="false"></property> </bean> -->
3、 Md5PasswordEncoder消息摘要(MD5)加密
在Acegi安全配置文件中添加:
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="inMemDaoImpl" /> <!-- 增加 --> <property name="passwordEncoder" ref="md5PasswordEncoder" /> <!-- <property name="passwordEncoder" ref="md5MessageDigestPasswordEncoder" /> --> </bean> <!-- 增加. 以下两种配法等效 --> <bean id="md5PasswordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"> <property name="encodeHashAsBase64" value="false"></property> </bean> <!-- <bean id="md5MessageDigestPasswordEncoder" class="org.acegisecurity.providers.encoding.MessageDigestPasswordEncoder"> <constructor-arg> <value>MD5</value> </constructor-arg> <property name="encodeHashAsBase64" value="false"></property> </bean> -->
4、 SystemWideSaltSource
SystemWideSaltSource会采用一个静态字符串表示密码私钥(salt),所有用户的密码处理都会采用这一私钥。同未启用密码私钥相比,SystemWideSaltSource更为安全,因为它使得密码的破解变得更困难。默认时,它会采用“密码{密码私钥}”形式加密密码。
配置如下:
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService" /> <property name="passwordEncoder" ref="md5PasswordEncoder" /><!-- 增加 --> <!-- 增加 --> <property name="saltSource"> <bean class="org.acegisecurity.providers.dao.salt.SystemWideSaltSource"> <property name="systemWideSalt" value="javaee"></property> </bean> </property> </bean>
5、 ReflectionSaltSource
尽管采用SystemWideSaltSource能够加强密码的保护,但由于SystemWideSaltSource采用了全局性质的密码私钥,因此仍存在一定的缺陷。
而ReflectionSaltSource采用了个案性质的密码私钥,即其密码加密所采用的私钥是动态变化的,因此它更为安全。ReflectionSaltSource仍采用“密码{密码私钥}”的形式加密密码。
配置如下:
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService" /> <property name="passwordEncoder" ref="md5PasswordEncoder" /> <!-- 增加 --> <property name="saltSource"> <bean class="org.acegisecurity.providers.dao.salt.ReflectionSaltSource"> <property name="userPropertyToUse" value="getUsername"></property> </bean> </property> </bean>
此时,ReflectionSaltSource将调用UserDetails对象的getUsername()方法获得各用户的密码私钥。比如:javaee(用户名)/password(密码) 用户的密码将被以“password{javaee}”的形式进行加密处理。
通过指定userPropertyToUse属性的值,开发者能够控制密码私钥的来源。比如上述的getUsername的含义就是动态调用相应的getUsername()方法,并将返回结果直接作为密码的私钥。在实际企业应用中,Acegi应用开发者可能会提供自身的UserDetails实现类,这时userPropertyToUse属性的取值范围更加广泛。
6、 在web.xml中,我提供了三种方式方便大家调试
<!-- <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-acegi-security-plaintext.xml </param-value> </context-param> --> <!-- <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-acegi-security-sha.xml </param-value> </context-param> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-acegi-security-md5.xml </param-value> </context-param> <!-- <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/applicationContext-acegi-security-md5-salt.xml </param-value> </context-param>-->
7、 这里我提供了一个用于生成加密密码的类
package org.acegi.sample; import org.acegisecurity.providers.encoding.Md5PasswordEncoder; import org.acegisecurity.providers.encoding.MessageDigestPasswordEncoder; import org.acegisecurity.providers.encoding.ShaPasswordEncoder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 加密管理类 * * @author zhanjia * */ public class PasswordProcessing { private static final Log log = LogFactory.getLog(PasswordProcessing.class); public static void processMd5() { log.info("以MD5方式加密......................"); // 直接指定待采用的加密算法(MD5) MessageDigestPasswordEncoder mdpeMd5 = new MessageDigestPasswordEncoder("MD5"); // 生成32位的Hex版, 这也是encodeHashAsBase64的默认值 mdpeMd5.setEncodeHashAsBase64(false); log.info(mdpeMd5.encodePassword("password", null)); // 生成24位的Base64版 mdpeMd5.setEncodeHashAsBase64(true); log.info(mdpeMd5.encodePassword("password", null)); // 等效于上述代码 Md5PasswordEncoder mpe = new Md5PasswordEncoder(); mpe.setEncodeHashAsBase64(false); log.info(mpe.encodePassword("password", null)); mpe.setEncodeHashAsBase64(true); log.info(mpe.encodePassword("password", null)); } public static void processSha() { log.info("以SHA方式加密......................"); // 直接指定待采用的加密算法(SHA)及加密强度(256) MessageDigestPasswordEncoder mdpeSha = new MessageDigestPasswordEncoder("SHA-256"); mdpeSha.setEncodeHashAsBase64(false); log.info(mdpeSha.encodePassword("password", null)); mdpeSha.setEncodeHashAsBase64(true); log.info(mdpeSha.encodePassword("password", null)); // 等效于上述代码 ShaPasswordEncoder spe = new ShaPasswordEncoder(256); spe.setEncodeHashAsBase64(false); log.info(spe.encodePassword("password", null)); spe.setEncodeHashAsBase64(true); log.info(spe.encodePassword("password", null)); } public static void processSalt() { log.info("以MD5方式加密、加私钥(盐)......................"); Md5PasswordEncoder mpe = new Md5PasswordEncoder(); mpe.setEncodeHashAsBase64(false); // 等效的两行地代码 log.info(mpe.encodePassword("password{javaee}", null)); // javaee为密码私钥 log.info(mpe.encodePassword("password", "javaee")); // javaee为密码私钥 // 结果:87ce7b25b469025af0d5c6752038fb56 } /** * @param args */ public static void main(String[] args) { processMd5(); processSha(); processSalt(); } }
开发环境:
MyEclipse 5.0GA
Eclipse3.2.1
JDK1.5.0_10
tomcat5.5.23
acegi-security-1.0.7
Spring2.0
Jar包:
acegi-security-1.0.7.jar
Spring.jar(2.0.8)
commons-codec.jar
jstl.jar (1.1)
standard.jar
commons-logging.jar(1.0)
- 例子源码_5_Acegi4.rar (17 KB)
- 下载次数: 616
评论
有些加密算法是可逆的,有些是不可逆的。
不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。所以比较安全
理解有误啊,是因为我觉得自己还是菜鸟。
意思是说:我是 菜鸟,我手把手教你...
请原谅啊,不要误导了人家,罪过...
数据验证,同样加密验证好啦,不用解密吧..
<property name="userDetailsService" ref="userDetailsService" />
这里的inMemDaoImpl, userDetailsService实现有没有什么要求? 是否必须是spring 的 DaoSupport 的实现? 自己的dao规范可否?
可以自己提供,也有一定的规范,请参考:
菜鸟-手把手教你把Acegi应用到实际项目中(8)-扩展UserDetailsService接口
http://zhanjia.iteye.com/blog/259441
<property name="userDetailsService" ref="userDetailsService" />
这里的inMemDaoImpl, userDetailsService实现有没有什么要求? 是否必须是spring 的 DaoSupport 的实现? 自己的dao规范可否?
发表评论
-
菜鸟-手把手教你把Acegi应用到实际项目中(12)-Run-As认证服务
2008-11-25 18:00 4649有这样一些场合,系统用户必须以其他角色身份去操作某 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(11)-切换用户
2008-11-15 23:48 4260在某些应用场合中,我们可能需要用到切换用户的功能, ... -
菜鸟-手把手教你把Acegi应用到实际项目中(10)-保护业务方法
2008-11-09 00:35 4475前面已经讲过关于保护Web资源的方式,其中包括直接 ... -
菜鸟-教你把Acegi应用到实际项目(9)-实现FilterInvocationDefinition
2008-11-02 11:34 7868在实际应用中 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(8)-扩展UserDetailsService接口
2008-10-29 13:04 13222一个能为DaoAuthenticationProv ... -
菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
2008-10-28 21:52 4517首先讲讲EhCache ... -
菜鸟-手把手教你把Acegi应用到实际项目中(6)
2008-10-26 22:51 5954在企业应用中,用户的用户名、密码和角色等信 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(4)
2008-10-23 22:27 7667今天就讲个ConcurrentSessionFilte ... -
菜鸟-手把手教你把Acegi应用到实际项目中(3)
2008-10-20 23:04 7576这一节我们将要了解的是AnonymousPro ... -
菜鸟-手把手教你把Acegi应用到实际项目中(2)
2008-10-16 23:16 7259上一篇是基于BasicProcessingFil ... -
菜鸟-手把手教你把Acegi应用到实际项目中(1.2)
2008-10-16 02:20 77767) daoAuthenticationProvider 进 ... -
菜鸟-手把手教你把Acegi应用到实际项目中(1.1)
2008-10-16 02:13 10742相信不少朋友们对于学 ...
相关推荐
在“菜鸟-手把手教你把Acegi应用到实际项目中(3)”这篇博文中,博主可能会深入讲解如何将 Acegi 集成到实际的项目中,为读者提供一个逐步的指南。下面,我们将探讨 Acegi 的核心概念、配置以及在项目中的应用。 1. ...
本教程将引导初学者逐步了解如何在实际项目中应用Acegi安全框架,以便为你的Web应用提供强大的身份验证和授权功能。 首先,让我们理解Acegi的基础概念。Acegi的核心组件包括SecurityContext、Authentication和...
在本文中,我们将深入理解如何将Acegi应用到实际项目中,特别关注其核心配置——web.xml中的过滤器设置和Acegi安全文件的配置。 首先,我们来看web.xml中的过滤器配置: 1. **FilterToBeanProxy**:Acegi通过...
在使用这个压缩包时,首先需要将其解压,然后将`acegi-security-tiger-1.0.0-RC2.jar`添加到项目的类路径中。如果项目是基于Spring的,需要在配置文件中启用Acegi Security,并根据应用需求配置相应的安全策略。同时...
包含acegi-security-1.0.7.jar,acegi-security-1.0.7-sources.jar,acegi-security-cas-1.0.7.jar,acegi-security-cas-1.0.7-sources.jar,acegi-security-catalina-1.0.7.jar,acegi-security-catalina-1.0.7-...
这个"acegi-sample.rar_acegi"项目提供了一个详细的示例,帮助开发者理解并应用Acegi框架的核心功能。下面我们将深入探讨Acegi的主要特性及其在实际开发中的应用。 1. **认证与授权**: Acegi框架的核心是它对用户...
通过学习Acegi,我们可以了解到Web应用安全的基本思路和实践方法,这对于理解现代的Spring Security框架非常有帮助。虽然Acegi已经不再更新,但它的理念和架构仍对现代安全框架设计产生深远影响。
acegi-security 1.0.2.jar
Acegi是一个专门为SpringFramework提供安全机制的项目,全称为Acegi Security System for Spring.
这个压缩包中的"acegi-sample"部分可能包含了一个示例项目,展示了如何在实际应用中配置和使用Acegi Security。而"spring-1.2.4.jar"则是Spring框架的一个较旧版本,表明Acegi Security是在Spring 1.x时代设计的,那...
acegi-security-0.8.3驱动程序
在本教程中,作者旨在帮助那些在学习Acegi过程中遇到困难的开发者,通过一步步的指导,使他们能够成功地将Acegi集成到实际项目中,并理解其核心配置和工作原理。 首先,Acegi的配置是其难点之一,因为涉及许多不同...
这篇博客将深入解析一个配置了Acegi Security的`applicationContext-acegi-security.xml`文件,帮助我们理解如何将LDAP与Acegi集成以实现更安全的Web应用。 **LDAP基础** LDAP是一种标准的网络协议,用于存储和...
标题“spring的acegi应用”指的是在Spring框架中使用Acegi安全模块进行权限管理和用户认证的一个主题。Acegi是Spring早期的一个安全组件,后来发展成为Spring Security,是Spring生态系统中的重要部分,用于提供全面...
它在Spring框架的基础上构建了一套完整的安全解决方案,使开发者能够方便地集成到自己的应用中,确保用户访问权限的有效控制和数据安全。 Acegi Security 1.0.7是该组件的一个稳定版本,其核心功能包括身份验证、...
"acegi-security-0.6.1.jar"是Acegi Security的主库文件,包含了所有必要的类和资源,使得开发者能够将安全功能集成到他们的Spring应用中。这个JAR文件可以被添加到应用的类路径中,以便在运行时加载和使用Acegi ...
在实际应用中,开发者可以通过创建自定义的`AuthenticationProvider`实现特定的身份验证逻辑,或者通过扩展`AbstractAccessDecisionManager`来自定义授权策略。此外,还可以利用`FilterSecurityInterceptor`进行URL...