环境:
 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 />

 <bean />
 </bean>

 <!-- 使用数据库DAO查找用户和角色 -->
 <bean >
   <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 />
 </bean>

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

 <bean >
   <value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeFilter,exceptionFilter
   </value>
  </property>
 </bean>

 <!-- 从Session中获得用户信息并放入SecurityContextHolder -->
 <bean />

 <!-- 用户注销 -->
 <bean />
 </bean>

 <!-- 表单方式验证用户身份 -->
 <bean />
 </bean>

 <bean />
 </bean>

 <!-- 记住用户登录信息 -->
 <!--<bean />
 </bean>
-->

 <!-- 处理登录异常或权限异常的Filter -->
 <bean />
   </bean>
  </property>
 </bean>

 <bean />
 </bean>

 <bean >
   <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 />

 <bean />

对应的,如果是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 />
 </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对方法授权

 

第二部分:介绍dbms实现鉴权,包括资源过滤和方法过滤,表结构模型

第三部门:和CAS集成,包括CAS环境搭建,acegi集成CAS

相关文章:

  • 2021-09-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-10-22
  • 2022-01-05
  • 2021-06-04
  • 2021-09-08
  • 2022-12-23
  • 2022-01-05
  • 2021-06-01
相关资源
相似解决方案