`
1011729483
  • 浏览: 9050 次
社区版块
存档分类
最新评论

使用ACEGI实现权限控制

阅读更多
使用ACEGI实现权限控制,第一部分

环境:
struts2,acegi1.0.6,spring2.5.1,cas3

一、综述:环境搭建
1.spring和acegi版本
spring2.5.6和acegi1.0.6兼容性问题
会报
java.lang.NoClassDefFoundError: org/springframework/web/bind/RequestUtils
不过据说装合适的spring-webmvc这个jar也可以解决问题,没有测试

1.搭建acegi环境
web.xml配置,使用acegi的过滤器
配置web.xml
<context-param>中包含新配置文件
<!-- Acegi过滤器 -->
 <filter>
  <filter-name>acegiFilterChain</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>

 <!-- Acegi过滤器URL映射 -->
 <filter-mapping>
  <filter-name>acegiFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>


过滤器要放在struts前面,否则会报错。因为有些操作要acegi中的springmvc处理
javax.servlet.ServletException: Filter execution threw an exception
 org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:389)
java.lang.NoClassDefFoundError: org/springframework/web/bind/RequestUtils


配置acegi配置文件,配置认证管理器、投票管理器、过滤器链、配置acegi的log4j日志


<?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.xsd">

 <!--
  ========================================================================
  认证管理器
  =========================================================================
 -->
 <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
  <property name="providers">
   <list>
    <ref bean="daoAuthenticationProvider" />
    <ref bean="rememberMeAuthenticationProvider" />
   </list>
  </property>
 </bean>
 
 <bean id="daoAuthenticationProvider"
  class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
  <property name="userDetailsService" ref="userDetailsService" />
  <property name="userCache" ref="userCache" />
 </bean>
    
 <!-- 基于DAO验证的Ehcache实现 -->
 <bean id="userCache"
  class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
  <property name="cache" ref="userCacheBackend" />
 </bean>
 <bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
  <property name="cacheManager" ref="cacheManager" />
  <property name="cacheName">
   <value>userCache</value>
  </property>
 </bean>
 <bean id="cacheManager"
  class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />

 <bean id="rememberMeAuthenticationProvider"
  class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
  <property name="key" value="remember_Me" />
 </bean>

 <!-- 使用数据库DAO查找用户和角色 -->
 <bean id="userDetailsService" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
  <property name="dataSource" ref="dataSource" />
  <property name="usersByUsernameQuery">
   <value> 
          <![CDATA[SELECT u.staffname USERNAME,u.staffpwd PASSWORD,u.STATUS enabled FROM sw_staff u where u.STATUS = 1 AND u.staffname = ?]]>
   </value>
  </property>
  <property name="authoritiesByUsernameQuery">
   <value> 
          <![CDATA[SELECT t1.staffid USERNAME,t3.roledec authority FROM sw_staff t1, SW_UserPower t2,sw_Roles t3 WHERE t1.staffid= t2.staffid and t2.roleid= t3.roleid and t1.staffname = ?]]>
   </value>
  </property>
 </bean>

 <!--
  ========================================================================
  决策管理器
  =========================================================================
 -->
 <!-- 至少有一个投票者容许,就可以访问资源 -->
 <bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
  <property name="decisionVoters">
   <list>
    <bean class="org.acegisecurity.vote.RoleVoter" />
   </list>
  </property>
  <!-- 所有投票者弃权,不容许访问 -->
  <property name="allowIfAllAbstainDecisions" value="false" />
 </bean>

 <!--
  ========================================================================
  过滤器链
  =========================================================================
 -->

 <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,rememberMeFilter,exceptionFilter
   </value>
  </property>
 </bean>

 <!-- 从Session中获得用户信息并放入SecurityContextHolder -->
 <bean id="httpSessionContextIntegrationFilter"
  class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />

 <!-- 用户注销 -->
 <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
  <!-- 注销后默认的跳转页面 -->
  <constructor-arg value="/helloWorld.jsp" />
  <constructor-arg>
   <list>
    <ref bean="rememberMeServices" />
    <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
   </list>
  </constructor-arg>
  <property name="filterProcessesUrl" value="/j_logout.do" />
 </bean>

 <!-- 表单方式验证用户身份 -->
 <bean id="authenticationProcessingFilter"
  class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager" />
  <!-- 登录失败的页面,包含出错信息的登录页面 -->
  <property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." />
  <!-- 登录后的跳转页面 -->
  <property name="defaultTargetUrl" value="/helloWorld.jsp" />
  <!-- 用户登录的URL -->
  <property name="filterProcessesUrl" value="/j_acegi_security_check" />
  <property name="rememberMeServices" ref="rememberMeServices" />
 </bean>

 <bean id="casProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager" />
  <!-- 登录后的跳转页面 -->
  <property name="defaultTargetUrl" value="/helloWorld.jsp" />
  <property name="filterProcessesUrl" value="/j_acegi_cas_security_check" />
  <!-- 认证失败后的跳转页面 -->
  <property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." />
  <property name="rememberMeServices" ref="rememberMeServices"/>
 </bean>

 <!-- 记住用户登录信息 -->
 <!--<bean id="rememberMeFilter"
  class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager" />
  <property name="rememberMeServices" ref="rememberMeServices" />
 </bean>
-->

 <!-- 处理登录异常或权限异常的Filter -->
 <bean id="exceptionFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
  <!-- 出现AuthenticationException时的登录入口,无认证异常 -->
  <!--
   表单登录时用 <property name="authenticationEntryPoint"> <bean
   class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
   将用户导向登录页面 <property name="loginFormUrl" value="/login.jsp" />
   是否强制使用https <property name="forceHttps" value="false" /> </bean>
   </property>
  -->
  <!--CAS认证登录时用-->
  <property name="authenticationEntryPoint">
   <bean class="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint">
    <property name="loginUrl"
     value="https://localhost:8443/cas-server-webapp-3.1.1/login" />
    <property name="serviceProperties" ref="serviceProperties" />
   </bean>
  </property>
  <!-- 出现AccessDeniedException时的Handler,无权限异常-->
  <property name="accessDeniedHandler">
   <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
    <property name="errorPage" value="/accessDenied.jsp" />
   </bean>
  </property>
 </bean>

 <bean id="serviceProperties" class="org.acegisecurity.ui.cas.ServiceProperties">
  <!-- CAS登录后的重定向页面-->
  <property name="service" value="http://localhost:8080/test" />
  <property name="sendRenew" value="false" />
 </bean>

 <bean id="securityInterceptor"
  class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
  <property name="authenticationManager" ref="authenticationManager" />
  <property name="accessDecisionManager" ref="accessDecisionManager" />
  <property name="objectDefinitionSource">
   <value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /index.jsp=ROLE_LOGIN
    /*action=ROLE_LOGIN
   </value>
  </property>
 </bean>


说明:
1、过滤器链:filterChainProxy,有顺序要求
/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter,securityInterceptor

2、rememberMe配置要点
rememberMeServices使用TokenBasedRememberMeServices,token64编码后放入cookie
logoutFilter使用rememberMeServices,离开后保存cookie

rememberMeFilter配置authenticationManager和rememberMeServices
rememberMeServices的parameter和html表单的Remember Me字段的name一致
rememberMeServices的key和authenticationManager中的rememberMeAuthenticationProvider的key要一致

3、使用DaoAuthenticationProvide实现基于数据库的用户认证授权,userDetailsService中可以用注入sql使用数据库实现,文件方式保存用户基本没啥用
修改usersByUsernameQuery和authoritiesByUsernameQuery注入sql
使用Ehache提高性能

4、配置日志
<!-- 监听认证授权事件,输出日志 -->
    <bean id="authenticationLoggerListener"
  class="org.acegisecurity.event.authentication.LoggerListener" />

<bean id="authorizationLoggerListener"
  class="org.acegisecurity.event.authorization.LoggerListener" />

对应的,如果是log4j.xml
log4j.xml
<logger name="log4j.logger.org.acegisecurity" additivity="true">
  <level value="DEBUG" />
  <appender-ref ref="LOG.DEBUG" />
</logger>
如果是log4j.properties
log4j.properties
log4j.logger.org.acegisecurity=DEBUG 


5.表单认证
<bean id="authenticationProcessingFilter"
  class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager" />
  <!-- 登录失败的页面,包含出错信息的登录页面 -->
  <property name="authenticationFailureUrl" value="/login.jsp?login_error=Login%20failed." />
  <!-- 登录后的跳转页面 -->
  <property name="defaultTargetUrl" value="/helloWorld.jsp" />
  <!-- 用户登录的URL -->
  <property name="filterProcessesUrl" value="/j_login.do" />
  <property name="rememberMeServices" ref="rememberMeServices" />
</bean>
表单中的username和password的name这里为j_username和j_password,acegi的springmvc实现中用
filterProcessesUrl默认是j_acegi_security_check,可以修改,需要登录页面同步

6.用户注销
logoutFilter中filterProcessesUrl默认是j_acegi_logout,只要将退出页面中url设置为j_acegi_logout就可以触发


7.授权
accessDecisionManager:事前评估。使用投票表决器。RoleVoter是基于角色的投票表决器。
这里securityInterceptor使用文件配置,也可以修改为数据库方式实现

8.使用aop对方法授权

分享到:
评论

相关推荐

    batis+acegi实现的动态权限控制

    NULL 博文链接:https://huangshenji.iteye.com/blog/298413

    网页中中文乱码问题和用户权限控制(使用fileter实现)

    网页中中文乱码问题和用户权限控制(使用fileter实现) 最基本的实现方法,如果还没有涉及具体用户权限框架的同学可以先参考参考,毕竟是其他实现框架,如Struts2和Spring Acegi的实现基础。

    acegi 例子源码

    用acegi 实现权限控制的例子 精通spring2.x企业级应用17章 想 来看看的朋友最好有这本书

    Spring Acegi sample 基于数据库的DAO认证实现 c3p0做连接池技术

    acegi sample 基于数据库的DAO认证实现 ... 这里面授权是针对Dao 方法一级的控制,所以在设置权限时一个类里面的每一个主法都必须做相就有授权 这里用到了Spring jdbcTemplate来操作数据库 用到c3p0做连接池技术

    zkacegi WEB 权限控制框架

    ZK 是一个事件驱动(event-driven)的,基于组件(component-based)的,用以丰富网络程序中用户界面的...ZKACEGI是ZK与ACEGI相结合的技术,包含了用户、角色、权限等几个部分,实现了登录管理、权限控制、操作控制等功能。

    关于web spring acegi 权限配置xml(补充)

    如何定义spring security的安全认证框架,对url和系统类method进行过滤以及权限分配和控制(补充) 关于DataBaseFilterInvocationDefinitionSource.java的实现

    Acegi安全框架下实现的通用权限管理系统 (2010年)

    把Acegi安全框架引入到SSH(表现层+控制层+持久层)架构中,对Acegi安全框架进行配置动态扩展,实现一个通用权限管理子系统畅对可能出现的问题进行分析,分别给出相应的解决方案。把子系统应用到一个账单管理系统中,其...

    基于Spring框架应用的权限控制系统的研究和实现

    本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法。 关键词Spring;Acegi;认证;授权1引言 近年来,随着Internet技术的迅猛发展,计算机网络已...

    实现基于Spring框架应用的权限控制系统

    本文探讨了Acegi安全框架中各部件之间的交互,并通过扩展Acegi数据库设计来实现基于Spring框架的应用的安全控制方法。关键词Spring;Acegi;认证;授权引言近年来,随着Internet技术的迅猛发展,计算机网络已深入到...

    简单acegi程序

    在应用系统开发的过程中权限的设置和用户的安全管理是系统中不可缺少的部分,但如果自己去实现有时因为项目的原因可能就会在后期忽略了这块,在spring中有集成了这个部分,感谢spring 给我们带来了这么好的东西。

    java文集

    映射标记 Java的“静态库链接” 姚博文 集成ACEGI 进行权限控制 SWT可交互式Browser控件 JDK配置(注意) RIA简介(第一部分) 在 Eclipse 中嵌入 NASA World Wind Java SDK, 用3DES加密解密 ...

    Spring Security 中文教程.pdf

    15. 基于表达式的权限控制 15.1. 概述 15.1.1. 常用内建表达式 15.2. Web 安全表达式 15.3. 方法安全表达式 15.3.1. @Pre 和 @Post 注解 15.3.1.1. 访问控制使用 @PreAuthorize 和 @PostAuthorize ...

    Spring Security-3.0.1中文官方文档(翻译版)

    15. 基于表达式的权限控制 15.1. 概述 15.1.1. 常用内建表达式 15.2. Web 安全表达式 15.3. 方法安全表达式 15.3.1. @Pre 和@Post 注解 15.3.1.1. 访问控制使用@PreAuthorize 和@PostAuthorize 15.3....

    java开源包3

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包4

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

Global site tag (gtag.js) - Google Analytics