acegi security实践教程—form认证

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

  具体步骤如下:

  开发环境:

  MyEclispe10.7.1+tomcat6.0.37+acegi1.0.5+spring2.0
  项目目录如下:  其中readme主要用来记录本次验证目的
  acegi security实践教程—form认证_第1张图片

   配置文件

   web.xml:
 

  < display-name>
  
  < context-param>
    contextConfigLocation 
     
            classpath:config/spring/spring-acegi.xml 
        
  
 
  
  < filter>
    AcegiFilterChainProxy 
    
                org.acegisecurity.util.FilterToBeanProxy
            
    
      targetBean 
      filterChainProxy 
    
  
  < filter-mapping>
    AcegiFilterChainProxy 
    /j_acegi_security_check 
  
  < filter-mapping>
    AcegiFilterChainProxy 
    /j_acegi_logout 
  
  < filter-mapping>
    AcegiFilterChainProxy 
    *.do 
  
  < filter-mapping>
    AcegiFilterChainProxy 
    *.jsp 
  
 
 
  < welcome-file-list>
      index.jsp 
  
 
  
  < listener>
       
        org.springframework.web.context.ContextLoaderListener
       
 
 

  acegi配置文件:
 

     
     
     
     
            
                 
                     PATTERN_TYPE_APACHE_ANT
                     /**=authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
                 
            
     

           
   
      
        
         
        
         
        
         
        
         
    
     
     
            
                 
                      
                 
            
     
     
     
    
     
            
     

    
     
            
                 
                     test=1,ROLE_USER
                     lisi=1,ROLE_SUPERVISOR
                     zhangsan=1,ROLE_SUPERVISOR,disabled
                 
            
     
     
     
   
       
          
             
                  
                   
             
        
     
          
             
                  
             
         
         
     
   
            
            
            
                 
            
     

     
            
                 
                      
                 
            
     


  讲解如下:

    在 filterInvocationInterceptor配置了受保护的资源,访问userinfo.jsp则需要 ROLE_SUPERVISOR权限。而其他的资源则不需要保护。
   表单 authenticationProcessingFilter认证,也是依靠认证管理器,并委托给Provider来实现。
    < bean  id  = "authenticationProcessingFilter"  class =              "org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"  >  
        
         < property  name  = "authenticationManager"  ref =  "authenticationManager" />  
        
         < property  name  = "authenticationFailureUrl"  value =  "/login.jsp?login_error=1" />  
        
         < property  name  = "defaultTargetUrl"  value =  "/userinfo.jsp" />  
        
         < property  name  = "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.*"%>  



 当前用户的具体信息 


        当前用户: 
        <% 
            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); 
            }
        %>        

  登陆页: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" %> 

    
      <% 
        String strError = request.getParameter( "login_error");       
        if (null != strError){  
     %> 
       
        你的登陆失败,请重试。 

原因: <%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %>
<% }//end if %> < FORM METHOD= POST ACTION ="j_acegi_security_check"> < table> 用户名: 密码:   

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

  测试如下:

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


你可能感兴趣的:(【Acegi】,acegi,security实践教程)