`
anson_xu
  • 浏览: 503487 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

我的acegi struts spring hibernate理解

阅读更多
配置文件网上一大堆,随下一个都问题不大,但结合自己的配置有几个点要注意:



1.这里控制文件访问权限:
<bean id="filterInvocationInterceptor"
  class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager"
  ref="authenticationManager"/>
<property name="accessDecisionManager">
   <ref local="accessDecisionManager"/>
</property>
<!-- property name="objectDefinitionSource"
  ref="filterDefinitionSource"/-->
  <!--
         filterInvocationInterceptor在执行转向url前检查objectDefinitionSource中设定的用户权限信息
         过程:
         首先,objectDefinitionSource中定义了访问URL需要的属性信息(这里的属性信息仅仅是标志,告诉accessDecisionManager要用哪些voter来投票)
         然后,authenticationManager掉用自己的provider来对用户的认证信息进行校验。
         最后,有投票者根据用户持有认证和访问url需要的属性,调用自己的voter来投票,决定是否允许访问。
     -->
<property name="objectDefinitionSource">
    <value>
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    PATTERN_TYPE_APACHE_ANT
    /admin/**=ROLE_ADMIN,ROLE_USER
    /users/**=ROLE_USER,ROLE_ADMINISTRATOR
    /web-inf/users/**=ROLE_ADMINISTRATOR
   </value>
   
</property>
</bean>
其中ROLE_ADMIN,ROLE_USER是你数据库表里存的角色名,随便你改吧.
2.此处可以把sql语句写在这,也可以自己写UserDetailsService 实现.
目的是返回这个user给它
org.acegisecurity.userdetails.User(username, user.getPassword(),
           true, true, true, true, this.grantedAuthArray);

如是:
<bean id="daoAuthenticationProvider"
  class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
  <!-- 此处可以自己写DAO实现userDetailsService -->
<property name="userDetailsService" ref="userDetailsService"/>
<property name="userCache" ref="userCache"/>
<!-- <property name="passwordEncoder" ref="passwordEncoder"/>   -->
</bean>
<bean id="userDetailsService"
class="com.lottery.service.AcegiUserDeitailsService">
<property name="dbManager" ref="dbManager" />
</bean>

如我的:
public class AcegiUserDeitailsService implements UserDetailsService {
private final Log LOG = LogFactory.getLog(AcegiUserDeitailsService.class);
/* 依赖注入 */
private DBManager dbManager;

/* 用户所有的权限 */
//private final List<GrantedAuthority> grantedAuthList = new ArrayList<GrantedAuthority>(6);
private GrantedAuthority[] grantedAuthArray;

public UserDetails loadUserByUsername(String username)
    throws UsernameNotFoundException, DataAccessException {
   if(LOG.isDebugEnabled()) {
    LOG.debug("Loading UserDetails of userName: " + username);
   }
   /* 取得用户信息 */
   List<LotteryUsers> userList = findAllByUsername(username);
   LotteryUsers user = null;
   if(userList!=null&&!userList.isEmpty()){
      user = (LotteryUsers)userList.get(0);
   }
   if(user == null) {
    LOG.warn("UserDetails load failed: No such UserRole with userName: " + username);
            throw new UsernameNotFoundException("User name is not found.");
   }
   /* 取得所有用户权限 */
   List<String> userRoleList = findGroupNameByUsername(username);
   if(userRoleList == null || userRoleList.size() == 0) {
    LOG.warn("UserRole load failed: No such UserRole with userName: " + username);
            throw new UsernameNotFoundException("UserRole is not found.");
   }
   /* 取得用户的所有角色 */
   int size = userRoleList.size();
   grantedAuthArray = new GrantedAuthority[size];
   int j = 0;
   for(int i = 0; i < size; i++) {
    String userRole = userRoleList.get(i);
    if(userRole != null) {
     this.grantedAuthArray[j++] = new GrantedAuthorityImpl(userRole.toUpperCase());
    }
   }
   LOG.info("UserName: " + username + " loaded successfully.");
        return new org.acegisecurity.userdetails.User(username, user.getPassword(),
           true, true, true, true, this.grantedAuthArray);
}

//按用户名查找user
public List<LotteryUsers> findAllByUsername(String username) {
List<LotteryUsers> list = new ArrayList<LotteryUsers>();
LotteryUsers user = new LotteryUsers();
String sql = "SELECT * FROM "+Constants.DATABASEPRE_KEY+"users u WHERE u.username='"+username+"' and u.enable=1";
ResultSet rs = dbManager.execute(sql);
try {
while(rs.next()){
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEnable(rs.getShort("enabled"));
list.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("class LotteryUsersDAOImpl's method findAllByUsername() error");
e.printStackTrace();
}finally{
try {
rs.close();
dbManager.close();
} catch (SQLException e) {
            System.out.println(" class lotteryUsersDAOImpl's method findAllByUsername() close dbManager accoure error");
e.printStackTrace();
}

}
return list;
}

public List<String> findGroupNameByUsername(String username) {
List<String> list = new ArrayList<String>();
String sql = "SELECT g.name name FROM "+Constants.DATABASEPRE_KEY+"users u,"+Constants.DATABASEPRE_KEY+"groups g"+
" WHERE g.id=u.group_id and u.username='"+username+"' and u.enable=1";
ResultSet rs = dbManager.execute(sql);
try {
while(rs.next()){
list.add(rs.getString("name"));
}
} catch (SQLException e) {
System.out.println(this.getClass().getName()+"dbManager execute error");
e.printStackTrace();
}finally{
try {
rs.close();
dbManager.close();
} catch (SQLException e) {
            System.out.println(" class lotteryUsersDAOImpl's method findGroupNameByUsername() close dbManager accoure error");
e.printStackTrace();
}
}
return list;
}

public DBManager getDbManager() {
return dbManager;
}

public void setDbManager(DBManager dbManager) {
this.dbManager = dbManager;
}
}
也可以:
<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
  <property name="dataSource" ref="dataSource"/>     
  <property name="usersByUsernameQuery">          
   <value>select username, password, enabled from user where username = ? and enabled = 1</value>      
  </property>
  <property name="authoritiesByUsernameQuery">          
   <value>
    select u.username, a.authority
    from user u, authorities a, user_auth ua
    where u.id=ua.user_id and a.id=ua.auth_id and u.username=?
   </value>      
  </property>
</bean>



3.类,方法的权限控制(两种):
<bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
   <property name="validateConfigAttributes" value="false" />
   <property name="authenticationManager" ref="authenticationManager" />
   <property name="accessDecisionManager" ref="accessDecisionManager" />
   <property name="objectDefinitionSource">
         <bean class="org.acegisecurity.intercept.method.MethodDefinitionAttributes">
             <property name="attributes">
               <!--  利用1.5Annotation的設定方式 -->
               <bean class="org.acegisecurity.annotation.SecurityAnnotationAttributes" />
             </property>
           </bean>
  </property>
</bean> 
<!-- 利用Spring的自动代理功能实现AOP代理 -->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  <property name="interceptorNames">
       <list>
      <value>methodSecurityInterceptor</value>
       </list>
  </property>
  <property name="beanNames">
       <list>
     <!--  需要保护的方法,在方法中用注释@Transactional(readOnly=true)
          @Secured({"ROLE_MANAGER"})
       -->
     <value>lotteryOddsImpl</value>
     <value>lotteryUsersDAOImpl</value>
     </list>
   </property>
   <!--property name="proxyTargetClass" value="true"/-->
</bean>
然后在相应的接口方法中用注释:
          @Secured({"ROLE_ADMIN"})
public void update(Users Users);

也可以:
<!-- 过滤拦截器 -->
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
      <property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
      <property name="objectDefinitionSource">
         <value>
       PATTERN_TYPE_APACHE_ANT
     
       <!-- 所有用户的权限 -->
       /searchUser.do=AUTH_USER,AUTH_ROOT,AUTH_RELEASER,AUTH_AUDITOR
    /updateInformation.do=AUTH_USER,AUTH_ROOT,AUTH_RELEASER,AUTH_AUDITOR
     
       <!-- 普通用户的权限 -->
    /preOrderAd.do=AUTH_USER
    /orderAd.do=AUTH_USER
    /myAdList.do=AUTH_USER
    /findReOrderAd.do=AUTH_USER
    /ReOrder.do=AUTH_USER
   
    <!--==== 超级管理员的权限 ====-->
   
    <!-- 审核员的权限 -->
    /noaudit.do=AUTH_AUDITOR,AUTH_ROOT
    /allAuditAdNoPass.do=AUTH_AUDITOR,AUTH_ROOT
    /auditedAd.do=AUTH_AUDITOR
    /audited.do=AUTH_AUDITOR,AUTH_ROOT
    /notify.do=AUTH_AUDITOR,AUTH_ROOT
    /editAuditedEmail.do=AUTH_AUDITOR,AUTH_ROOT
   
    <!-- 发布员的权限 -->
    /unpaymentOrderList.do=AUTH_RELEASER,AUTH_ROOT
    /paymentOrderList.do=AUTH_RELEASER,AUTH_ROOT  
   
    <!-- 超级管理员的权限 -->
    /manageAdpos.do=AUTH_ROOT
    /manageUser.do=AUTH_ROOT
    /addNewAdpos.do=AUTH_ROOT


         </value>
      </property>
    </bean>

2
0
分享到:
评论

相关推荐

    Acegi + Spring + Hibernate + Struts 2搭建基于角色的权限控制系统

    Acegi + Spring + Hibernate + Struts 2搭建基于角色的权限控制系统.doc

    Acegi + Spring + Hibernate + Struts2搭建

    Acegi是一个可插拔框架,主要是在SSH框架上插入Acegi安全框架。

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    Struts2+Spring+Hibernate3+Acegi.rar

    Struts2+Spring+Hibernate3+Acegi,对Acegi进行了扩展, 可直接在Myeclipse6.0.1下直接运行通过,

    STRUTS+SPRING+HIBERNATE内部培训教程

    該示例采用Strtus+Spring+Hibernate(簡稱SSH組合)實現一個簡單的電子公告板示例,演示了SSH組合在WEB中的一般應用,在這裡可以體驗到SSH組合清暫的分層,代碼簡潔清楚,各類文件之間的關係變得不再復雜了。...

    Struts2.0+spring2.0+hibernate3.1 ACEGI应用示例

    Struts2.0+spring2.0+hibernate3.1 ACEGI应用示例

    spring hibernate struts实现的精品课程网

    spring+hibernate+struts+acegi+mysql实现,完整程序,包括前台、用户中心、后台,可以直接在tomcat下运行。数据库的表通过hibernate动态生成。此程序是我自己开发的,里面涉及到文件上传、分页、fckeditor编辑器、...

    SSH + ajax + acegi

    本系统有更新版本,请用关键字struts spring hibernate acegi jotm等搜索新版本

    Hibernate+Struts+Spring

    在安全方面集成Spring的安全框架Acegi和最流行的Ajax技术。与其他框架相比,它提供了各种Web系统开发过程中都需要开发的一些功能,如登陆、用户密码加密,用户管理、根据不同的用户可以展现不同的菜单,同时还带有...

    ssh2权限控制系统

    Acegi_Spring_Hibernate_Struts2搭建基于角色的权限控制系统.doc

    spring in action英文版

     4.1.1 理解Spring的DataAccessException  4.1.2 与DataSource一起工作  4.1.3 一致的DAO支持  4.2 在Spring中使用JDBC  4.2.1 JDBC代码的问题  4.2.2 使用JdbcTemplate  4.2.3 把操作创建成...

    java文集

    Java 6 RowSet 使用完全剖析 结合Spring2.0和ActiveMQ进行异步消息调用 struts+hibernate增删改查(一) AXIS 布署问题 struts+hibernate增删改查(二) MySQL中如何实现Top N及M至N段的记录查询?...

    Faceye 基础版概框

    Ext2.1,Struts1.3,Hibernate3.2,Spring2.5,Acegi 1.06,MySQL 2.功能概述: Blog,RSS订阅,网址导航 3.特色 基于标准的SSH结构,基础Ext的展现界面,基于数据库的acegi安全认证.可随意更改的portal布局,可随意添加的...

    良葛格java学习笔记

    常見程式演算,電腦圖學入門,設計模式,C 語言,GTK,C++,Qt3,Qt4,,Java (上),Java (下),JSP/Servlet,JSF,Ajax,JUnit,Struts,Spring,Hibernate,Acegi

    open-JWeb(RAD)操作手册

    本文介绍open-JWeb(RAD)开发平台,此平台基于Spring+hibernate+struts+webwork+acegi+dwr技术,内容包括动态生成增删改查功能(含分页,查询,编辑等),无需编程即可实现.另外集成了强大的acegi框架,及基于FCKEDIT的信息...

    DWR中文文档.pdf

    34 4.2.4 使用Spring配置DWR 35 4.3 DWR与JSF 36 4.3.1 JSF Creator 36 4.3.2 Servlet Filter 36 4.4 DWR与Struts 37 4.4.1 Struts creator 37 4.4.2 开始顺序 37 4.5 DWR与...

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包11

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics