Spring ACEGI
作为Spring丰富生态系统中的一个非常典型的应用,安全框架Spring ACEGI的使用是非常普遍的。尽管它不属于Spring平台的范围,但由于它建立在Spring的基础上,因此可以方便地与Spring应用集成,从而 方便的为基于Spring的应用提供安全服务。
作为一个完整的Java EE安全应用解决方案,ACEGI能够为基于Spring构建的应用项目,提供全面的安全服务,它可以处理应用需要的各种典型的安全需求;例如,用户的身 份验证、用户授权,等等。ACEGI因为其优秀的实现,而被Spring开发团队推荐作为Spring应用的通用安全框架,随着Spring的广泛传播而 被广泛应用。在各种有关Spring的书籍,文档和应用项目中,都可以看到它活跃的身影。
Spring ACEGI的基本实现
关于ACEGI的基本设置,在这里就不多啰嗦了。我们关心的是ACEGI是怎样实现用户的安全需求的,比如最基本的用户验证,授权的工作原理和实现。
在ACEGI配置中,是通过AuthenticationProcessingFilter的过滤功能来启动Web页面的用户验证实现的。 AuthenticationProcessingFilter过滤器的基类是AbstractProcessingFilter,在这个 AbstractProcessingFilter的实现中,可以看到验证过程的实现模板,在这个实现模板中,可以看到它定义了实现验证的基本过程,如以 下代码所示:
Java代码
01.
public
void
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
02.
throws
IOException, ServletException {
03.
04.
if
(!(request
instanceof
HttpServletRequest)) {
05.
throw
new
ServletException(
"Can only process HttpServletRequest"
);
06.
}
07.
08.
if
(!(response
instanceof
HttpServletResponse)) {
09.
throw
new
ServletException(
"Can only process HttpServletResponse"
);
10.
}
11.
12.
HttpServletRequest httpRequest = (HttpServletRequest) request;
13.
HttpServletResponse httpResponse = (HttpServletResponse) response;
14.
15.
if
(requiresAuthentication(httpRequest, httpResponse)) {
16.
if
(logger.isDebugEnabled()) {
17.
logger.debug(
"Request is to process authentication"
);
18.
}
19.
20.
Authentication authResult;
21.
22.
try
{
23.
onPreAuthentication(httpRequest, httpResponse);
24.
25.
authResult = attemptAuthentication(httpRequest);
26.
}
catch
(AuthenticationException failed) {
27.
28.
unsuccessfulAuthentication(httpRequest, httpResponse, failed);
29.
30.
return
;
31.
}
32.
33.
34.
if
(continueChainBeforeSuccessfulAuthentication) {
35.
chain.doFilter(request, response);
36.
}
37.
38.
successfulAuthentication(httpRequest, httpResponse, authResult);
39.
40.
return
;
41.
}
42.
43.
chain.doFilter(request, response);
44.
}
在看到上面的对WEB页面请求的拦截后,处理开始转到ACEGI框架中后台了,我们看到,完成验证工作的主要类在ACEGI中是AuthenticationManager。如以下代码所示:
Java代码
01.
public
final
Authentication authenticate(Authentication authRequest)
02.
throws
AuthenticationException {
03.
try
{
04.
05.
Authentication authResult = doAuthentication(authRequest);
06.
copyDetails(authRequest, authResult);
07.
return
authResult;
08.
}
catch
(AuthenticationException e) {
09.
e.setAuthentication(authRequest);
10.
throw
e;
11.
}
12.
}
13.
14.
15.
16.
17.
18.
private
void
copyDetails(Authentication source, Authentication dest) {
19.
if
((dest
instanceof
AbstractAuthenticationToken) && (dest.getDetails() ==
null
)) {
20.
AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;
21.
22.
token.setDetails(source.getDetails());
23.
}
24.
}
25.
protected
abstract
Authentication doAuthentication(Authentication authentication)
26.
throws
AuthenticationException;
而读取用户信息的操作,我们举大家已经很熟悉的DaoAuthenticationProvider作为例子。可以看到,在配置的JdbcDaoImpl中,定义了读取用户数据的操作,如以下代码所示:
Java代码
01.
public
static
final
String DEF_USERS_BY_USERNAME_QUERY =
"SELECT username,password,enabled FROM users WHERE username = ?"
;
02.
public
static
final
String DEF_AUTHORITIES_BY_USERNAME_QUERY =
"SELECT username,authority FROM authorities WHERE username = ?"
;
03.
public
UserDetails loadUserByUsername(String username)
04.
throws
UsernameNotFoundException, DataAccessException {
05.
06.
List users = usersByUsernameMapping.execute(username);
07.
08.
if
(users.size() ==
0
) {
09.
throw
new
UsernameNotFoundException(
"User not found"
);
10.
}
11.
12.
UserDetails user = (UserDetails) users.get(
0
);
13.
14.
List dbAuths = authoritiesByUsernameMapping.execute(user.getUsername());
15.
16.
addCustomAuthorities(user.getUsername(), dbAuths);
17.
18.
if
(dbAuths.size() ==
0
) {
19.
throw
new
UsernameNotFoundException(
"User has no GrantedAuthority"
);
20.
}
21.
22.
GrantedAuthority[] arrayAuths = (GrantedAuthority[]) dbAuths.toArray(
new
GrantedAuthority[dbAuths.size()]);
23.
24.
String returnUsername = user.getUsername();
25.
26.
if
(!usernameBasedPrimaryKey) {
27.
returnUsername = username;
28.
}
29.
30.
return
new
User(returnUsername, user.getPassword(), user.isEnabled(),
true
,
true
,
true
, arrayAuths);
31.
}
ACEGI授权器的实现
ACEGI就像一位称职的,负责安全保卫工作的警卫,在它的工作中,不但要对来访人员的身份进行检查(通过口令识别身份),还可以根据识别出来的 身份,赋予其不同权限的钥匙,从而可以去打开不同的门禁,得到不同级别的服务。从这点上看,与在这个场景中的“警卫”人员承担的角色一样,ACEGI在 Spring应用系统中,起到的也是类似的保卫系统安全的作用,而验证和授权,就分别对应于警卫识别来访者身份和为其赋予权限的过程。
为用户授权是由AccessDecisionManager授权器来完成的,授权的过程,在授权器的decide方法中实现,这个decide 方法是AccessDecisionManger定义的一个接口方法,通过这个接口方法,可以对应好几个具体的授权器实现,对于授权器完成决策的规则实 现,在这里,我们以AffirmativeBased授权器为例,看看在AffirmativeBased授权器中,实现的一票决定授权规则是怎样完成 的,这个实现过程,如以下代码所示:
Java代码
01.
public
void
decide(Authentication authentication, Object object, ConfigAttributeDefinition config)
02.
throws
AccessDeniedException {
03.
04.
Iterator iter =
this
.getDecisionVoters().iterator();
05.
int
deny =
0
;
06.
07.
while
(iter.hasNext()) {
08.
09.
AccessDecisionVoter voter = (AccessDecisionVoter) iter.next();
10.
int
result = voter.vote(authentication, object, config);
11.
12.
13.
switch
(result) {
14.
case
AccessDecisionVoter.ACCESS_GRANTED:
15.
return
;
16.
17.
case
AccessDecisionVoter.ACCESS_DENIED:
18.
deny++;
19.
20.
break
;
21.
22.
default
:
23.
break
;
24.
}
25.
}
26.
27.
if
(deny >
0
) {
28.
throw
new
AccessDeniedException(messages.getMessage(
"AbstractAccessDecisionManager.accessDenied"
,
29.
"Access is denied"
));
30.
}
31.
32.
33.
checkAllowIfAllAbstainDecisions();
34.
}
可以看到,在ACEGI的框架实现中,应用的安全需求管理,主要是由过滤器、验证器、用户数据提供器、授权器、投票器,这几个基本模块的协作一起完成的。 这几个基本模块的关系,刻画出了ACEGI内部架构的基本情况,也是我们基于ACEGI实现Spring安全应用,需要重点关注的地方。
分享到:
相关推荐
在提供的压缩包文件中,可能包含了 Spring Acegi 3 的官方文档,这将帮助开发者深入理解框架的工作原理和使用方法。文档通常会涵盖安装指南、配置示例、API 参考等内容,对于学习和使用 Spring Acegi 3 极为重要。...
**Spring Acegi(2)** 在Java Web开发中,...如果你正在使用或学习Spring Acegi,了解其原理和实践对于理解Spring Security也会大有帮助。在实际项目中,应优先考虑升级到Spring Security,以利用其最新的安全特性。
虽然现在Spring Security已经发展得更加完善,但理解Spring ACEGI的基本原理和操作模式对于熟悉Spring Security的安全机制仍然很有帮助。在实际开发中,了解并掌握这些知识,可以帮助我们构建更安全、更健壮的应用...
虽然已经被 Spring Security 取代,但理解其原理对于深入学习 Spring Security 或其他安全框架仍具有重要的参考价值。在实际开发中,我们需要结合具体需求,合理配置和使用这些安全工具,以保护我们的应用程序免受...
而在安全方面,Spring曾提供了一个名为Acegi Security的模块,它是Spring早期的一个安全解决方案,用于实现复杂的认证和授权需求。本文将深入探讨Spring的Acegi应用及其核心概念。 **1. Acegi Security简介** Acegi...
ACEGI安全框架是一种基于Spring的应用安全框架,其设计目标是为了更好地管理和保护Web应用程序的安全性。本篇文章将通过对一个典型的身份验证流程的场景分析来深入探讨ACEGI的设计原理。 **1. 用户输入身份信息** ...
Acegi Security基于Spring AOP(面向切面编程)原理,允许开发者通过声明式的方式定义安全策略,无需编写大量的安全代码。它主要由以下组件组成: 1. **AuthenticationManager**: 负责用户身份验证,包括用户名和...
Acegi Security正是基于Spring的AOP能力来实现其安全机制的。 Acegi Security的核心目标是提供一种灵活且可扩展的安全模型,它允许开发者对Spring应用进行细粒度的控制,包括用户身份验证、权限检查以及会话管理等...
Acegi 安全框架是 Spring 生态系统早期的安全解决方案,它为基于 Java 的...不过,了解 Acegi 的配置有助于理解 Spring Security 的基本原理。在实际项目中,你应该考虑迁移至 Spring Security,以获得最新的安全特性。
Acegi Security是Spring框架早期的一个安全模块,它为Spring应用提供了强大的访问控制和身份...虽然现在已经被Spring Security替代,但其基本原理和工作模式对于理解现代Spring应用的安全架构依然有重要的参考价值。
然而,了解Acegi的安全机制对于理解Spring Security的工作原理非常有帮助。本篇将深入探讨如何在基于Spring的Web应用中集成并使用Acegi进行安全控制。 1. **Acegi简介**: Acegi是一个强大的、可配置的安全框架,...
Acegi Security,现已被Spring Security所取代,是Java EE应用程序中的一个强大且灵活的权限管理框架。它提供了全面的身份验证、授权和访问...然而,理解Acegi的基本原理对于理解Spring Security仍然是非常有帮助的。
在本章节中,我们将深入探讨Acegi的整体架构,并对其实现原理进行解析。 ##### 1.1 开始前须知 在开始配置Acegi之前,你需要确保已经熟悉Spring框架的基本概念。同时,了解一些基本的安全管理概念也是必要的,比如...
Acegi的主要目标是将系统的安全逻辑从核心业务代码中分离出来,以实现更清晰的架构。它提供了多种认证和授权策略,包括基于URL的WEB资源访问控制、业务方法调用访问控制以及领域对象访问控制(ACL)。此外,它还...
综上所述,通过这份文档,读者能够全面了解Acegi安全系统的基础知识和高级特性,特别是如何在Spring应用程序中实现和配置不同类型的认证机制。这对于希望在Web应用程序中实施安全控制的开发人员来说,是一份宝贵的...
"Acegi框架总结(一) - Spring - Java - JavaEye论坛.mht"可能是一个系列文章的开头,全面总结了Acegi框架的核心特性,可能包括其工作原理、核心组件以及与Spring的集成方式。这样的总结对于理解和掌握Acegi的整体...
虽然Acegi Security已经被Spring Security取代,但理解其工作原理和机制对于理解现代Java应用的安全实践仍然很有价值。Spring Security在Acegi的基础上进行了扩展和优化,提供了更强大的安全特性,如支持OAuth2、JWT...
通过深入学习Acegi,你可以了解Spring Security的基本架构和原理,这对于理解现代的Spring Security配置和使用非常有帮助。尽管Acegi已不再更新,但其思想和技术仍在Spring Security中得到沿用和发展。如果你正在...
Acegi Security是一款已退役的安全框架,它在早期的...在当前的开发环境中,虽然我们更多地转向Spring Security,但理解Acegi Security可以帮助我们更好地理解和使用Spring Security,以及掌握Web应用安全的基本原理。