`

使用acegi控制用户权限实例

阅读更多

acegi权限控制:
1.配置authenticationProcessingFilter的登陆url: <property name="filterProcessesUrl" value="/login.do"/>
2.UserDetailsServiceImpl.loadUserByUsername(username)   与登陆页面的<input name="j_username"/> 一致
<input name="j_password"/>
username 来自于j_username

<form id="loginForm"  method="post" action="<c:url value="/j_acegi_security_check"/>">

密码错误,进不去系统
官码正确,
3.DaoAuthenticationProvider.retrieveUser
4.ProviderManager.doAuthentication
5.FilterChainProxy.doFilter
6.模式是否正确: ant  /pages/**、/user/*.do、/**、/login.do、/user/*.do
           Exp 
          
页面跳转:
1.tomcat启动,初始化 :UrlFilterInvocationDefinitionSource
2.j_acegi_security_check
3.UrlFilterInvocationDefinitionSource 这个类初始化所有角色
4. UserDetailsServiceImpl 初始化某用户所属角色
5.如果有login.do权限,正常跳转,否则accessDenied.jsp
org.acegisecurity.providers.encoding.PlaintextPasswordEncoder: 明码
org.acegisecurity.providers.encoding.Md5PasswordEncoder: md5

似乎没有用到缓存?


如果没有权限,将跳转到accessDenied.jsp,注意相同的url覆盖权限
configDefinition = new ConfigAttributeDefinition();
configDefinition.addConfigAttribute(new SecurityConfig("ROLE_ANONYMOUS"));//匿名用户能访问的页面
configDefinition.addConfigAttribute(new SecurityConfig("ROLE_USER"));
map.addSecureUrl("/pages/login.jsp*", configDefinition);


SecurityContext安全上下文
SecurityContext securityContext = SecurityContextHolder.getContext();
SecurityContext中保存着实现了Authentication 接口的对象,如果用户尚未通过
认证,那么SecurityContext.getAuthenticaiton()方法就会返回null。
  注意,如果使用了匿名用户,SecurityContext.getAuthenticaiton()返回的不是null.
  只有在未启用过滤器链的情况下,SecurityContext.getAuthenticaiton()才返回空。

 

applicationContext.xml

<!-- acegi start-->
 
 <!-- Ehcache与spring整合 -->
 <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true">
  <property name="configLocation" value="classpath:ehcache.xml" />
 </bean>
 
 <bean id="acegiCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
   <property name="cache">
     <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
      <property name="cacheManager">
       <ref bean="ehCacheManager"/>
                        </property>       
      <property name="cacheName" value="userAuthCache"/>
     </bean>
        </property>
 </bean>
 
 <bean id="userDetailsService" class="cn.util.UserDetailsServiceImpl">
      <property name="userService" ref="userService"/>
 </bean>
 
 <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
     <property name="userDetailsService" ref="userDetailsService"/>
     <property name="passwordEncoder">
   <!--    <bean class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"></bean>  PlaintextPasswordEncoder:不加密-->
       <bean class="org.acegisecurity.providers.encoding.PlaintextPasswordEncoder">
        <property name="ignorePasswordCase" value="true"></property>
       </bean>
     </property>
 </bean>
    
 <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
  <property name="providers">
   <list>
    <ref bean="daoAuthenticationProvider"/>
    <bean class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
     <property name="key" value="changeThis"/>
    </bean>
<!--     <bean class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider"> -->
<!--      <property name="key" value="changeThis"/> -->
<!--     </bean> -->
   </list>
  </property>
 </bean>
 
 <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="accessDecisionManager">
   <bean class="org.acegisecurity.vote.AffirmativeBased">
    <property name="allowIfAllAbstainDecisions" value="false"/>
    <property name="decisionVoters">
     <list>
      <bean class="org.acegisecurity.vote.RoleVoter">
      </bean>
      <bean class="org.acegisecurity.vote.AuthenticatedVoter"/>
     </list>
    </property>
   </bean>
  </property>
  
  <property name="objectDefinitionSource" ref="filterInvocationDefinitionSource">  
   <!--value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    /login.jsp=ROLE_ANONYMOUS
    /.*=ROLE_USER
   </value-->
  </property>
 </bean> 
 
 <bean id="filterInvocationDefinitionSource" class="cn.util.UrlFilterInvocationDefinitionSource">
  <property name="roleService" ref="roleService"/>
 </bean> 
 
 <!-- httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor -->
  <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> 
        <property name="filterInvocationDefinitionSource"> 
            <value> 
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON  
            PATTERN_TYPE_APACHE_ANT  
            /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor  
         </value> 
        </property> 
    </bean>
 
 <bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
 
 <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
  <constructor-arg value="/pages/login.jsp"/> <!-- URL redirected to after logout -->
  <constructor-arg>
   <list>
    <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
   </list>
  </constructor-arg>
 </bean>
 
 <bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>
 
 <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager"/>
  <property name="authenticationFailureUrl" value="/pages/login.jsp?login_error=1"/>
  <property name="defaultTargetUrl" value="/login.do"/><!-- 登录后的跳转页面 -->
  <property name="filterProcessesUrl" value="/j_acegi_security_check"/>
        <property name="exceptionMappings">
            <value>
                org.acegisecurity.concurrent.ConcurrentLoginException=/login.jsp?login_error=too_many_user_error
            </value>
        </property>  
 </bean>
 
 <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
  <property name="authenticationEntryPoint">
   <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
    <property name="loginFormUrl" value="/pages/login.jsp"/>
    <property name="forceHttps" value="false"/>
   </bean>
  </property>
  <property name="accessDeniedHandler">
   <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
    <property name="errorPage" value="/pages/accessDenied.jsp"/>
   </bean>
  </property>
 </bean>
 
 <!--  
        匿名过滤器。 该过滤器是用来对匿名用户的处理。  
        如果用户尚未登录,将生成一个匿名用户的Authentication存放到ContextHolder中。 即当不存在任何授权信息时,  
        自动为Authentication对象添加userAttribute中定义的匿名用户权限。  
    --> 
    <bean id="anonymousProcessingFilter" 
        class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter"> 
        <property name="key" value="changeThis" /> 
        <property name="userAttribute" value="anonymous,ROLE_ANONYMOUS" /> 
    </bean>
 
 <!-- acegi end-->
 <!-- 监听认证授权事件,输出日志 -->
    <bean id="authenticationLoggerListener" class="org.acegisecurity.event.authentication.LoggerListener" />

 

 

ehcache.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
 <!-- 默认的磁盘缓存目录 -->
    <diskStore path="java.io.tmpdir"/>

<cache name="userAuthCache"
        maxElementsInMemory="300"
        eternal="true"
        overflowToDisk="true"
        memoryStoreEvictionPolicy="LFU"
        /> 
</ehcache>

web.xml

 

<filter>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>  
    <init-param>  
        <param-name>targetClass</param-name>  
        <param-value>org.acegisecurity.util.FilterChainProxy</param-value>  
    </init-param>  
</filter>  
 
 
<filter-mapping>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <url-pattern>*.html</url-pattern>  
</filter-mapping>  
<filter-mapping>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <url-pattern>*.do</url-pattern>  
</filter-mapping>  
<filter-mapping>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <url-pattern>*.jsp</url-pattern>  
</filter-mapping>  
<filter-mapping>  
    <filter-name>Acegi Filter Chain Proxy</filter-name>  
    <url-pattern>/j_acegi_security_check</url-pattern>  
</filter-mapping>  
 
  <!--  
        Acegi  
        Security能够限定次数防止一个principal多次并行认证到同一个应用。许多ISV利用这一点来加强授权管理,网管也喜欢这个特性因为可以防止一个用户名被重复使用。例如,你可以限制“Batman”用户从两个不同的session登录系统。  
      
    <listener>  
        <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>  
    </listener> 
    -->
 
  <!-- 
  <context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>classpath:log4j.properties</param-value>
  </context-param>
  -->

分享到:
评论

相关推荐

    最简单acegi权限管理实例

    总的来说,这个"最简单acegi权限管理实例"是一个很好的学习起点,通过实践可以了解Acegi的基本用法,包括用户认证、权限控制、配置文件的理解以及如何与Spring框架集成。在实际项目中,我们需要根据需求进行更复杂的...

    Acegi学习笔记--Acegi详解实战Acegi实例

    2. **权限控制**:使用`&lt;intercept-url&gt;`配置URL的访问权限,可以结合角色进行限制。 3. **登录与登出**:自定义登录页面,使用`AuthenticationProcessingFilter`处理登录请求,`LogoutFilter`处理登出请求。 4. **...

    acegi 安全框架实例

    Acegi的核心功能包括用户身份验证、访问控制、会话管理以及密码加密等,使得开发者能够更方便地实现应用的安全需求。 首先,我们来了解一下Acegi的基本架构。Acegi安全框架主要由以下几个组件构成: 1. **...

    acegi实例

    通过这个"acegi实例",我们可以深入了解Acegi如何在Spring应用中实施细粒度的权限控制,以及如何通过配置和编程方式定制安全策略。虽然Acegi已被Spring Security取代,但其核心思想和设计模式依然影响着现代Web应用...

    acegi java权限验证框架ppt讲座和代码

    压缩包中的"数据库版+方法版"可能包含了使用数据库存储用户信息和权限的示例,以及针对具体方法进行权限控制的实例代码。这些代码可以作为实际开发中的参考,帮助我们更好地理解和应用Acegi框架。 总的来说,通过对...

    spring Acegi例子,很简单的一个acegi实例,容易理解

    5. **表达式语言(Expression-Based Access Control)**:Acegi支持使用SpEL(Spring Expression Language)定义访问控制表达式,如`hasRole('ROLE_ADMIN')`,用于判断用户是否拥有指定的角色。 6. **会话管理...

    acegi 详细实例

    在 Java 应用开发中,Acegi 提供了一套强大的工具来管理用户权限和访问控制,使得开发者能够更专注于业务逻辑,而不是安全性问题。在这个“acegi 详细实例”中,我们将会探讨如何使用 Acegi 来实现应用程序的安全...

    acegi实例,acegi详细配置和代码实现

    3. **Controller/Service中的Security Annotation**:在控制器或服务方法上使用Acegi Security的注解(如`@Secured`)来声明访问控制。 在`acegiTest`目录下,可能包含了一些测试用例,用于验证配置和实现是否正确...

    Acegi-spring安全框架

    1. URL资源的访问控制:Acegi能够设定不同用户群体对网页资源的访问权限。例如,所有用户可以访问登录页面,但只有经过授权的用户才能访问特定的业务功能页面。 2. 业务类方法的访问控制:Acegi能够控制Spring容器...

    Acegi将资源权限数据存储到数据库.pdf

    Acegi Security Framework是一款在Spring早期广泛使用的安全框架,它提供了基于角色的访问控制(RBAC)功能。在处理复杂的权限管理时,Acegi允许开发者将资源权限数据存储到数据库,而不是仅局限于配置文件中,这样...

    Acegi-security-samples-tutorial-1.0.7.zip 实例代码解析

    通过这些控制器,我们可以观察到Acegi如何根据用户的权限控制访问。 4. **实体和权限**:Acegi Security支持基于角色的访问控制(RBAC)。在`UserDetails`和`Role`等类中,我们可以看到用户信息和角色是如何被定义...

    使用 Acegi 保护 Java 应用程序: 续二

    2. **授权**:Acegi 提供了细粒度的访问控制,如方法级别和 URL 级别的权限检查。`acegisample.war` 是一个包含 Acegi 配置和示例应用的 Web 应用程序。在该应用中,可能会有各种角色定义,如管理员、普通用户等,每...

    acegi开发 实例

    通过这种方式,你可以精细地控制用户对应用程序的访问。 **4. 会话管理(Session Management)** Acegi还提供了会话管理功能,防止会话固定攻击(session fixation)和其他会话相关的安全问题。它可以自动管理用户...

    acegi 例子 进行了扩展

    标签中的“acegi 权限管理 权限 权限管理系统 acegi权限管理系统”进一步明确了这个示例的主要关注点。Acegi Security的核心在于提供细粒度的权限控制,允许开发者定义谁可以访问哪些资源,以及他们可以进行哪些操作...

    acegi+ldap

    在描述中提到的"spring + acegi + ldap 权限框架",意味着这个实例展示了如何配置和使用这三者来构建一个完整的权限管理系统。Spring负责处理业务逻辑和依赖注入,Acegi则负责安全管理,包括用户认证和授权,而LDAP...

    Acegi_使用.doc

    这意味着不仅可以控制用户能否访问某个方法,还能指定用户在访问该方法时可以执行哪些操作。 #### SkyonFramework对Acegi的扩展 SkyonFramework通过一系列扩展组件增强了Acegi的安全功能,具体包括: - **...

Global site tag (gtag.js) - Google Analytics