spring security基本知识(三) 过滤详细说明
在我们前面的文章Spring Security 初识(一)中,我们看到了一个最简单的
Spring Security 配置,会要求所有的请求都要经过认证.但是,这并不是我们想要的,我们通常想自定义应用的安全性.因为有些路径我们想要谁都可以访问.
Spring Security对此的实现也很简单.关键在于重载 WebSecurityConfigurerAdapter 的 configure() 方法.
我们使用最简单的基于内训的用户存储来演示Spring Security 的请求拦截,首先 就是 SecurotyConfigure 的实现.如下:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { //基于内存的用户存储
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("itguang").password("123456").roles("USER").and()
.withUser("admin").password("123456").roles("ADMIN");
} //请求拦截
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/shop/hello").authenticated()
.antMatchers(HttpMethod.POST,"/shop/order").authenticated()
.anyRequest().permitAll();
}
}
接下来再看看我们的实现: 我们只是配置了 “/shop/hello” 和 “/shop/order” 这两个路径必须进过认证,并且 “/shop/order” 必须是 post 请求的方式.对于其他的请求,
我们都是 .anyRequest().permitAll() ;都放行。
另外:antMatchers()方法所使用的路径可能会包括Ant风格的通配符,而regexMatchers()方法则能够接受正则表达式来定义请求路径。
除了路径选择,我们还通过authenticated()和permitAll()来定义该如何保护路径。authenticated()要求在执行该请求时,
必须已经登录了应用。如果用户没有认证的话,Spring Security的Filter将会捕获该请求,并将用户重定向到应用的登录页面。
同时,permitAll()方法允许请求没有任何的安全限制。
除了authenticated()方法和permitAll()方法外,还有一些其他方法用来定义该如何保护请求.
- access(String) 如果给定的SpEL表达式计算结果为true,就允许访问
- anonymous() 允许匿名用户访问
- authenticated() 允许认证的用户进行访问
- denyAll() 无条件拒绝所有访问
- fullyAuthenticated() 如果用户是完整认证的话(不是通过Remember-me功能认证的),就允许访问
- hasAuthority(String) 如果用户具备给定权限的话就允许访问
- hasAnyAuthority(String…)如果用户具备给定权限中的某一个的话,就允许访问
- hasRole(String) 如果用户具备给定角色(用户组)的话,就允许访问/
- hasAnyRole(String…) 如果用户具有给定角色(用户组)中的一个的话,允许访问.
- hasIpAddress(String 如果请求来自给定ip地址的话,就允许访问.
- not() 对其他访问结果求反.
- permitAll() 无条件允许访问
- rememberMe() 如果用户是通过Remember-me功能认证的,就允许访问
通过上面的方法,我们可以修改 configure 方法,要求用户不仅需要认证,还需要具备相应的权限
/**
* 请求拦截
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/hello").hasAnyAuthority("ROLE_DELETE")
.antMatchers(HttpMethod.POST,"/order").hasAnyAuthority("ROLE_UPDATE")
.anyRequest().permitAll();
}
作为代替方案,我们还可以使用 hasRole() ,它会自动使用 “ROLE_” 前缀.
/**
* 请求拦截
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/hello").hasRole("DELETE")
.antMatchers(HttpMethod.POST,"/order").hasRole("UPDATE")
.anyRequest().permitAll();
}
注意:这些规则会按照给定的顺序发挥作用。所以,很重要的一点就是将最为具体的请求路径放在前面,
而最不具体的路径(如anyRequest())放在最后面。如果不这样做的话,那不具体的路径配置将会覆盖掉更为具体的路径配置。
使用Spring表达式进行安全保护
上面的方法中,我们看到一个 access() 方法,此方法可以接收一个Spel表达式让我们对请求进行拦截.
如下就是使用SpEL表达式来声明具有“HELLO”角色才能访问“/shop/hello”URL:
- antMatchers("/shop/hello").access("hasRole('HELLO')");
这个对“/shop/hello”的安全限制与开始时的效果是等价的,只不过这里使用了SpEL来描述安全规则。
如果当前用户被授予了给定角色的话,那hasRole()表达式的计算结果就为true。
下面列出了Spring Security 支持的所有SPEL表达式:
- authentication 用户的认证对象
- denyAll 结果始终为false
- hasAnyRole(list of roles) 如果用户被授予了列表中任意的指定角色,结果为true
- hasRole(role) 如果用户被授予了指定的角色,结果为true
- hasIpAddress(IPAddress) 如果请求来自指定IP的话,结果为true
- isAnonymous() 如果当前用户为匿名用户,结果为true
- isAuthenticated() 如果当前用户进行了认证的话,结果为true
- isFullyAuthenticated() 如果当前用户进行了完整认证的话(不是通过Remember-me功能进行的认证),结果为true
- isRememberMe() 如果当前用户是通过Remember-me自动认证的,结果为true
- permitAll() 结果始终为true
- principal() 用户的principal对象
spring security基本知识(三) 过滤详细说明的更多相关文章
- spring security基本知识(一)
spring security基本知识(一) Spring Security是为基于Spring的应用程序提供声明式安全保护的安全 性框架.Spring Security提供了完整的安全性解决方案,它 ...
- Re:从零开始的Spring Security Oauth2(三)
上一篇文章中我们介绍了获取token的流程,这一篇重点分析一下,携带token访问受限资源时,内部的工作流程. @EnableResourceServer与@EnableAuthorizationSe ...
- Spring Security认证配置(三)
学习本章之前,可以先了解下上篇Spring Security认证配置(二) 本篇想要达到这样几个目的: 1.登录成功处理 2.登录失败处理 3.调用方自定义登录后处理类型 具体配置代码如下: spri ...
- spring security基本知识(二) 自定义认证
配置自定义的用户存储 我们在 SecurityConfig 的配置类中 重写了 configure(AuthenticationManagerBuilder auth) 方法,我们可以通过 Authe ...
- spring security基本知识(四) WebSecurity
1.创建一个Filter 现在web.xml文档中声明一个filter class="org".springframework.web.filter.DelegatingFil ...
- spring security 登出操作 详细说明
1.前言 这里专门 做 spring security 登出操作 的 详细记录 2.操作 (1)目录结构 (2)在security 拦截规则配置文件添加退出登录支持 源码 package com.e ...
- spring security的原理及教程
spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...
- 【Spring】12、Spring Security 四种使用方式
spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...
- Spring Security 源码解析(一)
上篇 Spring Security基本配置已讲述了Spring Security最简单的配置,本篇将开始分析其基本原理 在上篇中可以看到,在访问 http://localhost:18081/use ...
随机推荐
- Python 字符串与列表去重
最近面试中出现频率比较高的字符串和列表的去重pstr = 'abcadcf'# 字符串去重# 1.使用集合 --没有保持原来的顺序 print(set(pstr)) # 2.使用字典 -- 没有保持原 ...
- maven的配置及使用
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Apache官网下载maven 解压缩,配置环境变量: path路径:E:\apache-ma ...
- 旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)
题目地址 : 旋转数组. 网上好多不是根本就是错的,就是空间复杂度不是真正为1 下面总结一下 方法1 普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验) ··· publ ...
- IDEA集成Tomcat启动控制台乱码
解决方法: 在下图位置加上: -Dfile.encoding=UTF-8 然后安装下图设置: 如果上述方法重启tomcat还是乱码,那么: 进入idea的安装目录, 进入bin目录下.找到idea.e ...
- FreeBSD上安装Cassandra 3.10
哈哈,你居然点进来了,来吧,一起吐槽FreeBSD啊,装了一上午Cassandra 3.10都没有装成功, 终于,鄙人一条 shutdown -p now 结束了FreeBSD,默默打开了CentOS ...
- Java中class的声明
在Java中下面Class的声明哪些是错误的?(A,B,C) A:public abstract final class Test { abstract void method();} B:pub ...
- JS获取select被选中的option的值
一:JavaScript原生的方法 1:拿到select对象: var myselect=document.getElementById(“test”); 2:拿到选中项的索引:var index=m ...
- 中国MOOC_面向对象程序设计——Java语言_第1周 类与对象_1分数
第1周编程题 查看帮助 返回 我们在题目说明中给出了一部分代码,你需要在这部分代码的基础上,按照题目说明编写代码,然后将两部分代码一起提交. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨 ...
- TensorFlow2.0矩阵与向量的加减乘
1.矩阵加法使用 a = np.random.random((3,3))b = np.random.randint(0,9,(3,3)) ad = tf.add(a,b) 2.矩阵乘法注意 # ten ...
- Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'p.knowlege_part_id' in 'field list'
MyBatis中,出现Unknown column的提示是mapper.xml中的数据库字段写错了. 错误示例: XxMapper.xml中 <sql id="KnowlegeSect ...