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

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

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

    隨筆-126  評論-247  文章-5  trackbacks-0

    Spring Security 為基于 Java EE 企業應用提供了全面安全服務。安全主要包括兩個方面的操作:“認證”和“驗證”(或者說是權限的控制)。

    “認證”是為用戶建立一個他所聲明的主體的過程(有點像注冊賬號);“驗證”是指一個用戶能否在你的應用中執行某個操作。

    其他的就不多廢話了,直接進入主題,下面是 Spring Security 官網的下載地址:

    官網下載地址 1: http://static.springsource.org/spring-security/site/downloads.html

    官網下載地址 2:http://www.springsource.org/download/community?project=Spring%2520Security

    建議你點第二個超鏈接下載,下載地址 2 是提供了 Spring Security 的各個版本下載列表,只是下載前需要填寫一點信息,你可以隨便填點東西提交過去就能下載了。

    Spring Security 目前最新版本是 3.1.2,本人用的是 3.0.5 版本,3.0.x 和 3.1.x 版本有很大的不同,請根據不同的版本查看相應的幫助文檔來使用。

    Spring Security 3.0.5 官網下載地址: http://s3.amazonaws.com/dist.springframework.org/release/SEC/spring-security-3.0.5.RELEASE.zip

    準備環境:

     
    Eclipse :3.6
    Maven :3.0.4
    Spring  :3.0.5
    Spring Security :3.0.5
     

    在做 Java EE 運用開發的時候,筆者身邊有不少朋友都是用 myeclipse IDE 作為開發環境,筆者很長一段時間也是在用 myeclipse 作為開發工具,使用 myeclipse 的好處自然要比

    使用 eclipse 的好處多,從 myeclipse 換到 eclipse 開發環境中,你會發現 myeclipse 的兩個很顯然的好處是,導包方便和集成了各種服務器,部署和啟動服務器方便快捷,但在

    eclipse 中卻不然,所以這里借助 maven 來完成這些工作,沒有接觸過 maven 的也沒有關系,你只需要知道下面用 maven 是為了導包和部署以及啟動服務器就行了。其余的與你

    在 myeclipse 上做開發是一樣的。

    先來看下 maven 的配置文件 pom.xml:
     
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation
    ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
      
    <modelVersion>4.0.0</modelVersion>
      
    <groupId>com.fancy</groupId>
      
    <artifactId>SpringSecurityDemo</artifactId>
      
    <packaging>war</packaging>
      
    <version>1.0</version>
      
    <name>SpringSecurityDemo Maven Webapp</name>
      
    <url>http://maven.apache.org</url>
      
      
    <properties>
        
    <spring.version>3.0.5.RELEASE</spring.version>
      
    </properties>
      
      
    <dependencies>
        
    <!-- Spring framework -->
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-core</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <!-- Spring Dependency Start -->
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-context</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-beans</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-aop</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-web</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-orm</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <dependency>     
          
    <groupId>org.springframework</groupId>     
          
    <artifactId>spring-expression</artifactId>     
          
    <version>${spring.version}</version> 
        
    </dependency>
        
    <dependency>
          
    <groupId>org.springframework</groupId>
          
    <artifactId>spring-context-support</artifactId>
          
    <version>${spring.version}</version>
        
    </dependency>
        
    <!-- Spring Dependency End -->
        
    <!-- Spring Security -->
        
    <dependency>
          
    <groupId>org.springframework.security</groupId>     
          
    <artifactId>spring-security-core</artifactId>     
          
    <version>${spring.version}</version> 
        
    </dependency>
        
    <dependency>     
          
    <groupId>org.springframework.security</groupId>     
          
    <artifactId>spring-security-web</artifactId>     
          
    <version>${spring.version}</version> 
        
    </dependency> 
        
    <dependency>     
          
    <groupId>org.springframework.security</groupId>     
          
    <artifactId>spring-security-config</artifactId>     
          
    <version>${spring.version}</version> 
        
    </dependency>
        
    <!-- Spring Security End -->
      
    </dependencies>
      
      
    <build>
        
    <finalName>SpringSecurityDemo</finalName>
        
    <!-- Jetty Server -->
        
    <plugins>
          
    <plugin>
            
    <groupId>org.mortbay.jetty</groupId>
            
    <artifactId>maven-jetty-plugin</artifactId>
            
    <version>6.1.10</version>
            
    <configuration>
              
    <scanIntervalSeconds>2</scanIntervalSeconds>
            
    </configuration>
          
    </plugin>
        
    </plugins>
      
    </build>
    </project>
     

    上面配置所做的工作是,將 Spring 3.0.5 和 Spring Security 3.0.5 所需的 jar 包導入工程中,并以 jetty 作為運用服務器,相應的,如果你沒有使用 maven,你完全可以忽略無視

    這里的配置,而只需將這些 jar 包導入到你的工程中。

    使用 Spring Security 需要在 web.xml 配置文件中配置下面的一句話:

     
     <filter>
        
    <filter-name>springSecurityFilterChain</filter-name>
        
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
      
    </filter>
      
      
    <filter-mapping>
        
    <filter-name>springSecurityFilterChain</filter-name>
        
    <url-pattern>/*</url-pattern>
      
    </filter-mapping>
     

    下面看 web.xml 文件如何配置:

     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation
    ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      
      
    <!-- 開啟Spring監聽 -->
      
    <context-param>
         
    <param-name>contextConfigLocation</param-name>
         
    <param-value>classpath:applicationContext*.xml</param-value>
      
    </context-param>
      
    <listener>      
         
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      
    </listener>
      
      
    <!-- Spring FilterChain(security) -->
      
    <filter>
        
    <filter-name>springSecurityFilterChain</filter-name>
        
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
      
    </filter>
      
    <filter-mapping>
        
    <filter-name>springSecurityFilterChain</filter-name>
        
    <url-pattern>/*</url-pattern>
      
    </filter-mapping>
      
      
    <welcome-file-list>
        
    <welcome-file>view/index.jsp</welcome-file>
      
    </welcome-file-list>

    </web-app>
     

    接觸過 Spring 的朋友對 Spring 的配置一定不會陌生的了,以上配置是將所有與 Spring 配置相關的配置文件配置到了 classpath 目錄下,在 myeclipse 上做開發的朋友一般會把它

    配置到
    WEB-INF 目錄文件下,即把 <param-value>classpath:applicationContext*.xml</param-value> 替換成

    <param-value>/WEB-INF/applicationContext*.xml</param-value>,在此,你可以根據情況來配置它的存放位置。另外,把默認的首頁 index.jsp 配置成了 view 目錄下的

    index.jsp。view 目錄接下來會講到,在 webapp 目錄下新建一個 view 文件夾,如果是 myeclipse 開發環境的,就在 WebRoot 目錄下新建此文件夾,在 view 文件夾下再新建

    user、admin 兩個文件夾,在 view 目錄下新建一個 index.jsp:

    view/index.jsp
     
    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

     
    <head>
       
    <title>Welcome Page</title>
     
    </head>
     
     
    <body>
       
    <h3>所有人可見頁面!</h3>
       
    <h2>Welcome!</h2>
       
    <HR>
       
    <h4>Spring Security 權限管理訪問:</h4>
       
    <href="${pageContext.request.contextPath}/view/user/user.jsp">user.jsp</a> <BR>
       
    <href="${pageContext.request.contextPath}/view/admin/admin.jsp">admin.jsp</a>
     
    </body>

    </html>
     

    在 user 目錄下新建一個 user.jsp:

    view/user/user.jsp
     
    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

     
    <head>
       
    <title>User Page</title>
     
    </head>
     
     
    <body>
       
    <h3>此處內容至少是普通用戶才可見!</h3>
       
    <h2>Hello User!</h2>
       
    <HR>
       
    <h4>Spring Security 權限管理訪問:</h4>
       
    <href="${pageContext.request.contextPath}/view/index.jsp">index.jsp</a> <BR>
       
    <href="${pageContext.request.contextPath}/view/admin/admin.jsp">admin.jsp</a>
     
    </body>

    </html>
     

    在 admin 目錄下新建一個 admin.jsp:

    view/admin/admin.jsp
     
    <%@ page language="java" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

     
    <head>
       
    <title>Admin Page</title>
     
    </head>
     
     
    <body>
       
    <h3>此處內容管理員用戶才可見!</h3>
       
    <h2>Hello Admin!</h2>
       
    <HR>
       
    <h4>Spring Security 權限管理訪問:</h4>
       
    <href="${pageContext.request.contextPath}/view/index.jsp">index.jsp</a> <BR>
       
    <href="${pageContext.request.contextPath}/view/user/user.jsp">user.jsp</a>
     
    </body>

    </html>
     


    在 classpath 目錄下新建一個 applicationContext-security.xml 文件,該文件是 Spring Security 的配置文件,文件的名字不是固定的,可根據情況來取名。

    applicationContext-security.xml 配置:
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:beans
    ="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-3.0.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"
    >


        
    <http auto-config="true">
          
    <!-- 以下文件不檢查權限 -->
          
    <intercept-url pattern="/view/*" filters="none"/>
          
    <!-- 訪問權限 -->
          
    <intercept-url pattern="/view/user/**" access="ROLE_USER"/>
          
    <intercept-url pattern="/view/admin/**" access="ROLE_ADMIN"/>
        
    </http>
        
        
    <authentication-manager>
          
    <authentication-provider>
            
    <user-service>
              
    <user name="fancy" password="fan123" authorities="ROLE_USER" />
              
    <user name="fancydeepin" password="fan456" authorities="ROLE_USER,ROLE_ADMIN" />
            
    </user-service>
          
    </authentication-provider>
        
    </authentication-manager>
      
    </beans:beans>
     

    以上的這個文件的配置是關鍵,其中:
     
    <beans:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:beans
    ="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-3.0.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"
    >

        …… ……

    </beans:beans>
     

    這是 Spring Security 3.0.5 所使用的命名空間的固定寫法,沒什么好講的,照抄就行,不同版本的命名空間所使用的配置方式不一樣,具體配置請查看 Spring Security 的幫助文檔。

    <http></http> 是實現安全的配置,具體如下:

    預備基本知識:

    假設 A 文件夾下有個 B 文件夾,則:

    /A/*    表示:A 文件夾下的所有文件,但不包括 B 文件夾,B 文件夾里的文件與其無關;

    /A/**  表示:A 文件夾下的所有文件,包括 B 文件夾和 B 文件夾下的所有文件;

    它們的區別是,“/*” 不能夠跨文件夾,而 “/**” 能夠跨文件夾。

    <intercept-url pattern="/view/*" filters="none"/>: pattern="/view/*"  —> view 目錄下的所有文件filters="none" —> 不驗證權限,即,所有用戶都可直接訪問;

    <intercept-url pattern="/view/user/**" access="ROLE_USER"/>: access="ROLE_USER" —> 只有 ROLE_USER 權限的用戶才可訪問 user 目錄下的文件;

    <intercept-url pattern="/view/admin/**" access="ROLE_ADMIN"/>: access="ROLE_ADMIN" —> 只有 ROLE_ADMIN 權限的用戶才可訪問 admin 目錄下的文件。

    接著來看驗證管理的配置:
     
        <authentication-manager>
          
    <authentication-provider>
            
    <user-service>
              
    <user name="user" password="userpassword" authorities="ROLE_USER" />
              
    <user name="admin" password="adminpassword" authorities="ROLE_USER,ROLE_ADMIN" />
            
    </user-service>
          
    </authentication-provider>
        
    </authentication-manager>
     

    在這里,配置兩種不同權限的用戶,它們分別是:

    賬號:user,密碼:userpassword,權限是:ROLE_USER

    賬號:admin,密碼:adminpassword,權限是:ROLE_USER、ROLE_ADMIN

    最后,來看一下整個 demo 的目錄結構:



    運行服務器,訪問:http://localhost:8080/SpringSecurityDemo/



    接著點擊 user.jsp 或 admin.jsp 中的隨便一個超鏈接,假設點擊的是 use.jsp 的超鏈接:


    這時候就奇怪了,它并沒有去到 user.jsp 的頁面,而是出來了一個像登錄一樣的頁面,再觀察一下地址欄,我們確實沒有在程序中編寫過這個頁面,那么,它是怎么跑出來的呢?

    很簡單,因為在 applicationContext-security.xml 配置文件中配置了: <intercept-url pattern="/view/user/**" access="ROLE_USER"/>,也就是說,user.jsp 文件的訪問

    受到了保護,不是隨隨便便就能直接訪問的到的,因為 user.jsp 文件在 user 目錄下,而 user 目錄被配置了只有 ROLE_USER 權限的用戶才能夠訪問,所以,此時點擊 user.jsp

    超鏈接時并不能直接到達 user.jsp 頁面,Spring Security 會對這個訪問的請求進行驗證,故而出現了這個登錄頁面,這個登錄頁面是 Spring Security 內部默認的實現,所以,

    你會看到這個登錄頁面比較簡陋,實際上,我們都不直接使用這個登錄頁面,而是在 applicationContext-security.xml 配置文件中配置我們自己的登錄頁面,這個將在下篇隨筆

    提出,在這里,先將就用著這個登錄頁面。接著你就可以使用先前配置過的賬號登錄了,其中,賬號或密碼不正確都無法登錄系統,假設用 user 這個賬號登錄:


    此時,當點擊 index.jsp 超鏈接能不能回到 index.jsp 的頁面呢?能,任何時候都能,因為 index.jsp 是在 view 的根目錄下,而在 applicationContext-security.xml 配置文件中,

    配置了:<intercept-url pattern="/view/*" filters="none"/>,也就是說,index.jsp 是不受保護的,它可以在任何時候被任意用戶訪問;

    在此時,當點擊 admin.jsp 超鏈接時,能不能去到 admin.jsp 的頁面呢?如果此時你點擊了 admin.jsp 該超鏈接,則會報 403 ERROR:


    :403錯誤,是網站訪問過程中,常見的錯誤提示。資源不可用。服務器理解客戶的請求,但拒絕處理它。通常由于服務器上文件或目錄的權限設置導致。

    為什么會發出 403 錯誤呢?不是已經登錄了嗎?看上面有關 403 錯誤的解釋就很清楚了,這是因為在 applicationContext-security.xml 配置文件中,配置了:

    <intercept-url pattern="/view/admin/**" access="ROLE_ADMIN"/>,而 admin.jsp 在 admin 目錄下,所以訪問該文件所需的權限是 ROLE_ADMIN,而登錄的

    user 賬號所持有的訪問權限是 ROLE_USER,權限不一致,所以無法訪問 admin.jsp,以致 403 錯誤的產生。

    接下來換一個賬號登錄,使用 admin 賬號登錄,admin 賬號所持有的權限既有 ROLE_USER 的權限,又有 ROLE_ADMIN 的權限,所以用 admin 賬號登錄可以訪問

    index.jsp、user.jsp、admin.jsp,這幾個超鏈接用 admin 賬號都可以訪問的到,這里就不再演示了。

    限于篇幅,Spring Security 基礎篇完結,如本地安裝 maven 的朋友可直接下載本文 demo 運行,下載地址:http://files.blogjava.net/fancydeepin/SpringSecurityDemo.zip

    未完待續 ……



      
    posted on 2012-08-31 11:10 fancydeepin 閱讀(6459) 評論(5)  編輯  收藏

    評論:
    # re: Spring Security 3(Spring 安全服務)[未登錄] 2012-09-01 22:05 | spring
    改用3.1.2吧  回復  更多評論
      
    # re: Spring Security 3(Spring 安全服務) 2012-09-02 02:26 | fancydeepin
    回復: @by spring

    玩兒用 3.1.2 還可以,正真做開發的時候有誰是用最新的東西的?你見過??我沒見過  回復  更多評論
      
    # re: Spring Security 3(Spring 安全服務) 2012-09-07 11:01 | 葉楚鑫
    謝謝分享,不錯,期待更多內容。  回復  更多評論
      
    # re: Spring Security 3(Spring 安全服務) 2012-10-31 11:50 | haomood
    很詳細,表達能力也很好,可以當講師了  回復  更多評論
      
    # re: Spring Security 3(Spring 安全服務) 2013-08-19 20:57 | jis117
    講解和很好,非常清晰  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 久香草视频在线观看免费| 免费观看的a级毛片的网站| 亚洲成a人片在线不卡一二三区 | 久久精品国产亚洲| 亚洲AV成人精品日韩一区18p| 99re热免费精品视频观看| 一级毛片免费观看不卡的| 国产高清对白在线观看免费91| 亚洲人成人伊人成综合网无码| 久久精品亚洲中文字幕无码麻豆| 亚洲人成无码www久久久| 国产男女猛烈无遮挡免费视频| 99在线视频免费观看视频| 18观看免费永久视频| 无码日韩精品一区二区免费暖暖| 亚洲精品无码久久久久牙蜜区| 日韩精品无码免费专区午夜| 麻豆亚洲AV成人无码久久精品 | 亚洲高清在线mv| 久久亚洲国产精品五月天| 亚洲理论电影在线观看| AV在线播放日韩亚洲欧| 亚洲国产日韩在线观频| 在线a亚洲v天堂网2018| 国产成人精品免费视频大全五级| 夫妻免费无码V看片| 女人张开腿等男人桶免费视频| 一二三四在线播放免费观看中文版视频 | 亚洲AV成人一区二区三区AV| 亚洲午夜未满十八勿入网站2| 国产精品亚洲视频| 亚洲日本中文字幕一区二区三区 | 老湿机一区午夜精品免费福利| 亚洲av日韩综合一区久热| 亚洲av无码偷拍在线观看| 亚洲中文字幕久久无码| 亚洲av永久无码精品网址| 久久亚洲AV成人无码国产电影 | 亚洲中文字幕无码一区二区三区 | 羞羞漫画登录页面免费 | 国产成人A人亚洲精品无码|