<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    spring security 配置文件小結(jié)(逐步深化到url級別)

    Java代碼 復(fù)制代碼 收藏代碼
    1. 一 、方式一:用戶名密碼都在配置文件中。   
    2. <?xml version="1.0" encoding="UTF-8"?>   
    3. <beans:beans xmlns="http://www.springframework.org/schema/security"  
    4.     xmlns:beans="http://www.springframework.org/schema/beans"  
    5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    7.     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
    8.     http://www.springframework.org/schema/security   
    9.     http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">   
    10.   
    11.     <http auto-config='true'>   
    12.         <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />   
    13.         <intercept-url pattern="/**" access="ROLE_USER" />   
    14.     </http>   
    15.   
    16.     <authentication-provider>   
    17.         <user-service>   
    18.             <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />   
    19.             <user name="user" password="user" authorities="ROLE_USER" />   
    20.         </user-service>   
    21.     </authentication-provider>   
    22.   
    23. </beans:beans>   
    24.   
    25.   
    26. 二、方式二:運(yùn)用spring security 提供的默認(rèn)表結(jié)構(gòu),authentication部分修改如下:   
    27.     <authentication-provider>   
    28.         <jdbc-user-service data-source-ref="dataSource"/>   
    29.     </authentication-provider>   
    30.   
    31.     <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
    32.         <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>   
    33.         <beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/>   
    34.         <beans:property name="username" value="sa"/>   
    35.         <beans:property name="password" value=""/>   
    36.     </beans:bean>   
    37.        
    38.        
    39. 三、方式三:運(yùn)用原先本地的數(shù)據(jù)庫,authentication修改如下:   
    40.     <authentication-provider>   
    41.         <jdbc-user-service data-source-ref="dataSource"  
    42.             users-by-username-query="select username,password,status as enabled   
    43.                                          from user   
    44.                                         where username=?"   
    45.             authorities-by-username-query="select u.username,r.name as authority   
    46.                                              from user u   
    47.                                              join user_role ur   
    48.                                                on u.id=ur.user_id   
    49.                                              join role r   
    50.                                                on r.id=ur.role_id   
    51.                                             where u.username=?"/>   
    52.     </authentication-provider>   
    53.                
    54.  注:   
    55.  users-by-username-query為根據(jù)用戶名查找用戶,系統(tǒng)通過傳入的用戶名查詢當(dāng)前用戶的登錄名,密碼和是否被禁用這一狀態(tài)。   
    56.  authorities-by-username-query為根據(jù)用戶名查找權(quán)限,系統(tǒng)通過傳入的用戶名查詢當(dāng)前用戶已被授予的所有權(quán)限。   
    57.     
    58. 四、方式四;在方式三的基礎(chǔ)上,修改登錄頁面   
    59. 在xml中的http標(biāo)簽中添加一個form-login標(biāo)簽。   
    60.   
    61. <http auto-config='true'>   
    62.     <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />[1]   
    63.     <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />   
    64.     <intercept-url pattern="/**" access="ROLE_USER" />   
    65.     <form-login login-page="/login.jsp"[2]   
    66.                 authentication-failure-url="/login.jsp?error=true"[3]   
    67.                 default-target-url="/" />[4]   
    68. </http>   
    69.            
    70.     
    71. 1、讓沒登陸的用戶也可以訪問login.jsp。[1]   
    72.   
    73. 這是因?yàn)榕渲梦募械?#8220;/**”配置,要求用戶訪問任意一個系統(tǒng)資源時,必須擁有ROLE_USER角色,/login.jsp也不例外,如果我們不為/login.jsp單獨(dú)配置訪問權(quán)限,會造成用戶連登陸的權(quán)限都沒有,這是不正確的。   
    74.     
    75.  2、login-page表示用戶登陸時顯示我們自定義的login.jsp。[2]   
    76.   
    77. 這時我們訪問系統(tǒng)顯示的登陸頁面將是我們上面創(chuàng)建的login.jsp。   
    78.     
    79.  3、authentication-failure-url表示用戶登陸失敗時,跳轉(zhuǎn)到哪個頁面。[3]   
    80.   
    81. 當(dāng)用戶輸入的登錄名和密碼不正確時,系統(tǒng)將再次跳轉(zhuǎn)到/login.jsp,并添加一個error=true參數(shù)作為登陸失敗的標(biāo)示。   
    82.     
    83.     
    84.  4default-target-url表示登陸成功時,跳轉(zhuǎn)到哪個頁面。[4]   
    85.     
    86.  五、方式五:使用數(shù)據(jù)配置角色可以訪問的資源(控制到URL級別)(可以參見工程005)   
    87. <!--從配置文件上可以看到,Spring Security所需的數(shù)據(jù)應(yīng)該是一系列URL網(wǎng)址和訪問這些網(wǎng)址所需的權(quán)限:   
    88.   
    89. <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />   
    90. <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />   
    91. <intercept-url pattern="/**" access="ROLE_USER" />   
    92.                
    93. SpringSecurity所做的就是在系統(tǒng)初始化時,將以上XML中的信息轉(zhuǎn)換為特定的數(shù)據(jù)格式,而框架中其他組件可以利用這些特定格式的數(shù)據(jù),用于控制之后的驗(yàn)證操作。現(xiàn)在這些資源信息都保存在數(shù)據(jù)庫中了,從數(shù)據(jù)庫中取出數(shù)據(jù),然后讓它等同于從xml文件中取出,需要做以下幾步。   
    94. -->   
    95.  1、實(shí)現(xiàn)一個符合該功能的類,主要參看該類中1-5步驟,了解即可。   
    96.  <!--   
    97.   
    98. public class JdbcFilterInvocationDefinitionSourceFactoryBean   
    99.     extends JdbcDaoSupport implements FactoryBean {   
    100.     private String resourceQuery;   
    101.   
    102.     public boolean isSingleton() {   
    103.         return true;   
    104.     }   
    105.   
    106.     public Class getObjectType() {   
    107.         return FilterInvocationDefinitionSource.class;   
    108.     }   
    109.     //4、 使用urlMatcher和requestMap創(chuàng)建DefaultFilterInvocationDefinitionSource。   
    110.     public Object getObject() {   
    111.         return new DefaultFilterInvocationDefinitionSource(this  
    112.             .getUrlMatcher(), this.buildRequestMap());   
    113.     }   
    114.     //2、這樣我們可以執(zhí)行它的execute()方法獲得所有資源信息。并把它封裝到map中。   
    115.     
    116.     protected Map<String, String> findResources() {   
    117.         ResourceMapping resourceMapping = new ResourceMapping(getDataSource(),   
    118.                 resourceQuery);   
    119.   
    120.         Map<String, String> resourceMap = new LinkedHashMap<String, String>();   
    121.   
    122.         for (Resource resource : (List<Resource>) resourceMapping.execute()) {   
    123.             String url = resource.getUrl();   
    124.             String role = resource.getRole();   
    125.   
    126.             if (resourceMap.containsKey(url)) {   
    127.                 String value = resourceMap.get(url);   
    128.                 resourceMap.put(url, value + "," + role);   
    129.             } else {   
    130.                 resourceMap.put(url, role);   
    131.             }   
    132.         }   
    133.   
    134.         return resourceMap;   
    135.     }   
    136.        
    137.        
    138. /*    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />   
    139.     <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />   
    140.     <intercept-url pattern="/**" access="ROLE_USER" />*/   
    141.   
    142.     //3、使用獲得的資源信息組裝requestMap。再把第二步封裝到map中的方法進(jìn)一步加工,使它等價于“如spring從上面模式的配置文件中讀取一樣”   
    143.     protected LinkedHashMap<RequestKey, ConfigAttributeDefinition> buildRequestMap() {   
    144.         LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = null;   
    145.         requestMap = new LinkedHashMap<RequestKey, ConfigAttributeDefinition>();   
    146.   
    147.         ConfigAttributeEditor editor = new ConfigAttributeEditor();   
    148.   
    149.         Map<String, String> resourceMap = this.findResources();   
    150.   
    151.         for (Map.Entry<String, String> entry : resourceMap.entrySet()) {   
    152.             RequestKey key = new RequestKey(entry.getKey(), null);   
    153.             editor.setAsText(entry.getValue());   
    154.             requestMap.put(key,   
    155.                 (ConfigAttributeDefinition) editor.getValue());   
    156.         }   
    157.   
    158.         return requestMap;   
    159.     }   
    160.   
    161.     protected UrlMatcher getUrlMatcher() {   
    162.         return new AntUrlPathMatcher();   
    163.     }   
    164.   
    165.     public void setResourceQuery(String resourceQuery) {   
    166.         this.resourceQuery = resourceQuery;   
    167.     }   
    168.   
    169.     private class Resource {   
    170.         private String url;   
    171.         private String role;   
    172.   
    173.         public Resource(String url, String role) {   
    174.             this.url = url;   
    175.             this.role = role;   
    176.         }   
    177.   
    178.         public String getUrl() {   
    179.             return url;   
    180.         }   
    181.   
    182.         public String getRole() {   
    183.             return role;   
    184.         }   
    185.     }   
    186.     //1、我們通過定義一個MappingSqlQuery實(shí)現(xiàn)數(shù)據(jù)庫操作。   
    187.     private class ResourceMapping extends MappingSqlQuery {   
    188.         protected ResourceMapping(DataSource dataSource,   
    189.             String resourceQuery) {   
    190.             super(dataSource, resourceQuery);   
    191.             compile();   
    192.         }   
    193.   
    194.         protected Object mapRow(ResultSet rs, int rownum)   
    195.             throws SQLException {   
    196.             String url = rs.getString(1);   
    197.             String role = rs.getString(2);   
    198.             Resource resource = new Resource(url, role);   
    199.   
    200.             return resource;   
    201.         }   
    202.     }   
    203. }   
    204.   
    205.  -->   
    206.  2、替換原有功能的切入點(diǎn)   
    207.  在spring中配置我們編寫的代碼。   
    208.   
    209. <beans:bean id="filterInvocationDefinitionSource"  
    210.     class="com.family168.springsecuritybook.ch005.JdbcFilterInvocationDefinitionSourceFactoryBean">   
    211.     <beans:property name="dataSource" ref="dataSource"/>   
    212.     <beans:property name="resourceQuery" value="   
    213.         select re.res_string,r.name   
    214.           from role r   
    215.           join resc_role rr   
    216.             on r.id=rr.role_id   
    217.           join resc re   
    218.             on re.id=rr.resc_id   
    219.       order by priority   
    220.     "/>   
    221. </beans:bean>   
    222.                
    223. 下一步使用這個filterInvocationDefinitionSource創(chuàng)建filterSecurityInterceptor,并使用它替換系統(tǒng)原來創(chuàng)建的那個過濾器。   
    224.   
    225. <beans:bean id="filterSecurityInterceptor"  
    226.     class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType">   
    227.     <custom-filter before="FILTER_SECURITY_INTERCEPTOR" />   
    228.     <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource" />   
    229. </beans:bean>   
    230.                
    231. 注意這個custom-filter標(biāo)簽,它表示將filterSecurityInterceptor放在框架原來的FILTER_SECURITY_INTERCEPTOR過濾器之前,這樣我們的過濾器會先于原來的過濾器執(zhí)行,因?yàn)樗墓δ芘c老過濾器完全一樣,所以這就等于把原來的過濾器替換掉了。   
    232.     
    233.  3、完整的配置文件如下所示:   
    234.   
    235. <?xml version="1.0" encoding="UTF-8"?>   
    236. <beans:beans xmlns="http://www.springframework.org/schema/security"  
    237.     xmlns:beans="http://www.springframework.org/schema/beans"  
    238.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    239.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
    240.     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
    241.     http://www.springframework.org/schema/security   
    242.     http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">   
    243.   
    244.     <http auto-config="true"/>   
    245.   
    246.     <authentication-provider>   
    247.         <jdbc-user-service data-source-ref="dataSource"  
    248.             users-by-username-query="select username,password,status as enabled   
    249.                                        from user   
    250.                                       where username=?"   
    251.             authorities-by-username-query="select u.username,r.name as authority   
    252.                                              from user u   
    253.                                              join user_role ur   
    254.                                                on u.id=ur.user_id   
    255.                                              join role r   
    256.                                                on r.id=ur.role_id   
    257.                                             where u.username=?"/>   
    258.     </authentication-provider>   
    259.   
    260.     <beans:bean id="filterSecurityInterceptor"  
    261.         class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType">   
    262.         <custom-filter before="FILTER_SECURITY_INTERCEPTOR" />   
    263.         <beans:property name="objectDefinitionSource" ref="filterInvocationDefinitionSource" />   
    264.     </beans:bean>   
    265.   
    266.     <beans:bean id="filterInvocationDefinitionSource"  
    267.         class="com.family168.springsecuritybook.ch05.JdbcFilterInvocationDefinitionSourceFactoryBean">   
    268.         <beans:property name="dataSource" ref="dataSource"/>   
    269.         <beans:property name="resourceQuery" value="   
    270.             select re.res_string,r.name   
    271.               from role r   
    272.               join resc_role rr   
    273.                 on r.id=rr.role_id   
    274.               join resc re   
    275.                 on re.id=rr.resc_id   
    276.           order by priority   
    277.         "/>   
    278.     </beans:bean>   
    279.   
    280.     <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
    281.         <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/>   
    282.         <beans:property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/>   
    283.         <beans:property name="username" value="sa"/>   
    284.         <beans:property name="password" value=""/>   
    285.     </beans:bean>   
    286. </beans:beans>   
    287.   
    288.   
    289.  4、允許動態(tài)增加某個用戶權(quán)限。   
    290.  目前存在的問題是,系統(tǒng)會在初始化時一次將所有資源加載到內(nèi)存中,即使在數(shù)據(jù)庫中修改了資源信息,系統(tǒng)也不會再次去從數(shù)據(jù)庫中讀取資源信息。這就造成了每次修改完數(shù)據(jù)庫后,都需要重啟系統(tǒng)才能時資源配置生效。   
    291.   
    292. 解決方案是,如果數(shù)據(jù)庫中的資源出現(xiàn)的變化,需要刷新內(nèi)存中已加載的資源信息時,使用下面代碼:   
    293.   
    294. <%@page import="org.springframework.context.ApplicationContext"%>   
    295. <%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>   
    296. <%@page import="org.springframework.beans.factory.FactoryBean"%>   
    297. <%@page import="org.springframework.security.intercept.web.FilterSecurityInterceptor"%>   
    298. <%@page import="org.springframework.security.intercept.web.FilterInvocationDefinitionSource"%>   
    299. <%   
    300.     ApplicationContext ctx =  WebApplicationContextUtils.getWebApplicationContext(application);   
    301.     FactoryBean factoryBean = (FactoryBean) ctx.getBean("&filterInvocationDefinitionSource");   
    302.     FilterInvocationDefinitionSource fids = (FilterInvocationDefinitionSource) factoryBean.getObject();   
    303.     FilterSecurityInterceptor filter = (FilterSecurityInterceptor) ctx.getBean("filterSecurityInterceptor");   
    304.     filter.setObjectDefinitionSource(fids);   
    305. %>   
    306. <jsp:forward page="/"/>

    posted on 2011-09-06 14:22 sichuanxiaohuo 閱讀(3527) 評論(0)  編輯  收藏 所屬分類: spring


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計

    留言簿

    文章分類

    文章檔案

    link

    搜索

    最新評論

    主站蜘蛛池模板: 猫咪免费人成网站在线观看| 久章草在线精品视频免费观看| 亚洲av成人片在线观看| 99在线热视频只有精品免费| 女人被免费视频网站| 亚洲欧洲校园自拍都市| 国产猛男猛女超爽免费视频| 亚洲国产精品va在线播放| 国产午夜精品久久久久免费视| 亚洲一区爱区精品无码| 在线看片免费人成视频福利| 情人伊人久久综合亚洲| 免费无码又爽又刺激高潮视频| 亚洲国产国产综合一区首页| 最新黄色免费网站| 中文日韩亚洲欧美制服| 国产在线ts人妖免费视频| 免费一区二区无码视频在线播放 | 精品免费人成视频app| 亚洲不卡视频在线观看| 成年丰满熟妇午夜免费视频| 老司机午夜性生免费福利| 久久亚洲中文字幕精品一区四 | 黄页网站在线观看免费| 国产一区二区三区在线免费| 一级做a爰片久久毛片免费看 | 国产AV无码专区亚洲AV漫画 | 四虎影视精品永久免费网站| 九九全国免费视频| 久久亚洲精品无码VA大香大香| 岛国av无码免费无禁网站| 一区二区三区免费在线视频| 中文字幕影片免费在线观看| 亚洲三区在线观看无套内射| 曰批视频免费40分钟试看天天| 中文字幕乱码亚洲精品一区| 亚洲综合AV在线在线播放| 114一级毛片免费| 亚洲国产精品综合久久一线| 免费黄网站在线观看| 亚洲日韩一区二区三区|