青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數(shù)據(jù)加載中……

Acegi + Spring + Hibernate + Struts 2搭建基于角色的權(quán)限控制系統(tǒng)

安全永遠(yuǎn)是WEB應(yīng)用系統(tǒng)必須面對的頭等大事, 也是最頭疼的事, 其實(shí)安全系統(tǒng)就只包括兩個問題: 認(rèn)證和授權(quán).

    以前做些網(wǎng)站系統(tǒng), 安全檢測邏輯都在放在須要安全控制的代碼前面, 這樣做有很多不好的地方, 重復(fù)多次的編碼就不用說了, 代碼移植性, 重用性都得不到體現(xiàn), 安全檢測邏輯要永遠(yuǎn)和業(yè)務(wù)邏輯放在一起.

    那么, 能不能夠在進(jìn)入方法前就調(diào)用一些安全檢測? 其實(shí)Spring AOP就是這個思想, 那么又如何實(shí)現(xiàn)安全檢測呢? Spring Acegi Security 框架就是做這個事情.

     本文主要是討論下在已有的SSH系統(tǒng)中, 如何使用Acegi作為安全框架實(shí)現(xiàn)基于角色的權(quán)限控制(Role Based Access Control RBAC) , 本文主要是以Java 5注解的形式來配置安全框架, 大大減化配置和操作.

    本文的主要參考資料: <Spring 2.0 核心技術(shù)與最佳實(shí)踐> 10 (Spring Acegi 安全框架)

                <精通Spring 2.X -- 企業(yè)應(yīng)用開發(fā)詳解> 17 (使用Acegi 實(shí)施應(yīng)用系統(tǒng)安全)

                acegi-security-1.0.6 官方文檔

    說明: 本文介紹的是RBAC, 在官方文檔的基礎(chǔ)上有所擴(kuò)展或改動, 以更適合WEB應(yīng)用系統(tǒng). 其實(shí)我覺得大多數(shù)的網(wǎng)站基于角色已經(jīng)足夠了, 一般都沒必要基于權(quán)限.

     文章開始:

. 下載所要的軟件或JAR:

    我的相關(guān)配置是: Java 5, Tomcat 5.5.26, Struts 2.0.11, Spring 2.5.1, Hibernate 3.2, Acegi 1.0.6

. 建立相關(guān)的數(shù)據(jù)庫:

     數(shù)據(jù)表: 用戶信息表User: id, enable, user_name, user_pass, email_box

                 角色信息表RoleInfo: id, role_name, role_title, descp

                 用戶與角色關(guān)聯(lián)表(用戶與角色是多對多關(guān)系)UserRole: user_id, user_name, role_id, role_name

                并在這三個表中插入相關(guān)的數(shù)據(jù), 我是定義了兩種角色(role_name): ROLE_USER, ROLE_ADMIN

                和三個用戶, 一個用戶角色為: ROLE_USER, ROLE_ADMIN

                 另一個用戶角色為: ROLE_USER

                第三個沒有角色.

. 修改配置文件:

    其實(shí)對Acegi框架的應(yīng)用難點(diǎn)就在配置文件, 所以要特別注意了:

    src 建立Acegi的配置文件: acegi-security.xml 當(dāng)然這個文件的名稱是可以任意的.

    acegi-security.xml 說白了就是配置: 安全攔截器, 認(rèn)證管理器, 決策管理器.

    其內(nèi)容如下:

<?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">
<!-- =========================
認(rèn)證管理器 ========================= -->
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
   <list>
    <ref bean="daoAuthenticationProvider" />
    <ref bean="rememberMeAuthenticationProvider" />
   </list>
</property>
</bean>

<!-- 基于DAO驗證的AuthenticationProvider -->
<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userDetailsService" />
</bean>
<bean id="userDetailsService" class="org.ymcn.security.AcegiUserDeitailsService">
<property name="userDao" ref="userDao" />
<property name="userRoleDao" ref="userRoleDao" />
</bean>

<bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="
obullxl@163.com" />
</bean>
<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService" />
<property name="parameter" value="j_remember_me" />
<property name="key" value="
obullxl@163.com" />
<property name="tokenValiditySeconds" value="31536000" />
</bean>

<!-- ========================= 決策管理器 ========================= -->
<bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
<property name="decisionVoters">
   <list>
    <ref bean="roleVoter" />
   </list>
</property>
<!--
是否全部棄權(quán)就通過
-->
<property name="allowIfAllAbstainDecisions" value="false" />
</bean>
<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
<property name="rolePrefix" value="ROLE_" />
</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,securityInterceptor
   </value>
</property>
</bean>
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />
<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
<!--
登錄退出后的
URL -->
<constructor-arg value="/" />
<constructor-arg>
   <list>
    <ref bean="rememberMeServices" />
    <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
   </list>
</constructor-arg>
<!--
登錄退出的URL -->
<property name="filterProcessesUrl" value="/j_logout.j" />
</bean>
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
<!--
登錄失敗后的URL -->
<property name="authenticationFailureUrl" value="/login.jsp?msg=%E6%97%A0%E6%95%88%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E6%88%96%E5%8F%A3%E4%BB%A4" />
<!--
登錄成功后的
URL -->
<property name="defaultTargetUrl" value="/user/cmd.jsp" />
<!--
登錄的
URL -->
<property name="filterProcessesUrl" value="/j_login.j" />
<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>
<bean id="exceptionFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<!--
出現(xiàn)AuthenticationException時的登錄入口
-->
<property name="authenticationEntryPoint">
   <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
   <property name="loginFormUrl" value="/login.jsp" />
    <property name="forceHttps" value="false" />
   </bean>
</property>
<!--
出現(xiàn)AccessDeniedException時的
Handler -->
<property name="accessDeniedHandler">
   <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
  <property name="errorPage" value="/denied.jsp" />
   </bean>
</property>
</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
    /admin/**=ROLE_ADMIN
    /user/**=ROLE_USER
    /cart/previeworder*=ROLE_USER
   </value>
</property>
</bean>

</beans>

    在上面的配置文件中, 紅色部分要特別注意, 其余的內(nèi)容都差不多了.

<bean id="userDetailsService" class="org.ymcn.security.AcegiUserDeitailsService">
<property name="userDao" ref="userDao" />
<property name="userRoleDao" ref="userRoleDao" />
</bean>

    在整個應(yīng)用的安全控制中, 我們唯一要編寫代碼的類就是: org.ymcn.security.AcegiUserDeitailsService

    就連登錄和登出的代碼也不要了.

. 修改 web.xml, 增加安全控制過濾鏈.

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

<filter-mapping>
        <filter-name>acegiFilterChain</filter-name>
        <url-pattern>*.j</url-pattern>
</filter-mapping>

    注意: 這個過濾器一定要在MVC轉(zhuǎn)發(fā)過濾器的前面!!!!

. applicationContext.xml 中增加 Acegi安全控制攔截器Spring的自動代理功能實(shí)現(xiàn)AOP代理

<!-- Acegi安全控制攔截器 -->
<bean id="serviceSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="validateConfigAttributes" value="true" />
<property name="authenticationManager" ref="authenticationManager" />
<property name="accessDecisionManager" ref="accessDecisionManager" />
<property name="objectDefinitionSource">
   <bean class="org.acegisecurity.intercept.method.MethodDefinitionAttributes">
    <property name="attributes">
     <bean class="org.acegisecurity.annotation.SecurityAnnotationAttributes" />
    </property>
   </bean>
</property>
</bean>

<!-- 利用Spring的自動代理功能實(shí)現(xiàn)AOP代理 -->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
   <list>
    <value>transactionInterceptor</value>
    <value>serviceSecurityInterceptor</value>
   </list>
</property>
<property name="beanNames">
   <list>
    <value>userService</value>
    <value>mailService</value>
   </list>
</property>
</bean>

. 編寫在利用Acegi框架唯一要我們編寫的類 AcegiUserDeitailsService.java

package org.ymcn.security;

import java.util.List;

import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.GrantedAuthorityImpl;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import org.ymcn.dao.UserDao;
import org.ymcn.dao.UserRoleDao;
import org.ymcn.model.User;
import org.ymcn.model.UserRole;

public class AcegiUserDeitailsService implements UserDetailsService {
private final Log LOG = LogFactory.getLog(AcegiUserDeitailsService.class);
/*
依賴注入 */
private UserDao userDao;
private UserRoleDao userRoleDao;

public void setUserDao(UserDao userDao) {
   this.userDao = userDao;
}
public void setUserRoleDao(UserRoleDao userRoleDao) {
   this.userRoleDao = userRoleDao;
}

/*
用戶所有的權(quán)限
*/
//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);
   }
   /*
取得用戶
*/
   User user = userDao.getUserByName(userName);
   if(user == null) {
    LOG.warn("UserDetails load failed: No such UserRole with userName: " + userName);
            throw new UsernameNotFoundException("User name is not found.");
   }
   /*
取得所有用戶權(quán)限
*/
   List<UserRole> userRoleList = userRoleDao.getUserRoleByUserName(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++) {
    UserRole userRole = userRoleList.get(i);
    if(userRole != null) {
     this.grantedAuthArray[j++] = new GrantedAuthorityImpl(userRole.getRoleName().toUpperCase());
    }
   }
   LOG.info("UserName: " + userName + " loaded successfully.");
        return new org.acegisecurity.userdetails.User(userName, user.getUserPass(),
           true, true, true, true, this.grantedAuthArray);
}
}

. 在業(yè)務(wù)邏輯代碼中利用Java 5注釋實(shí)現(xiàn)安全控制

@Secured({"ROLE_USER"})
void sendSimpleMail(Long userId);

@Secured({"ROLE_ADMIN"})
void sendAttachmentMail() throws Exception;

    其實(shí)就是在需要安全控制的方法前加上: @Secured({"角色名"}), 非常的簡單

. 整個工作完成

    Acegi框架完全是一種可插拔式的, 完全可以在原有的系統(tǒng)中加個一個配置文件, 和在每個方法前加上: @Secured({"角色名"}) 就可完成.

     上面的 AcegiUserDeitailsService.java 中的有 UserDao, UserRoleDao, 我想一看就知道它們是干什么的了, 這完全取決于個人的實(shí)現(xiàn), Acegi無關(guān), 它僅僅只要返回一個 return new org.acegisecurity.userdetails.User(userName, user.getUserPass(),
          true, true, true, true, this.grantedAuthArray)
就可以了.

發(fā)表于 @ 2009年06月16日 22:05:00|評論(3 )|舉報|收藏

新一篇: Quartz從入門到進(jìn)階 | 舊一篇: spring整合activeMq 調(diào)試JMS

accessmanager88 發(fā)表于2009年6月17日 12:23:36  IP:舉報
哦,看看我的BLOG。我也在做權(quán)限管理研究。旨在把變的非常簡單,不要這么多編程和XML配置。http://blog.csdn.net/accessmanager88
nlovea13 發(fā)表于2009年6月17日 12:38:17  IP:舉報
挺好的,學(xué)習(xí)了!
auuguu09 發(fā)表于2009年6月17日 14:06:15  IP:舉報
http://www.tmbm88.cn 九九美女 http://www.mostcc.cn 448藝術(shù)網(wǎng) http://www.100133.com 藝術(shù)中心 http://www.007009.com http://www.57617.com http://bq361.cn http://www.57deal.cn http://www.3330888.cn http://www.20998.com.cn http://www.cqcwct.cn http://181810.com http://www.a8bl.cn 小說 http://www.abcg008.cn 時代文章

posted on 2009-06-17 21:24 肥仔 閱讀(1629) 評論(0)  編輯 收藏 引用 所屬分類: Web-后臺

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久久久久一区 | 亚洲国产一区二区精品专区| 国产精品美女在线| 国产精品黄色| 韩国av一区二区三区| 国产真实乱偷精品视频免| 国产一区二区三区av电影| 樱花yy私人影院亚洲| 日韩亚洲国产精品| 午夜视黄欧洲亚洲| 久久伊伊香蕉| 日韩视频免费| 欧美一级视频精品观看| 久久在线免费| 欧美日韩中文字幕| 黄色国产精品| 亚洲视频中文字幕| 久久久久久久久久久一区| 亚洲电影免费观看高清完整版在线观看 | 午夜精品国产更新| 噜噜噜噜噜久久久久久91| 久久一区二区三区av| 91久久精品网| 亚洲欧美在线高清| 欧美成人激情视频免费观看| 国产精品高潮呻吟久久av无限| 国产综合精品| 亚洲亚洲精品三区日韩精品在线视频 | 蜜臀av一级做a爰片久久| 欧美精品久久久久久久免费观看| 欧美精品自拍| 精品福利电影| 性欧美暴力猛交69hd| 亚洲国产一区二区a毛片| 亚洲在线观看视频网站| 欧美国产视频在线观看| 极品日韩av| 欧美在线观看网站| 亚洲精品影院在线观看| 美日韩免费视频| 韩国三级电影一区二区| 午夜精品免费在线| 在线亚洲欧美专区二区| 欧美精品不卡| 亚洲精品一区在线观看| 美女视频网站黄色亚洲| 欧美一区二视频| 国产伦一区二区三区色一情| 亚洲一区免费网站| 日韩一级成人av| 欧美日韩一区二区精品| 亚洲毛片在线免费观看| 欧美激情精品久久久| 久久男人av资源网站| 亚洲高清电影| 欧美激情一区二区三区不卡| 美女视频黄免费的久久| 影音先锋亚洲视频| 免费高清在线视频一区·| 久久久久久网| 亚洲福利视频一区二区| 欧美成黄导航| 免费日韩av| 一区二区国产日产| 一级日韩一区在线观看| 国产精品家庭影院| 亚洲欧美日韩国产一区二区三区 | 亚洲成人中文| 欧美顶级艳妇交换群宴| 免费在线成人av| av成人黄色| 亚洲午夜免费视频| 国产精品综合av一区二区国产馆| 翔田千里一区二区| 欧美一区二区三区在线观看| 一区二区在线视频播放| 老司机凹凸av亚洲导航| 久久午夜羞羞影院免费观看| 亚洲精品一区二区三区四区高清| 亚洲国产综合视频在线观看| 欧美日产国产成人免费图片| 亚洲男人av电影| 久久都是精品| 日韩视频免费| 亚洲国产婷婷香蕉久久久久久99| 亚洲免费小视频| 一区二区三区四区在线| 欧美性淫爽ww久久久久无| 亚洲欧美成人综合| 久久本道综合色狠狠五月| 亚洲成人中文| 99精品热视频只有精品10| 国产精品午夜国产小视频| 久久伊人免费视频| 欧美人成网站| 欧美在线三区| 欧美激情欧美激情在线五月| 亚洲一区二区网站| 久久久精品一品道一区| 中日韩美女免费视频网址在线观看| 亚洲一区在线播放| 亚洲激情在线观看| 亚洲视频免费看| 亚洲黄色高清| 亚洲一区二区欧美| 亚洲国内自拍| 欧美一区二区三区四区视频| av不卡在线观看| 久久裸体艺术| 欧美亚洲一区在线| 欧美岛国在线观看| 久久一区二区视频| 国产精品毛片在线看| 91久久国产自产拍夜夜嗨| 国产精品久久久久影院色老大| 亚洲电影免费在线| 伊人成年综合电影网| 亚洲女人天堂av| 亚洲午夜精品一区二区| 欧美成人一区二区三区| 久久久www成人免费毛片麻豆| 欧美日韩另类在线| 最新国产乱人伦偷精品免费网站| 狠狠色狠狠色综合日日五| 一区二区三区四区国产精品| 亚洲美女视频在线免费观看| 可以看av的网站久久看| 久久综合色影院| 国产亚洲精品成人av久久ww| 亚洲综合二区| 久久国产精品久久国产精品| 欧美视频你懂的| 一本色道久久综合亚洲91| 亚洲精品自在久久| 欧美激情在线有限公司| 亚洲国产日韩一区二区| 亚洲精选视频在线| 欧美激情欧美激情在线五月| 亚洲欧洲日本国产| av成人手机在线| 欧美天堂亚洲电影院在线播放| 日韩视频一区二区三区| 亚洲色诱最新| 国产精品免费电影| 亚洲欧美日韩精品久久亚洲区| 欧美一区二区三区免费视频| 国产精品久久国产三级国电话系列 | 亚洲人成人一区二区在线观看 | 亚洲精品欧美日韩| 欧美电影在线观看| 亚洲啪啪91| 亚洲欧美日韩高清| 国产一区av在线| 鲁大师影院一区二区三区| 亚洲国产成人porn| 亚洲午夜高清视频| 国产一区二区三区久久| 嫩草国产精品入口| 99在线热播精品免费| 欧美专区亚洲专区| 亚洲国产欧美在线| 欧美乱妇高清无乱码| 亚洲一区二区少妇| 免费不卡在线观看av| 99精品免费| 国产婷婷色一区二区三区在线| 久久亚洲国产成人| 日韩视频二区| 久久网站免费| 99视频精品在线| 国产午夜精品视频| 欧美激情精品久久久久久黑人 | 男人插女人欧美| 国产精品99久久久久久久久| 久久九九精品| 亚洲视频在线观看三级| 国产曰批免费观看久久久| 欧美14一18处毛片| 午夜性色一区二区三区免费视频 | 欧美在线视频导航| 亚洲欧洲三级| 可以看av的网站久久看| 亚洲毛片在线观看.| 国产亚洲精品久| 欧美色大人视频| 麻豆91精品91久久久的内涵| 亚洲一区www| 亚洲国产精品悠悠久久琪琪| 欧美自拍偷拍| 亚洲一区三区电影在线观看| 亚洲二区在线视频| 国产一区观看| 国产伦精品一区二区三区四区免费 | 国产精品中文字幕在线观看| 久久精品一二三区| 亚洲天堂久久| 亚洲理伦在线| 亚洲高清视频在线| 牛牛国产精品| 久久都是精品|