- 浏览: 3502972 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
acegi到spring security的转换方式
作者 Chris.Baker,发表于 2008/04/22 - 9:44am.
http://java.dzone.com/tips/pathway-acegi-spring-security-
以前它叫做spring的acegi安全框架,现在重新标识为spring security 2.0,它实现了简易配置的承诺,提高了开发者的生产力。 它已经是java平台上应用最广的安全框架了,在sourceforge上拥有250,000的下载量,Spring Security 2.0又提供了一系列的新功能。
本文主要介绍了如果把之前建立在acegi基础上的spring应用转换到spring security 2.0上。
Spring Security是目前用于替换acegi的框架,它提供了一系列新的功能。
-
大为简化了配置
-
继承OpenID,标准单点登录
-
支持windows NTLM,在windows合作网络上实现单点登录
-
支持JSR 250("EJB 3")的安全注解
-
支持AspectJ切点表达式语言
-
全面支持REST Web请求授权
-
长期要求的支持组,层级角色和用户管理API
-
提升了功能,使用后台数据库的remember-me实现
-
通过spring webflow 2.0对web状态和流转授权进行新的支持
-
通过Spring Web Services 1.5加强对WSS(原来的WS-Security)的支持
-
整个更多的……
目前,我工作在一个spring的web应用上,使用acegi控制对资源的访问权限。 用户信息保存在数据库中,我们配置acegi使用了基于JDBC的UserDetails服务。 同样的,我们所有的web资源都保存在数据库里,acegi配置成使用自定义的AbstractFilterInvocationDefinitionSource,对每个请求检测授权细节。
随着Spring Security 2.0的发布,我想看看是不是可以替换acegi,但还要保持当前的功能,使用数据库作为我们验证和授权的数据源,而不是xml配置文件(大多数演示程序里使用的都是xml)。
这里是我采取的步骤……
-
第一步(也是最重要的)是下载新的Spring Security 2.0框架,并确保jar文件放到正确的位置(/WEB-INF/lib/)。
Spring Security 2.0下载包里包含22个jar文件。我不需要把它们全用上(尤其是那些sources包)。在这次练习中我仅仅包含了以下几个:
-
spring-security-acl-2.0.0.jar
-
spring-security-core-2.0.0.jar
-
spring-security-core-tiger-2.0.0.jar
-
spring-security-taglibs-2.0.0.jar
-
-
在web.xml文件里配置一个DelegatingFilterProxy
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
Spring Security 2.0的配置比acegi简单太多了,所以我没有在以前acegi配置文件的基础上进行修改,我发现从一个空白文件开始更简单。如果你想修改你以前的配置文件,我确定你删除的行数比添加的行数还要多。
配置文件的第一部分是指定安全资源过滤器的细节,这让安全资源可以通过数据库读取,而不是在配置文件里保存信息。这里是一个你将在大多数例子中看到的代码。
<http auto-config="true" access-denied-page="/403.jsp"> <intercept-url pattern="/index.jsp" access="ROLE_ADMINISTRATOR,ROLE_USER"/> <intercept-url pattern="/securePage.jsp" access="ROLE_ADMINISTRATOR"/> <intercept-url pattern="/**" access="ROLE_ANONYMOUS" /> </http>
使用这些内容进行替换:
<authentication-manager alias="authenticationManager"/> <beans:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased"> <beans:property name="allowIfAllAbstainDecisions" value="false"/> <beans:property name="decisionVoters"> <beans:list> <beans:bean class="org.springframework.security.vote.RoleVoter"/> <beans:bean class="org.springframework.security.vote.AuthenticatedVoter"/> </beans:list> </beans:property> </beans:bean> <beans:bean id="filterInvocationInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor"> <beans:property name="authenticationManager" ref="authenticationManager"/> <beans:property name="accessDecisionManager" ref="accessDecisionManager"/> <beans:property name="objectDefinitionSource" ref="secureResourceFilter" /> </beans:bean> <beans:bean id="secureResourceFilter" class="org.security.SecureFilter.MySecureResourceFilter" /> <http auto-config="true" access-denied-page="/403.jsp"> <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" /> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" default-target-url="/index.jsp" /> <logout logout-success-url="/login.jsp"/> </http>
这 段配置的主要部分secureResourceFilter,这是一个实现了FilterInvocationDefinitionSource的类,它 在Spring Security需要对请求页面检测权限的时候调用。这里是MySecureResouceFilter的代码:
package org.security.SecureFilter; import java.util.Collection; import java.util.List; import org.springframework.security.ConfigAttributeDefinition; import org.springframework.security.ConfigAttributeEditor; import org.springframework.security.intercept.web.FilterInvocation; import org.springframework.security.intercept.web.FilterInvocationDefinitionSource; public class MySecureResourceFilter implements FilterInvocationDefinitionSource { public ConfigAttributeDefinition getAttributes(Object filter) throws IllegalArgumentException { FilterInvocation filterInvocation = (FilterInvocation) filter; String url = filterInvocation.getRequestUrl(); // create a resource object that represents this Url object Resource resource = new Resource(url); if (resource == null) return null; else{ ConfigAttributeEditor configAttrEditor = new ConfigAttributeEditor(); // get the Roles that can access this Url List<Role> roles = resource.getRoles(); StringBuffer rolesList = new StringBuffer(); for (Role role : roles){ rolesList.append(role.getName()); rolesList.append(","); } // don't want to end with a "," so remove the last "," if (rolesList.length() > 0) rolesList.replace(rolesList.length()-1, rolesList.length()+1, ""); configAttrEditor.setAsText(rolesList.toString()); return (ConfigAttributeDefinition) configAttrEditor.getValue(); } } public Collection getConfigAttributeDefinitions() { return null; } public boolean supports(Class arg0) { return true; } }
getAttributes()方法返回权限的名称(我称之为角色),它们控制当前url的访问权限。
-
好了,现在我们需要安装信息数据库,下一步是让Spring Security从数据库中读取用户信息。这个Spring Security 2.0的例子告诉你如何从下面这样的配置文件里获得用户和权限的列表:
<authentication-provider> <user-service> <user name="rod" password="password" authorities="ROLE_SUPERVISOR, ROLE_USER" /> <user name="dianne" password="password" authorities="ROLE_USER,ROLE_TELLER" /> <user name="scott" password="password" authorities="ROLE_USER" /> <user name="peter" password="password" authorities="ROLE_USER" /> </user-service> </authentication-provider>
你可以把这些例子的配置替换掉,这样你可以像这样从数据库中直接读取用户信息:
<authentication-provider> <jdbc-user-service data-source-ref="dataSource" /> </authentication-provider>
这 里有一种非常快速容易的方法来配置安全数据库,意思是你需要使用默认的数据库表结构。默认情况下,<jdbc-user-service>需 要下面的几个表:user,authorities,groups,group_members和group_authorities。
我的情况下,我的安全数据库表无法这样工作,它和<jdbc-user-service>要求的不同,所以我需要修改<authentication-provider>:
<authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT U.username, U.password, U.accountEnabled AS 'enabled' FROM User U where U.username=?" authorities-by-username-query="SELECT U.username, R.name as 'authority' FROM User U JOIN Authority A ON u.id = A.userId JOIN Role R ON R.id = A.roleId WHERE U.username=?"/> </authentication-provider>
通 过添加users-by-username-query和authorities-by-username-query属性,你可以使用你自己的SQL覆 盖默认的SQL语句。就像在acegi中一样,你必须确保你的SQL语句返回的列与Spring Security所期待的一样。这里有另一个group-authorities-by-username-query属性,我在这里没有用到,所以也没 有出现在这里例子中,不过它的用法与其他两个SQl语句的方法完全一致。
<jdbc-user-service>的这些功能大概是在上个月才加入的,在Spring Security之前版本中是无法使用的。幸运的是它已经被加入到Spring Security中了,这让我们的工作更加简单。你可以通过 这里 和这里 获取信息。
dataSource bean中指示的是链接数据库的信息,它没有包含在我的配置文件中,因为它并不只用在安全中。这里是一个dataSource的例子,如果谁不熟悉可以参考一下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/db_name?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="pwd"/> </bean>
-
这 就是Spring Security的所有配置文件。我最后一项任务是修改以前的登陆页面。在acegi中你可以创建自己的登陆<form>,向正确的URL发 送正确命名的HTML输入元素。现在你也可以在Spring Security 2.0里这样做,只是一些名称发生了改变。你可以像以前一样使用用户名j_username和密码j_password。
<input type="text" name="j_username" id="j_username"/> <input type="password" name="j_password" id="j_password"/>
但是你必须把<form>中的action指向j_spring_security_check而不是j_acegi_security_check。
<form method="post" id="loginForm" action="<c:url value='j_spring_security_check'/>"
在你的应用中有一些地方,用户可以进行注销,这是一个链接把注销请求发送给安全框架,这样它就可以进行相应的处理。需要把它从j_acegi_logout改成j_spring_security_logout。
<a href='<c:url value="j_spring_security_logout"/>'>Logout</a>
这个简短的指南,包含了如何配置Spring Security 2.0使用数据库中的资源,它并没有演示Spring Security 2.0中的新特性,然而我想它可以演示一些非常常用的框架功能,我希望你们觉得它有用。
Spring Security 2.0与acegi相比的好处之一是配置文件非常简单,这在我比较老acegi配置文件(172行)和新配置文件(42行)的时候,清楚的显示出路爱。
这里是我完整的securityContext.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans,http://www.springframework.org/schema/beans/spring-beans-2.0.xsd,http://www.springframework.org/schema/security,http://www.springframework.org/schema/security/spring-security-2.0.xsd"> <authentication-manager alias="authenticationManager"/> <beans:bean id="accessDecisionManager" class="org.springframework.security.vote.AffirmativeBased"> <beans:property name="allowIfAllAbstainDecisions" value="false"/> <beans:property name="decisionVoters"> <beans:list> <beans:bean class="org.springframework.security.vote.RoleVoter"/> <beans:bean class="org.springframework.security.vote.AuthenticatedVoter"/> </beans:list> </beans:property> </beans:bean> <beans:bean id="filterInvocationInterceptor" class="org.springframework.security.intercept.web.FilterSecurityInterceptor"> <beans:property name="authenticationManager" ref="authenticationManager"/> <beans:property name="accessDecisionManager" ref="accessDecisionManager"/> <beans:property name="objectDefinitionSource" ref="secureResourceFilter" /> </beans:bean> <beans:bean id="secureResourceFilter" class="org.security.SecureFilter.MySecureResourceFilter" /> <http auto-config="true" access-denied-page="/403.jsp"> <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" /> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" default-target-url="/index.jsp" /> <logout logout-success-url="/login.jsp"/> </http> <beans:bean id="loggerListener" class="org.springframework.security.event.authentication.LoggerListener"/> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT U.username, U.password, U.accountEnabled AS 'enabled' FROM User U where U.username=?" authorities-by-username-query="SELECT U.username, R.name as 'authority' FROM User U JOIN Authority A ON u.id = A.userId JOIN Role R ON R.id = A.roleId WHERE U.username=?" /> </authentication-provider> </beans:beans>
就像在第一步时提到到,下载Spring Security是最重要的步骤。从那里开始就可以一帆风顺了。
发表评论
-
说明SOA监管(SOA Governance)实例(收录备查)
2012-12-19 11:35 1750SOA 已经不是单纯技术问 ... -
Injecting Spring Beans into Java Servlets
2012-11-01 10:21 1936If you are working in a Java ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3759原文出处:http://blog.chenlb.com/200 ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:17 3884When I try to install the And ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:13 1988When I try to install the And ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14841大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1711charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22625Java Native Access 项目 在 ... -
使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
2011-04-20 11:59 13362"在服务器运行过程中,Spring不停的运行的计划任 ... -
DBCP代码研读以及就数据库连接失效的解决
2011-03-31 11:03 3765问题 网上很多评论说DBCP有很多BUG,但是都没有指明是什 ... -
ContextLoaderListener
2010-12-06 15:58 8464(1) org.springframework.web.c ... -
Servlet3.0新功能: 异步处理
2010-12-06 15:22 3181J2EE 6和Glassfish 3V正式发 ... -
Servlet3.0引入的新特性
2010-12-06 15:20 3058Servlet3.0规范的新特性主要是为了3个目的: ... -
100個節點上運行群集亞馬遜EC2上Hazelcast
2010-12-03 23:59 3318本文的目的,適是给妳湮示的細節集群的100個節點。此湮示記錄, ... -
Spring Properties Reloaded
2010-12-02 14:54 4372Spring Properties Reloaded Som ... -
为spring2.5中的jpetstore增加perf4j监控
2010-09-02 13:51 2646perf4j是一款类似于log4j的性能检测工具. 它 ... -
语义网的学习资源大汇集(备忘)
2010-06-23 22:48 1734网上资源 http:/ ... -
使用 JOLAP 实现复杂分析查询
2010-06-06 13:42 1964Shashank Tiwari 在本文中对 ... -
HTML5 Canvas for Internet Explorer
2010-06-04 21:16 1857Canvascape http://www.benjoff ... -
大型网站架构演变和知识体系
2010-06-01 23:47 1970架构演变第一步:物 ...
相关推荐
2006 年,Acegi 被集成到 Spring 框架中,并改名为 Spring Security。自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 ...
在从Acegi安全框架转换到Spring Security 2.0时,一个重要的变化就是如何将授权信息存储从XML配置文件迁移到数据库。这使得授权策略更加灵活,易于管理和维护。 24.1. Spring Security简介 Spring Security 2.0...
在Spring框架中,Acegi Security作为一个插件存在,可以无缝集成到Spring的应用环境中,使得安全控制变得更为灵活和强大。 1. **身份验证**: Acegi Security支持多种身份验证机制,包括基于用户名和密码的数据库...
迁移过程中,主要任务是将Acegi的XML配置转换为Spring Security的配置,并调整使用的新API。 总结,Spring Acegi作为Spring Security的前身,为Java安全框架的发展奠定了坚实的基础。虽然不再被推荐使用,但其设计...
综上所述,Acegi Security(现称为Spring Security)提供了丰富的认证和授权机制,覆盖了从简单的表单认证到复杂的集中式认证等多种场景。开发者可以根据应用的实际需求选择合适的认证方式,并通过细致的配置实现...
Spring ACEGI是Spring Security的前身,它是一个强大的、高度可配置的安全框架,专为Java企业级应用设计。这个框架旨在提供全面的身份验证、授权和服务层安全功能,允许开发者轻松地在Spring应用中实现复杂的安全...
- **迁移策略**:如果现有的项目还在使用Acegi Security,开发者应该考虑迁移到Spring Security,以获得持续的支持和更新。 - **学习曲线**:虽然Acegi Security提供了强大的功能,但其配置相对复杂,需要花费时间...
4. **切面安全**:利用Spring的AOP(面向切面编程)特性,Acegi Security能够方便地将安全逻辑插入到应用程序的各个部分。通过定义安全拦截器,可以在方法调用之前和之后执行安全检查。 5. **事件驱动的安全模型**...
其前身Acegi在权限管理方面已经享有盛誉,因此Spring Security在发布之初便受到了极大的关注。 - **优势分析**: - **全面性**:Spring Security支持多种安全功能,如认证、授权等。 - **与Spring框架的高度集成**...
5. **Exception Translation**:Acegi Security将底层的安全异常转换为统一的Spring SecurityException,方便开发者处理和理解。 6. **Integration with Spring**:Acegi Security与Spring的集成非常紧密,可以无缝...
- **升级**:由于Acegi Security已被弃用,开发者应考虑升级到更现代的安全框架,如Spring Security,以获得持续的支持和更新。 - **配置**:理解并正确配置Acegi Security的XML配置文件,以定义安全规则和策略。 - ...
6. **异常处理**:Acegi Security将安全相关的异常转换为统一的Spring SecurityException,方便开发者处理。 7. **可配置性**:Acegi Security的配置主要通过XML完成,允许开发者通过XML配置文件定义安全策略,同时...
Grails Acegi 0.5插件正是基于这个理念,将Acegi Security的功能引入到Groovy语言和Grails框架中,使得Grails开发者也能享受到Spring Security的强大安全特性。 该插件的核心文件包括: 1. `AcegiGrailsPlugin....
### acegi源码解读:深度剖析Spring Security核心组件 #### 引言 在现代Web应用开发中,安全性是至关重要的一个方面。Spring Security作为Spring框架的一部分,提供了强大的安全功能,包括认证、授权、会话管理等...
Acegi是Spring框架的一个早期安全模块,后来演变为Spring Security,是Java企业级应用中广泛使用的安全解决方案。 在Java安全模型中,主要有以下几个关键知识点: 1. 访问控制:Java提供了访问控制机制,如类级别...
Acegi学习 ...总的来说,Acegi是一个强大的安全框架,它的设计理念和实现方式对于理解现代安全框架如Spring Security至关重要。通过深入学习Acegi,开发者能够更好地掌握企业级应用中的安全性设计和实践。
不过,随着Spring Security的推出,Acegi已经不再维护,建议新项目使用更新的Spring Security框架,它继承了Acegi的优点,并且拥有更多的特性和改进。在学习过程中,不断实践和调试是掌握Acegi的关键,同时参考官方...
通过AcegiDemo,开发者可以学习到如何在实际项目中实现和配置复杂的认证和授权逻辑,理解Acegi(Spring Security)的工作原理,这对于构建安全的Java应用至关重要。在实践中,可以根据需求调整和扩展AcegiDemo中的...