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/