zoukankan      html  css  js  c++  java
  • 浅谈spring security 403机制

    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/
  • 相关阅读:
    GC选择之CMS 并发标记清除
    JVM内存概览与GC初步
    Shell 判断语句
    SUID SGID
    maven package
    ACL权限控制列表
    账户与密码管理
    Ubuntu与Centos在登陆安全方面的比较
    【PL/SQL Developer】动态执行表不可访问,本会话的自动统计被禁止
    【Centos7】Delete virtual bridge
  • 原文地址:https://www.cnblogs.com/wewill/p/5588734.html
Copyright © 2011-2022 走看看