浅谈spring security 403机制
来源:互联网 发布:网络虚假新闻案例2016 编辑:程序博客网 时间:2024/04/30 06:06
403就是access denied ,就是请求拒绝,因为权限不足
三种权限级别
一、无权限访问
<security:http security="none" pattern="/index.jsp" />
这种即是不需要登录,也可以访问的,但是不会传csrf_key
二、匿名访问
<security:http>
<security:intercept-url pattern="/index.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
</security:http>
这种也是不需要登录就访问的,但是会传csrf_key
三、有权限访问
<security:http>
<security:intercept-url pattern="/index.jsp" access="xxxxx"/>
</security:http>
这种就需要用户登录了,而且需要相应的权限才能访问,不然就报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";@Overridepublic 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/
- 浅谈spring security 403机制
- (原创)Spring security用户验证机制浅谈.
- Spring security用户验证机制浅谈.
- Spring security用户验证机制浅谈.
- Spring security用户验证机制浅谈.
- Spring Security安全机制
- spring-security中的csrf防御机制
- HTTP安全验证机制和Spring Security
- spring-security中的csrf防御机制
- spring-security中的csrf防御机制
- 通过实例浅谈Spring运作机制
- 通过实例浅谈Spring运作机制
- 通过实例浅谈Spring运作机制
- 通过实例浅谈Spring运作机制
- 如何自定义事件(Spring事件机制浅谈)
- spring security的csrf防御机制在ajax中的应用
- spring security +spring boot 自定义 403 页面
- Spring Security
- 阿里云云服务器Linux系统FTP服务器搭建设置教程
- iOS使用自定义字体
- Android 蓝牙开发(一)蓝牙通信
- 可能会用到的网站
- 数据结构基础知识(三)
- 浅谈spring security 403机制
- UNDERSTANDING ANDROID GRAPHICS INTERNALS – GRAPHICS BASICS (I)
- C++ 实现把非静态成员函数作为回调函数(非static)(转 待研究)
- 什么是电脑驱动?
- 使用Timer实现双击退出应用
- UNDERSTANDING ANDROID GRAPHICS INTERNALS – GRAPHICS BASICS(II)
- 【kaldi】Kaldi tutorial翻译之Prerequisites(前提条件)-kaldi学习前必备梳理
- 我与MVVM的恩怨情仇
- Fragment中mAdded和mDetached标志位