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";
@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/
分享到:
相关推荐
SpringSecurity入门到进阶到高级,是我们老师给我们讲课用的,我们都照着配就没有问题,可以跑通,
Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf
首先,SSM环境中我们通过xml配置的方式,从源码渗入开始,完成Spring Security基本的“认证”和“授权”功能讲解,其中还会融合“记住我”,CSRF拦截等技术。 然后,我们会在SpringBoot环境中,继续展开Spring ...
Spring Security 演讲PPT(演讲嘉宾:张明星) WebSphere技术专家沙龙在广州圆满举办,WSC超级版主Fastzch(张明星)担任本次沙龙的演讲嘉宾,他给广州的WebSphere技术专家带来了以“Spring Security ”为主题的...
开发文档
Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf
spring security spring security 中文文档
如果上面的验证机制不符合你的需求,Spring Security 是一个开放的平台,要实现你 自己的验证机制检查。 为了阅读方便,自己导出的文档,格式为HTML,文件也相对较小。 文档原地址:...
Spring Security in Action
springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以...
SpringSecurity框架的权限认证流程原理,请求到来时SpringSecurity如果调用层层过滤器来完成认证;
Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
spring security2.5 jar 和spring security2.5 整合必须的jar包
1.本项目为SpringCloud Gateway的微服务框架,整合了SpringSecurity,微服务间使用Redis来获取登陆的用户信息。 2.由于Gat
三更springsecurity学习笔记
该资源是基本Spring Security实战七篇文档中组织的源码,详情如下: ssecurity项目是Spring Security实战(一和二)的源码; ssecurity-db项目是Spring Security实战(三)的源码; ssceurity-page项目是Spring ...
SpringSecurity学习总结源代码
Spring Security。 官网 Spring Security API(Spring Security 开发文档).CHM
spring security3 中文版本