Spring Security 3應用的11個步驟

醉面韋陀發表於2010-04-12
  1. Spring Security
    11個步驟為應用程式新增安全防護
  2. 歷史與現狀
    自2003年出現的Spring擴充套件外掛Acegi Security發展而來。
    目前最新版本為3.x,已成為Spring的一部分。
    為J2EE企業應用程式提供可靠的安全性服務。
  3. Authentication vs. Authorization
    區分概念驗證與授權
    驗證
    這個使用者是誰?
    使用者身份可靠嗎?
    授權
    某使用者A是否可以訪問資源R
    某使用者A是否可以執行M操作
    某使用者A是否可以對資源R執行M操作
  4. SS中的驗證特點
    支援多種驗證方式
    支援多種加密格式
    支援元件的擴充套件和替換
    可以本地化輸出資訊
  5. SS中的授權特點
    支援多種仲裁方式
    支援元件的擴充套件和替換
    支援對頁面訪問、方法訪問、物件訪問的授權。
  6. SS核心安全實現
    Web安全
    通過配置Servlet Filter啟用SS中的過濾器鏈
    實現Session一致性驗證
    實現免登陸驗證(Remember-Me驗證)
    提供一系列標籤庫進行頁面元素的安全控制
    方法安全
    通過AOP模式實現安全代理
    Web安全與方法安全均可以使用表示式語言定義訪問規則
  7. 配置SS
    配置Web.xml,應用安全過濾器
    配置Spring,驗證與授權部分
    在web頁面中獲取使用者身份
    在web頁面中應用安全標籤庫
    實現方法級安全
  8. 1:配置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>
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
    </context-param>
    <listener>
    <listener-class>
    org.springframework.web.context.ContextLoaderListener
    </listener-class>
    </listener>
    
     
  9. 2:Spring配置檔案中設定名稱空間
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beansxmlns="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.xsd">
    </beans:beans>
    
     
  10. 3:配置最基本的驗證與授權
    <http auto-config="true">
    <intercept-url pattern="/**" access="ROLE_USER" />
    </http>
    <authentication-manager>
    <authentication-provider>
    <user-service>
    <user name="tom" password="123" authorities="ROLE_USER, ROLE_A" />
    <user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" />
    </user-service>
    </authentication-provider>
    </authentication-manager>
    
     
  11. 4:通過資料庫驗證使用者身份
    <authentication-manager>
    <authentication-provider>
    <password-encoder hash=“md5”/>
    <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
    </authentication-manager>
    資料表結構見SS說明手冊附錄A
    
     
  12. 5:完善web頁面驗證規則
    <http auto-config="true">
    <intercept-url pattern="/js/**" filters="none"/>
    <intercept-url pattern="/css/**" filters="none"/>
    <intercept-url pattern="/images/**" filters="none"/>
    <intercept-url pattern="/a.jsp" access="ROLE_A" />
    <intercept-url pattern="/b.jsp" access="ROLE_B" />
    <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    </http>
    
     
  13. 6:自定義驗證配置
    <http auto-config="true">
    <!-- 指定登陸頁面、成功頁面、失敗頁面-->
    <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" />
    <!-- 嘗試訪問沒有許可權的頁面時跳轉的頁面 -->
    <access-denied-handler error-page="/accessDenied.jsp"/>
    <!-- 使用記住使用者名稱、密碼功能,指定資料來源和加密的key -->
    <remember-me data-source-ref="dataSource" />
    <!-- logout頁面,logout後清除session -->
    <logout invalidate-session="true" logout-success-url="/login.jsp" />
    <!-- session 失效後跳轉的頁面,最大登陸次數 -->
    <session-management invalid-session-url="/sessionTimeout.htm">
    <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" />
    </session-management>
    </http>
    可以使用SS自帶的登陸頁面作為login.jsp的模板
    
  14. 7:本地化訊息輸出
    拷貝本地化資原始檔後,在配置檔案中載入該檔案:
    <!-- 載入錯誤資訊資原始檔 -->
    <beans:bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basename" value="classpath:messages"/>
    </beans:bean>
    資原始檔在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目錄中
    
     
  15. 8:在web頁面中獲取使用者資訊
    方式一:Java程式碼
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    Collection<GrantedAuthority> col = auth.getAuthorities();
    方式二:標籤庫
    <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
    <sec:authentication property="name“/>
    <sec:authentication property="authorities“/>
    
     
  16. 9:在web頁面進行元素安全控制
    方式一
    <sec:authorizeifAnyGranted="ROLE_A">
    <a href="a.jsp">你可以訪問a.jsp</a>
    </sec:authorize>
    <sec:authorizeifNotGranted="ROLE_A">
    你不可以訪問a.jsp
    </sec:authorize>
    方式二
    <sec:authorizeurl="/a.jsp">
    <a href="a.jsp">你可以訪問a.jsp</a>
    </sec:authorize>
    
     
  17. 10:全域性方法安全控制
    <global-method-security pre-post-annotations="enabled">
    <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/>
    <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/>
    </global-method-security>
    此處使用了AspectJ中常用的切入點表示式(百度:AspectJ execution)
    
     
  18. 11:使用註解進行方法安全控制
    public class DemoService {
    @PreAuthorize("hasRole(&apos;ROLE_A&apos;)")
    public void methodA() {
    }
    @PreAuthorize("hasAnyRole(&apos;ROLE_A, ROLE_B&apos;)")
    public void methodB() {
    }
    }
    hasRole與hasAnyRole為SS通用內建表示式(google : spring security Common Built-In Expressions)
    
     
  19. 12:下一步做什麼???
    採用更安全的驗證方式
    採用安全的資料傳輸方式
    實現動態授權
    自定義驗證與授權部件
    實現資料級安全

相關文章