淺談spring security 403機制

403就是access denied ,就是請求拒絕,由於權限不足html

三種權限級別

1、無權限訪問

<security:http security="none" pattern="/index.jsp"   />java

這種便是不須要登陸,也能夠訪問的,可是不會傳csrf_keyspring

2、匿名訪問

<security:http>jsp

<security:intercept-url pattern="/index.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>ide

</security:http>url

這種也是不須要登陸就訪問的,可是會傳csrf_keyspa

3、有權限訪問

<security:http>csrf

<security:intercept-url pattern="/index.jsp" access="xxxxx"/>xml

</security:http>htm

這種就須要用戶登陸了,並且須要相應的權限才能訪問,否則就報403(access denied)

沒有跳轉403?

今天遇到了一個詭異的問題

admin.jsp設置爲access="USER",須要用戶登陸了,並且須要有USER權限才能訪問

然而我沒登錄的時候,去訪問admin.jsp,結果沒有跳到403頁面,跳到了login.jsp

在我預想的是,跳到403

緣由

當用戶已經登陸了,可是權限不足,纔會跳轉到403

當用戶沒有登陸的時候,訪問有權限的頁面,只會跳轉到登錄頁面

機制

spring security處理請求的時候,先會檢測用戶是否登陸,也就是檢測是否有authentication(身份)

此時,若是用戶沒有登陸,並且請求是須要登陸的action,spring security會跳轉到登錄頁面,就算這個頁面須要權限訪問,也不會出現403。

登陸的時候,會在SecurityContextHolder裏面放一個記錄用戶信息(用戶名、權限)的principal,須要驗證用戶權限的時候,就會從SecurityContextHolder取出principal來驗證權限。

若是用戶已經登陸了(有了authentication),若是用戶的權限不足,就會報403 這個時候security:access-denied-handler纔會生效

自定義403

想要自定義403,須要在spring-security.xml裏面設置security:access-denied-handler

有兩種方式:

指定AccessDeniedHandler

自定義一個403處理機制,須要實現AccessDeniedHandler接口,實現裏面的handle方法

當權限不足的時候,spring security會調用handle方法

能夠在handle方法裏面重定向或者轉發請求

代碼demo

public class AccessDeniedServletHandler implements AccessDeniedHandler {

	private static final String DEF_ERROR_PAGE_PATH="action/deniedServlet_denied";
	
	@Override
	public void handle(HttpServletRequest request, HttpServletResponse response,
			AccessDeniedException accessDeniedException) throws IOException, ServletException {
		response.sendRedirect(DEF_ERROR_PAGE_PATH);
	}

}

在spring-security.xml配置

<security:access-denied-handler ref="accessDeniedServletHandler" />

<bean id="accessDeniedServletHandler" class="com.xxx.servlet.AccessDeniedServletHandler" scope="singleton"></bean>

指定error-page

這種方式,其實是轉發請求,作不到重定向

在spring-security.xml配置

<security:access-denied-handler error-page="403.html" />

整合Struts的問題

情景

前提:自定義的403頁面的URL,是經過struts的action訪問的

當權限不足的時候,將請求轉發到自定義的403頁面時,會出現404( not found)

可是直接訪問403頁面的時候,又是正常的

緣由

因此推測

spring security 的DefaultSecurityFilterChain在strust的filter以後

因此struts捕獲不到請求的403頁面,可是請求方式又是action,因此就找不到頁面了

結論

因此這樣子的話,一切spring security 處理完成後自定義跳轉,都是在strust的filter以後的

像登陸成功的authentication-success-handler-ref,退出的success-handler-ref以及access denied的security:access-denied-handler

因此訪問action的當心的,要用重定向的方式



查看原文:http://139.129.55.235/2016/06/01/%e6%b5%85%e8%b0%88spring-security-403%e6%9c%ba%e5%88%b6/
相關文章
相關標籤/搜索