spring security 用户授权/访问控制

本文深入探讨了Spring Security的授权机制,包括基于URL的访问控制、基于权限、角色以及表达式的授权。讲解了如何通过antMatchers、regexMatchers、mvcMatchers等进行URL匹配,并使用hasRole、hasAuthority等进行权限判断。此外,还介绍了方法授权中的JSR-250注解、@Secured注解和表达式注解的使用,以及如何自定义403错误处理。内容详实,适合Spring Security的学习者参考。

目录

1、web 授权

(1)访问控制的url匹配

(2)基于权限的访问控制

(3)基于角色的访问控制

(3)基于表达式的访问控制

2、方法授权

(1)JSR-250注解

(2)@Secured注解

(3)支持表达式的注解


授权的方式包括 web 授权和方法授权,web授权是通过 url 拦截进行授权,方法授权是通过方法拦截进行授权。他们都会调用 accessDecisionManager 进行授权决策,若为web授权则拦截器为FilterSecurityInterceptor;若为方法授权则拦截器为MethodSecurityInterceptor。如果同时通过web 授权和方法授权则先执行web授权,再执行方法授权,最后决策通过,则允许访问资源,否则将禁止访问。

1、web 授权

Spring Security 可以通过 http.authorizeRequests() 对web请求进行授权保护 ,Spring Security使用标准Filter建立了对web请求的拦截,最终实现对资源的授权访问。

protected void configure(HttpSecurity http) throws Exception {
        http.formLogin();//表单提交

        // 授权 -> 认证拦截
        http.authorizeRequests()
                .antMatchers(
                        "/login.html",
                        "/error.html",
                        "/main.html",
                        "/admin/**")
                .permitAll() // 不需要认证
                .anyRequest() // 所有请求都必须认证
                .authenticated();

        http.csrf().disable(); //关闭csrf防护
    }

(1)访问控制的url匹配

在配置类中http.authorizeRequests() 主要是对url进行控制。配置顺序会影响之后授权的效果,越是具体的应该放在前面,越是笼统的应该放到后面。

anyRequest(),表示匹配所有的请求。一般情况下此方法都会使用,设置全部内容都需要进行认证,会放在最后。

http.authorizeRequests()
                .anyRequest() // 所有请求都必须认证
                .authenticated();

antMatchers() ,方法定义如下:

    public C antMatchers(String... antPatterns) {
		return chainRequestMatchers(RequestMatchers.antMatchers(antPatterns));
	}

参数是不定项参数,每个参数是一个 ant 表达式,用于匹配 URL规则。ANT通配符有三种:

通配符 说明
? 匹配任何单字符
* 匹配0或者任意数量的字符
** 匹配0或者更多的目录

在实际项目中经常需要放行所有静态资源:

// 放行js和css 目录下所有的文件 
.antMatchers("/js/**","/css/**").permitAll() 
// 只要是.js 文件都放行 
.antMatchers("/**/*.js").permitAll()

regexMatchers(),使用正则表达式进行匹配。

//所有以.js 结尾的文件都被放行 
.regexMatchers( ".+[.]js").permitAll()

无论是 antMatchers() 还是 regexMatchers() 都具有两个参数的方法,其中第一个参数都是HttpMethod ,表示请求方式,当设置了 HttpMethod 后表示只有设定的特定的请求方式才执行对应的权限设置。

.antMatchers(HttpMethod.POST,"/admin/demo").permitAll() 
.regexMatchers(HttpMethod.GET,".+[.]jpg").permitAll()

mvcMatchers(),适用于配置了 servletPath 的情况。 servletPath 就是所有的 URL 的统一前缀。在 SpringBoot 整合SpringMVC 的项目中可以在application.properties 中添加下面内容设置ServletPath。

spring.mvc.servlet.path=/web

在 Spring Security 的配置类中配置 .servletPath() 是 mvcMatchers()返回值特有的方法,antMatchers()和 regexMatchers() 没有这个方法。在 servletPath() 中配置了 servletPath 后,mvcMatchers()直接写 SpringMVC 中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值