首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Acegi 运用笔记

2012-07-02 
Acegi 使用笔记[简介] Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java

Acegi 使用笔记

[简介]
Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java 企业应用程序编写大量的安全代码。虽然它专门针对使用 Spring 框架编写的应用程序,但是任何类型的 Java 应用程序都没有理由不去使用 Acegi。

?

Acegi Security System 使用安全过滤器来提供企业应用程序的身份验证和授权服务。该框架提供了不同类型的过滤器,可以根据应用程序的需求进行配置。您将在本文后面了解到 安全过滤器的不同类型;现在,只需注意可以为如下任务配置 Acegi 安全过滤器:

    在访问一个安全资源之前提示用户登录。

    通过检查安全标记(如密码),对用户进行身份验证。

    检查经过身份验证的用户是否具有访问某个安全资源的特权。

    将成功进行身份验证和授权的用户重定向到所请求的安全资源。

    对不具备访问安全资源特权的用户显示 Access Denied 页面。

    在服务器上记录成功进行身份验证的用户,并在用户的客户机上设置安全 cookie。使用该 cookie 执行下一次身份验证,而无需要求用户登录。

    将身份验证信息存储在服务器端的会话对象中,从而安全地进行对资源的后续请求。

    在服务器端对象中构建并保存安全信息的缓存,从而优化性能。

    当用户退出时,删除为用户安全会话而保存的服务器端对象。

    与大量后端数据存储服务(如目录服务或关系数据库)进行通信,这些服务用于存储用户的安全信息和 ECM 的访问控制策略。

正如这个列表显示的那样,Acegi 的安全过滤器允许您执行保护企业应用程序所需的几乎任何事情。

?

?

[基础工作]
在你的Web应用的lib中添加Acegi下载包中的acegi-security.jar

?

[web.xml]

在web.xml配置

?

[JdbcDaoImpl.java]

?

public class JdbcDaoImpl extends org.acegisecurity.userdetails.jdbc.JdbcDaoImpl {private String anonymousRoleName = "ROLE_ANONYMOUS";private Log logger = LogFactory.getLog(JdbcDaoImpl.class);private PreparedStatement userPstmt;private PreparedStatement rolePstmt;public UserDetails loadUserByUsername(String userName)throws UsernameNotFoundException, DataAccessException {UserDetails user = findUserByName(userName);if (user == null) {throw new UsernameNotFoundException("User not found");}return user;}private UserDetails findUserByName(String userName) {Connection connection = null;ResultSet rsUser = null;ResultSet rsRole = null;UserDetails user = null;String logonName = null;String password = null;String roleName = null;int status = -1;boolean enabled = false;Vector roles = null;GrantedAuthority[] rolesArray = null;try {connection = getDataSource().getConnection();userPstmt = connection.prepareStatement("select * from users where user_NAME=?");userPstmt.setString(1, userName);rsUser = userPstmt.executeQuery();if (rsUser.next()) {logonName = rsUser.getString("USER_NAME");password = rsUser.getString("PASSWORD");status = rsUser.getInt("STATUS");if (status == 1)enabled = true;} else {return null;}rolePstmt = connection.prepareStatement("SELECT ROLE.NAME Role FROM ROLE,  users_ROLES,  users WHERE ROLE.ID= user_ROLES.FK_ROLES  and users.user_NAME=?");rolePstmt.setString(1, userName);rsRole = rolePstmt.executeQuery();roles = new Vector();while (rsRole.next()) {roleName = getRolePrefix() + rsRole.getString("Role");roles.add(new GrantedAuthorityImpl(roleName));}rolesArray = new GrantedAuthority[roles.size() + 1];int index = 0;for (index = 0; index < roles.size(); index++)rolesArray[index] = (GrantedAuthority) roles.get(index);rolesArray[index] = new GrantedAuthorityImpl(anonymousRoleName);user = new User(logonName, password, enabled, true, true, true,rolesArray);} catch (SQLException e) {logger.fatal("", e);} finally {try {//关闭数据库连接的程序} catch (SQLException sqlx) {logger.fatal("", sqlx);} catch (NullPointerException x) {logger.fatal("", x);}}return user;}}

热点排行