- 浏览: 97157 次
- 性别:
- 来自: 南京
文章分类
最新评论
Spring的Acegi security的配置,和JDK1.5的一些问题
新的项目没有开始于是抽空做一个通用一些的Security,后来又考虑到CAS和SSL的认证问题俺还没有弄懂,就选择直接使用Spring的子项目acegi
acegi是基于Spring的的一个安全框架,支持HTTP基本(basic)验证、HTTP Request Session验证、安全通道、ACL等等,功能强大。配置比较简单,但是还是要写一下:
1. 下载Spring Acegi的jar文件和它的源代码,在它的binary包中有一个contacts.war,这个是acegi的示例,把它放在tomcat的webapps下直接运行即可,这个是acegi很好的参考。
2. 将acegi的Http Servlet Filter配置在web.xml中。
<!-- Acegi Security-->
<filter>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.util.FilterChainProxy</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Acegi Filter Chain Proxy</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. 将contract示例下的applicationContext-acegi-security.xml放在ClassPath下或WEB-INF下,并且在web.xml中指出该文件的位置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/net/chinasam/common/applicationContext-*.xml
/WEB-INF/ applicationContext-acegi-security.xml</param-value>
</context-param>
4. 在applicationContext-acegi-security.xml中找到下面的bean定义
<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
可以看到dataSource属性必须引用一个DataSource,修改这个bean,是之使用一个Spring管理的DataSource实例。JdbcDaoImpl是查询数据库的实现类,这个类使用下面的SQL进行查询:
"SELECT username,password,enabled FROM users WHERE username = ?";
"SELECT username,authority FROM authorities WHERE username = ?";
前者查询用户,后者查询角色,你可以根据实际项目的情况进行修改:设置JdbcDaoImpl的authoritiesByUsernameQuery和usersByUsernameQuery属性。这个我没有设置过,因为我的数据库结构和这个一样。Acegi没有包含用户管理,关于User的CRUD你必须自己完成,然后通过这两个属性告诉acegi如何查询用户和角色。
5. 密码编码,经常需要给密码进行编码,常用的算法包括MD5,SHA等,applectionContext –acegi-Security.xml中的配置为:
<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder" />
注意,如果使用上述配置,数据库中的password字段内容必须是实际内容的MD5摘要。
6. ApplicationContext-acegi-securtiy.xml缺省的使用HTTP Request验证,也就是通过普通的HTML标单提交用户名和口令,所以你必须编写自己的login页面,以下是一个例子,注意黑体字部分:
<form name="login_form"action="<c:urlvalue='j_acegi_security_check'/>"method="POST">
<table width="241" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td><img src="<fmt:messagekey="login.title.img"/>"width="241" height="26"></td>
</tr>
<tr>
<td>
<table width="241" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="1" bgcolor="#D2DBE8"></td>
<td align="left"> <fmt:message key="username"/></td>
<tdalign="left">
<input type="text" class="text" name="j_username"></td>
<td rowspan="4">
<img src="<fmt:messagekey="login.button.img"/>"onclick="javascript:login_form.submit()" style="cursor:hand">
</td>
<td width="1" bgcolor="#D2DBE8"></td>
</tr>
<tr>
<td width="1" bgcolor="#D2DBE8"></td>
<td align="left"> <fmt:message key="password"/></td>
<td align="left"><input type="password" class="text" name="j_password"></td>
<td width="1" bgcolor="#D2DBE8"></td>
<tr>
<td width="1" bgcolor="#D2DBE8"></td>
<td align="left" colspan="3"> <fmt:message key="rememberme"/>
<input type="checkbox" name="_acegi_security_remember_me"></td>
<td width="1" bgcolor="#D2DBE8"></td>
</tr>
</table>
</td></tr>
<c:if test="${! empty param.login_error}">
<tr><td><br>
<fmt:message key="login.failed"/>
<%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %>
</td> </tr></c:if> </table></form>
最后,你需要配置URL权限,关于POJO的方法权限俺还没有弄懂,而且,如果不提供远程访问的情况下,一般来说也不需要。在ApplicationContext-acegi-securtiy.xml找到bean:filterInvocationInterceptor这个是基于Http Request验证的权限terceptor,注意设置bjectDefinitionSource属性,下面是例子,URL的格式是参考ANT的格式,也可以根据正则表达式的写法:
<property name="objectDefinitionSource">
<value>
<![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/index.faces=ROLE_SUPERVISOR,ROLE_ANONYMOUS,ROLE_USER
/login.jsp*=ROLE_SUPERVISOR,ROLE_ANONYMOUS,ROLE_USER
/images/*.*=ROLE_SUPERVISOR,ROLE_ANONYMOUS,ROLE_USER
/common/*.*=ROLE_SUPERVISOR,ROLE_ANONYMOUS,ROLE_USER
/styles/*.*=ROLE_SUPERVISOR,ROLE_ANONYMOUS,ROLE_USER
/**=ROLE_USER
]]>
</value>
各个权限入口的顺序十分重要,注意必须把特殊的URL权限写在一般的URL权限之前。
7. Acegi 1.0是基于JDK1.5的,虽然你可以在1.4下使用,但是我还是把我的项目改为JDK1.5,没成想还出现了一些问题。另外JSTL的也不同了,如果你想使用EL,则必须这样引用core:
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
在JDK1.4下使用String.replaceFirst和replaceAll方法没有问题,但是在JDK1.5下却报IllegalArgumentException,getMessage指出Illegal group arguments,但是单独写测试类运行却没有任何问题,我只好些了自己的replace算法,可是总觉得应该使用JDK提供的,希望达人指教。
发表评论
-
规范的模板化项目架构管理
2012-05-03 23:31 738总在寻找项目开发简单化、标准化、统一化的开发管理方法,在项目 ... -
Java的ftp上传下载工具
2012-04-05 22:17 1611自己写的利用apache的net包写的ftp的上传、下 ... -
SmartGWT学习注意事项(一)
2012-03-31 20:42 1450首先表明,我 ... -
J2ME程序开发全方位基础讲解汇总
2007-08-03 14:19 556一、J2ME中需要的Java基础知识现在有大部分人,都是从零开 ... -
使用J2ME技术开发RPG游戏
2007-08-03 14:24 521RPG(角色扮演游戏)是手机游戏中的一类主要类型,也是相对来说 ... -
移动视频: QuickTime for Java API 入门
2007-08-05 12:45 572在 Java 平台上创建 iPod 视频内容 ... -
技术交流:QuickTime流媒体和Java(图)
2007-08-05 12:46 597这并不是即将问世的Quic ... -
JMF下载安装与支持格式
2007-08-05 12:47 829JMF开发进度不是很快,所以目前还是比较薄弱。 JMF,全名 ... -
搭建J2ME开发环境
2007-08-05 12:48 537由于WTK并没有提供代码编辑的功能,因此本文讲述如何使用Ecl ... -
JMF系统介绍
2007-08-09 15:18 623一.简介 1.1JMF 体系结构 ... -
Experiments in Streaming Content in Java ME(一)
2007-08-13 13:43 555Since my book on Mobile Media A ... -
Experiments in Streaming Content in Java ME(二)----Creating an RTSP Protocol Handler
2007-08-13 13:44 1413Recall that RTSP is the actual ... -
Experiments in Streaming Content in Java ME(三)-----Back to RTPSourceStream and StreamingDataSource
2007-08-13 13:46 1002With the protocol handler in pl ... -
java中文件操作大全
2007-08-22 15:40 536一.获得控制台用户输入的信息 /***//**获得控 ... -
Pocket PC、Pocket PC Phone、Smartphone的区别
2007-08-23 16:59 612首先说明几个概念: 1、什么是Pocket PC?Pocket ... -
Struts配置文件详解(来自csdn)
2007-11-30 08:35 474Struts应用采用两个基于X ... -
jBPM开发入门指南(5)
2007-11-30 08:45 460jBPM开发入门指南(5) 前篇说起要讲在JBPM中实现用 ... -
jBPM开发入门指南(4)
2007-11-30 08:48 536jBPM开发入门指南(4) 7 jBPM 的客户端 ... -
jBPM开发入门指南(3)
2007-11-30 08:51 5575 安装 jBPM 的 Eclipse 开发插件 有 ... -
jBPM开发入门指南(2)
2007-11-30 08:52 5564 数据库初始化 jBPM 需要数据库支持, jBPM ...
相关推荐
Spring Acegi权限控制,安全系统就只包括两个问题: 认证和授权.
Acegi Security System for Spring
spring Acegi例子,很简单的一个acegi实例,容易理解
如何定义spring security的安全认证框架,对url和系统类method进行过滤以及权限分配和控制
Acegi是一个专门为SpringFramework提供安全机制的项目,全称为Acegi Security System for Spring.
Acegi Security为基于J2EE的企业应用软件提供全面的安全解决方案。正如你在本手册中看到的那样,我们尝试为您提供有用的,高可配置的安全...熟悉Spring,尤其是依赖注射原理,会极大的帮助你快速掌握Acegi Security。
AcegiSecurity-1_0_6-Api 最新版本已经变更为Spring Security 2.0
如何定义spring security的安全认证框架,对url和系统类method进行过滤以及权限分配和控制(补充) 关于DataBaseFilterInvocationDefinitionSource.java的实现
spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行 spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行 spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行 spring_acegi精彩实例,带MYSQL数据库脚本,...
Spring安全系统:Acegi Security--星月夜
spring-security将是acegisecurity-1.0.7的下一个版本,acegi将不再出了
pring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。 Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件...
Spring安全系统:Acegi Security Acegi简介! Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,...
基于spring框架的安全认证组件
spring -acegi安全验证源码,
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。
通过此PPT可进行Acegi的配置,最新Spring security2.0的安全构建JAVA系统
Practical Quick Start with Acegi Security
acegi spring security前子项目
详细的spring security2.x配置