关闭

浅谈spring security 403机制

3214人阅读 评论(0) 收藏 举报
分类:

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/
0
0
查看评论

Spring Boot与Spring Security整合后post数据不了,403拒绝访问

最近在学习Spring security与spring boot的整合,刚开始学习了登录和注销,想自己拓展一下,post一些数据,完成数据库的操作。开始长达一天的查找资料解决问题中!!! 首先:403错误,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的...
  • sinat_28454173
  • sinat_28454173
  • 2016-08-19 15:02
  • 6044

Spring Security教程之自定义Spring Security默认的403页面

在最新的Spring Security教程-Spring Security实现访问控制教程中,如果没有授权的用户访问加密的页面,默认的403页面就会展示 在本次教程中,我们教你两种自定义Spring Security 默认的403页面的方法 1.使用access-denied-h...
  • youqishini
  • youqishini
  • 2014-01-23 23:52
  • 2901

Spring RESTApi, Spring Security 自定义403返回信息

在普通的Java web 项目中,如果使用了spring security 的话,直接在application配置文件中,指定一个403error-page。 如果项目只提供restapi,也就不存在error-page这个概念甚至page这个说法了。如果请求一个没有权限的资源时,会返回一个默认的...
  • jiangshanwe
  • jiangshanwe
  • 2017-06-14 15:18
  • 650

spring security +spring boot 自定义 403 页面

spring security +spring boot 自定义 403 页面 用的spring security  做的权限控制, 当  访问没有权限, 跳转 会跳到默认403 页面。不符合当前项目需求。 一下是解决方式: package com....
  • weixin_36667844
  • weixin_36667844
  • 2017-03-09 10:10
  • 1398

解决:spring security 登录页停留时间过长 跳转至 403页面

前言:最近的项目中用到了spring security组件,说句显low的话:我刚开始都不知道用了security好不勒,提了bug,在改的过程中,遇到了一些问题,找同事交流,才知道是用的security组件。  这个bug,真的是一波三折:复现它就是个问题,然后我又把403改成了404,...
  • u013034889
  • u013034889
  • 2017-12-01 23:23
  • 384

spring boot+spring security

pom.xml<!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s...
  • fangwenzheng88
  • fangwenzheng88
  • 2017-12-27 17:50
  • 68

Spring Security 初识(三)--配置自定义的用户存储

Spring Security 初识(三)–配置自定义的用户存储假设我们需要认证的用户存储在非关系型数据库中,如Mongo或 Neo4j,在这种情况下,我们需要提供一个自定义的 UserDetailsService接口实现。上节我们讲到Spring Security 初识(二),我们在 Secu...
  • itguangit
  • itguangit
  • 2017-12-29 10:31
  • 101

Spring MVC Post请求返回403错误,Get请求却正常?

困惑:很奇怪,明明在方法上面配置了RequestMethod.POST,POST表单提交却返回403状态码,可是使用GET方式却没问题啊!!!@RequestMapping(value="***", method = { RequestMethod.POST }) public ...
  • t894690230
  • t894690230
  • 2016-09-01 22:47
  • 9171

关于Spring Boot下Spring Security权限访问设置@PreAuthorize("hasRole('ROLE_ADMIN')")没有用

承接上篇:Spring Security整合后post数据不了,403拒绝访问 前几天想要限制不同角色的访问权限,于是就直接使用:@PreAuthorize("hasRole('ROLE_ADMIN')")注解来标注一个实现类的方法上,但是其他权限依然可以访问 ...
  • sinat_28454173
  • sinat_28454173
  • 2016-08-25 11:19
  • 9203

springboot ajax 提交403错误

由于开启了csrf 我用ajax post上传图片出现了403错误 $('#input-app-icon').change(function () { var formdata = new FormData(); var v_this = $(this); ...
  • u011164906
  • u011164906
  • 2017-08-31 17:45
  • 584
    个人资料
    • 访问:47758次
    • 积分:1132
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:2篇
    • 译文:0篇
    • 评论:2条
    友情链接
    文章分类
    最新评论