`
webdev2014
  • 浏览: 709538 次
文章分类
社区版块
存档分类
最新评论

acegi security实践教程—form认证

 
阅读更多
上篇博客给大家介绍了basic认证,同时也带领大家debug了一下源码,所以流程想必大家都已经了解了,那么现在只剩下各种认证的配置了。

具体步骤如下:

开发环境:

MyEclispe10.7.1+tomcat6.0.37+acegi1.0.5+spring2.0
项目目录如下: 其中readme主要用来记录本次验证目的

配置文件

web.xml:
 <?xml version="1.0" encoding= "UTF-8"?>
<web-app xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns= "http://java.sun.com/xml/ns/javaee" xmlns:web= "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version= "2.5">
  < display-name></display-name >
  <!-- spring 配置文件 -->
  < context-param>
    <param-name >contextConfigLocation </param-name >
    <param-value > 
            classpath:config/spring/spring-acegi.xml 
        </param-value >
  </ context-param>
 
  <!-- acegi对页面校验控制 -->
  < filter>
    <filter-name >AcegiFilterChainProxy </filter-name >
    <filter-class >
                org.acegisecurity.util.FilterToBeanProxy
            </filter-class >
    <init-param >
      <param-name >targetBean </param-name >
      <param-value >filterChainProxy </param-value >
    </init-param >
  </ filter>
  < filter-mapping>
    <filter-name >AcegiFilterChainProxy </filter-name >
    <url-pattern >/j_acegi_security_check </url-pattern >
  </ filter-mapping>
  < filter-mapping>
    <filter-name >AcegiFilterChainProxy </filter-name >
    <url-pattern >/j_acegi_logout </url-pattern >
  </ filter-mapping>
  < filter-mapping>
    <filter-name >AcegiFilterChainProxy </filter-name >
    <url-pattern >*.do </url-pattern >
  </ filter-mapping>
  < filter-mapping>
    <filter-name >AcegiFilterChainProxy </filter-name >
    <url-pattern >*.jsp </url-pattern >
  </ filter-mapping>
 
 
  < welcome-file-list>
      <welcome-file >index.jsp </welcome-file >
  </ welcome-file-list>
 
  <!-- spring配置 -->
  < listener>
       <listener-class >
        org.springframework.web.context.ContextLoaderListener
       </listener-class >
 </ listener>
</web-app> 

acegi配置文件:
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns= "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" >
     
     <!-- 通过过滤连形式,acegi提供很多filter,其中过滤器执行也有一定的顺序 ,同事支持正则和ant匹配-->
     
     <bean id ="filterChainProxy" class= "org.acegisecurity.util.FilterChainProxy" >
            <property name ="filterInvocationDefinitionSource">
                 <value >
                     PATTERN_TYPE_APACHE_ANT
                     /**=authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
                 </value >
            </property >
     </bean >

           
 <!-- 表单认证处理filter -->  
     <bean id ="authenticationProcessingFilter" class= "org.acegisecurity.ui.webapp.AuthenticationProcessingFilter" > 
        <!-- 认证管理器,然后委托给Provides -->
        <property name ="authenticationManager" ref= "authenticationManager"/> 
        <!-- 认证失败后转向的url,包含出错信息的的登陆页面 -->
        <property name ="authenticationFailureUrl" value= "/login.jsp?login_error=1"/> 
        <!-- 登陆成功后转向的url -->
        <property name ="defaultTargetUrl" value= "/userinfo.jsp"/> 
        <!-- 登陆的url,这个是默认的acegi自带的 -->
        <property name ="filterProcessesUrl" value= "/j_acegi_security_check"/> 
    </bean >
     
     <bean id ="authenticationManager"
            class= "org.acegisecurity.providers.ProviderManager" >
            <property name ="providers">
                 <list >
                      <ref local ="daoAuthenticationProvider" />
                 </list >
            </property >
     </bean >
     
     
    <!-- 从数据库中读取用户信息验证身份 -->
     <bean id ="daoAuthenticationProvider"
           class= "org.acegisecurity.providers.dao.DaoAuthenticationProvider" >
            <property name ="userDetailsService" ref= "inMemDaoImpl" />
     </bean >

    <!-- 基于内存实现方式-->
     <bean id ="inMemDaoImpl"
           class= "org.acegisecurity.userdetails.memory.InMemoryDaoImpl" >
            <property name ="userMap">
                 <value >
                     test=1,ROLE_USER
                     lisi=1,ROLE_SUPERVISOR
                     zhangsan=1,ROLE_SUPERVISOR,disabled
                 </value >
            </property >
     </bean >
     
     <!-- exception filter -->
   <bean id ="exceptionTranslationFilter" class= "org.acegisecurity.ui.ExceptionTranslationFilter" >
     <!-- 尚未登录, 进入非法(未认证不可访问)区域 -->  
        <property name ="authenticationEntryPoint">  
            <bean class= "org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint" > 
                <property name ="loginFormUrl" value= "/login.jsp"/>  <!--若没登陆,则转向 用户登陆页面 -->
                <property name ="forceHttps" value="false"/>   <!-- 是否强制使用https -->
            </bean > 
        </property >
     <!-- 登录后, 进入非授权区域 -->
        <property name ="accessDeniedHandler">  
            <bean class= "org.acegisecurity.ui.AccessDeniedHandlerImpl" > 
                <property name ="errorPage" value= "/accessDenied.jsp"/>  <!-- 进入无权限页面 ,根据需求写相应的信息-->
            </bean > 
        </property > 
    </bean >     
     
   <bean id ="filterInvocationInterceptor"
           class= "org.acegisecurity.intercept.web.FilterSecurityInterceptor" >
            <property name ="authenticationManager" ref= "authenticationManager" />
            <property name ="accessDecisionManager" ref= "httpRequestAccessDecisionManager" />
            <property name ="objectDefinitionSource">
                 <value ><![CDATA[
                     CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                     PATTERN_TYPE_APACHE_ANT
                     /userinfo.jsp=ROLE_SUPERVISOR
                 ]]></value>
            </property >
     </bean >

     <bean id ="httpRequestAccessDecisionManager"
            class= "org.acegisecurity.vote.AffirmativeBased" >
            <property name ="decisionVoters">
                 <list >
                      <bean class= "org.acegisecurity.vote.RoleVoter" />
                 </list >
            </property >
     </bean >
</beans>


讲解如下:

filterInvocationInterceptor配置了受保护的资源,访问userinfo.jsp则需要ROLE_SUPERVISOR权限。而其他的资源则不需要保护。
表单authenticationProcessingFilter认证,也是依靠认证管理器,并委托给Provider来实现。
<beanid="authenticationProcessingFilter"class= "org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<!-- 认证管理器,然后委托给Provides -->
<propertyname="authenticationManager"ref="authenticationManager"/>
<!-- 认证失败后转向的url,包含出错信息的的登陆页面 -->
<propertyname="authenticationFailureUrl"value="/login.jsp?login_error=1"/>
<!-- 登陆成功后转向的url -->
<propertyname="defaultTargetUrl"value="/userinfo.jsp"/>
<!-- 登陆的url,这个是默认的acegi自带的 -->
<propertyname="filterProcessesUrl"value="/j_acegi_security_check"/>
</bean>
其中的exception异常fiter,若没登陆,则转向登陆页面;若登陆了却访问了无权限资源,则转向accessDefined页面。

页面如下:

userinfo.jsp:显示用户信息
因为SecurityContextHolder容器中存放securitycontext,其中securitycontext存放Authentication对象。实际上Authentication和UserDetails很相似,只不过从后台取出来UserDetails转换到Authentication对象,存放到securitycontext
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import= "org.acegisecurity.context.SecurityContextHolder" %> 
<%@ page import ="org.acegisecurity.userdetails.*"%>  
<html>
<head>
<meta http-equiv= "Content-Type" content ="text/html; charset=UTF-8">
<title> 当前用户的具体信息 </title >
</head>
<body>
        当前用户: 
        <% 
            Object obj = SecurityContextHolder.getContext().getAuthentication();         
            if ( null != obj){ 
                Object userDetail = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
                String username = ""; 
                String pwd= "";
                if (userDetail instanceof UserDetails) { 
                    username = ((UserDetails) userDetail).getUsername(); 
                    pwd = ((UserDetails) userDetail).getPassword(); 
                } else { 
                    username = userDetail.toString(); 
                } 
                out.print(username+ ",密码:"+pwd); 
            }
        %>        
</body>
</html>
登陆页:login.jsp:
<%@ page language ="java" pageEncoding="UTF-8"%>  
<%@ page import ="org.acegisecurity.ui.AbstractProcessingFilter" %> 
<%@ page import= "org.acegisecurity.ui.webapp.AuthenticationProcessingFilter" %>  
<%@ page import ="org.acegisecurity.AuthenticationException" %> 
<html>
<body >    
      <% 
        String strError = request.getParameter( "login_error");       
        if (null != strError){  
     %> 
      <font color ="red"> 
        你的登陆失败,请重试。 <BR ><BR > 
         原因: <%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %> 
      </font > 
      <% 
        }//end if 
      %> 
 
  < FORM METHOD= POST ACTION ="j_acegi_security_check">
  < table>
    <tr >
      <td >用户名: </td >
      <td ><input NAME ="j_username"  type= "text" title ="用户名" /></td>
    </tr >
    <tr >
      <td > 密码: </td >
      <td ><input   name ="j_password"  type= "text" title = "密码"/></td >
    </tr >
    <tr >
       <td > </td >
      <td > <input type ="submit" value="登陆"/></ td></ tr>
  </ table>  
     </FORM >
  </ body>

其中注意:用户名和密码的name必须是j_username和j_password,以及action必须是j_acegi_security_check,这是acegi规则。

测试如下:

1.第一次运行userinfo.jsphttp://localhost:8080/acegitest2/userinfo.jsp
2.因为访问受保护资源,没有登录,则转到登陆页面
3.输入无权限用户,test/1,因为无权限,则转向accessDefined页面
4.输入有权限用户,lisi/1,则成功转向到userinfo.jsp
sendRedirect(request, response, targetUrl);
OK,运行成功了,这篇博客实践源码:
ps:关闭浏览器,重新再打开浏览器,运行http://localhost:8080/acegitest2/userinfo.jsp,测试一下会出现啥现象?再换个浏览器比如谷歌,运行url会出现啥现象?这个现象的原因能猜到吗?


分享到:
评论

相关推荐

    acegi form 认证 demo

    acegi security实践教程—简单定制logoutFilter 这个demo是在原来的基础上,定制自己的logoutFilter,具体详细的博客地址介绍如下: http://blog.csdn.net/yuebinghaoyuan/article/details/21075929

    acegi-security-catalina-0.7.0.jar.zip

    这个JAR文件包含了实现Acegi Security与Tomcat容器交互的所有类和资源,使得开发者能够利用Acegi的认证和授权机制来保护Web应用程序。它通常会部署在Tomcat的`lib`目录下,以便服务器启动时加载这些安全功能。 ...

    acegi-security-jetty-0.8.2.jar.zip

    Acegi Security的灵活性在于它能够与多种认证源(如数据库、LDAP、JaAS等)和安全机制(如HTTP Basic Auth、Form Login等)进行集成。 Jetty是一款轻量级、高性能的Java HTTP服务器和Servlet容器。它被广泛用于开发...

    acegi-security-resin-0.8.1.jar.zip

    这个框架提供了细粒度的身份验证和授权功能,包括基于角色的访问控制(RBAC),支持多种认证机制(如HTTP Basic Auth、Form Login等)以及自定义安全策略。在0.8.1版本中,Acegi Security已经包含了处理登录、权限...

    spring的acegi应用

    标题“spring的acegi应用...总之,Spring Security(前身Acegi Security)是Spring框架中不可或缺的安全组件,用于实现应用程序的用户认证和权限控制。通过学习和实践,开发者可以构建出高度安全且易于维护的Web应用。

    ldap与Acegi? ----Acegi配置文件解剖

    这篇博客将深入解析一个配置了Acegi Security的`applicationContext-acegi-security.xml`文件,帮助我们理解如何将LDAP与Acegi集成以实现更安全的Web应用。 **LDAP基础** LDAP是一种标准的网络协议,用于存储和...

    基于Acegi的Form表单验证的例子

    这个例子“基于Acegi的Form表单验证”展示了如何使用Acegi进行用户身份验证和授权,这对于任何需要保护Web应用程序的人来说都是非常重要的。 首先,Acegi的核心是其SecurityInterceptor,它在Spring的AOP(面向切面...

    Acegi

    - **Form Authentication**:基于表单的登录认证。 - **Basic Authentication**:HTTP基本认证。 - **Digest Authentication**:更安全的HTTP认证方式,防止密码在网络传输过程中被截获。 - **Anonymous ...

    Spring ACEGI手册(部份)

    尽管Spring ACEGI已被Spring Security取代,但其提供的文档和教程仍然对理解安全框架的工作原理非常有价值。在阅读《Spring ACEGI手册(部分)》.doc文档时,可以深入学习如何配置和使用该框架,以及如何解决常见的...

    spring security3 中文版本

    - **表单和基本登录选项**:可以通过 `&lt;form-login&gt;` 和 `&lt;http-basic&gt;` 元素来配置登录页面和基本认证。 - **使用其他认证提供器**:可以添加自定义的认证提供器,以支持不同的认证方式。 ##### 2.3 高级 Web 特性...

    Spring Acegi(2)

    &lt;security:form-login login-page="/login" default-target-url="/home" /&gt; &lt;/security:http&gt; ``` **4. 认证流程** - 用户尝试访问受保护的资源。 - FilterSecurityInterceptor拦截请求并检查用户是否已认证。 - ...

    Spring_Security3中文指南.pdf

    Spring Security 的前身是 Acegi 安全框架,后来被整合进 Spring 框架中,并更名为 Spring Security。从 3.0 版本开始,Spring Security 进行了大量的重构和改进,以更好地适应现代 Web 应用的安全需求。 **特点:*...

    spring security3.2.0

    Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。 Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业...

    如何在Spring中集成Acegi 2.x安全框架

    在Spring框架中集成Acegi 2.x安全框架,可以实现高度可定制的权限管理和认证机制。Acegi(现已被Spring Security 2.0所取代)是Spring的一个扩展,提供了全面的安全解决方案,包括用户身份验证、访问控制、会话管理...

    Acegi 各过滤的解析(二)

    &lt;bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"&gt; &lt;security:filter-chain-map path-type="ant"&gt; &lt;security:filter-chain pattern="/login*" filters="none"/&gt; &lt;security:filter-...

    spring security3配置和使用

    最初由 Ben Alex 在 2003 年创建,名为 "The Acegi Security System for Spring" 或简称 "Acegi Security"。随着时间的发展,它逐渐演变成为 Spring 生态系统中的标准安全解决方案,并被广泛应用于基于 Spring 的...

    spring-security入门

    它最初被称为Acegi Security,后来在Spring 2.0版本后被重命名为Spring Security。本教程将引导你入门Spring Security 3.x,帮助你理解如何设置和配置这个安全框架。 首先,我们需要创建一个Web项目并导入必要的库...

Global site tag (gtag.js) - Google Analytics