Spring安全表达式简介
最后修改:2020年8月19日
1.介绍
在本教程中,我们将重点关注Spring安全表达式,当然还会介绍使用这些表达式的实际示例。
在研究更复杂的实现(如ACL)之前,扎实地掌握安全表达式是很重要的——因为如果使用正确,它们可以非常灵活和强大。
本文是对的扩展春天安全表达式 - Hasrole示例.
2.Maven的依赖关系
为了使用Spring Security,您需要在您的下面包含以下部分pom.xml文件:
<依赖关系> <依赖项> org.springframework.security groupID> Spring-Security-Web ArtifactId> 5.2.3.release version> 依赖项> 依赖项>
可以找到最新版本这里.
快速注释 - 这个依赖性只涵盖了弹簧安全;别忘了添加spr核和spring上下文一个完整的web应用程序。
3.配置
首先,让我们看看Java配置。
我们会延长WebSeecurityConfigurerAdapter-这样我们就可以选择钩入基类提供的任何扩展点:
@configuration @enableautoconfiguration @enablewebsecurity @enableglobalmethodsecurity(prepostenabled = true)public类securityjavaconfig扩展WebSecurityConfigurerAdapter {...}
当然,我们也可以做一个XML配置:
<?xml version = " 1.0 " encoding = " utf - 8 " ?> < bean: bean…>
4.网络安全的表情
现在,让我们开始看看安全性表达式:
- 哈罗尔,hasAnyRole
- 哈萨茨奉献,哈顿义务
- Pilitall.,德尼亚尔
- 是的,Isrememberme.,isAuthenticated,完美的authenticated
- 主要的,验证
- hasPermission
现在让我们详细地回顾一下。
4.1.Hasrole,Hasanyrole.
这些表达式负责定义对应用程序中特定url或方法的访问控制或授权。
让我们看一个例子:
@override保护的void配置(最终Httpsecurity HTTP)抛出异常{......AntMatchers(“/ auth / admin / *”)。hasrole(“admin”).antmatchers(“/ auth / *”)。Hasanylole(“admin“,”用户“)......}
在此示例中,我们指定对从中开始的所有链接的访问/ auth /仅限于使用角色登录的用户用户或角色管理。而且,访问开始的链接/认证/管理/我们需要管理在系统中的作用。
通过编写,可以在XML文件中实现相同的配置:
<拦截url模式="/auth/admin/*" access="hasRole(' admin ') "/> <拦截url模式="/auth/*" access="hasAnyRole('ADMIN','USER')"/ > < / http >
4.2.哈萨茨奉献,哈萨诸塞
春天的角色和权威是相似的。
主要的区别是,角色有特殊的语义——从Spring Security 4开始,具备ROLE_'前缀由任何与角色相关的方法自动添加(如果它还没有在那里)。
所以Hasauthority('角色_admin')类似于Hasrole('admin')因为'具备ROLE_'前缀会自动添加。
但使用权威的好处是我们不用金宝搏官网188be具备ROLE_完全前缀。
这是一个快速举例,我们正在定义具有特定权限的用户:
@Override受保护的void配置(AuthenticationManagerBuilder Auth)抛出异常{auth.inmemoryauthentication().withuser(“user1”)。密码(encoder()。编码(“User1pass”))。授权(“用户”).AND()。用人(“admin”)。密码(encoder()。编码(“adminpast”)).Authorities(“admin”);}
当然,我们可以使用这些权威的表达方式:
@Override protected void configure(final HttpSecurity http) throws Exception {... .antMatchers("/auth/admin/*"). hasauthority (" admin "). antMatchers("/auth/*")。hasAnyAuthority(“管理”、“用户”)…}
我们可以看到 - 我们根本没有提到角色。另外,开始春天5,我们需要一个PasswordEncoder豆角,扁豆:
@Bean public passwordencoder passwordencoder(){return new bcryptpasswordencoder();}
最后 - 我们也可以使用XML配置实现相同的功能:
和:
http>
4.3.permitAll, denyAll
这两个注释也非常简单。我们可以允许访问我们服务中的某些URL,也可以拒绝访问。
让我们来看一个例子:
….antMatchers(“/ *”).permitAll()……
通过这个配置,我们将授权所有用户(匿名用户和登录用户)访问以' /'开头的页面(例如,我们的主页)。
我们还可以拒绝访问整个URL空间:
….antMatchers(“/ *”).denyAll()……
同样的配置也可以用XML配置来完成:
<拦截url访问="permitAll"模式="/*" /> <拦截-url访问="denyAll"模式="/*" />
4.4。是匿名的,是记住我的,是认证的,是完全认证的
在本小节中,我们专注于与用户登录状态相关的表达式。让我们从未登录我们页面的用户开始。通过在Java Config中指定以下内容,我们启用所有未经授权的用户访问我们的主页页面:
...... .antmatchers(“/ *”)。匿名()...
在XML配置中也是如此:
http>
如果我们想确保网站的安全,每个人都会被要求登录,我们需要使用isauthenticated()方法:
….antMatchers(“/ *”).authenticated()……
或XML版本:
<拦截url模式="/*"访问="isAuthenticated()" / > < / http >
此外,我们还有两个额外的表达式,Isrememberme()和areulyauthenticated().通过使用Cookie,Spring允许记住我的功能,因此无需每次登录系统。你可以阅读更多关于金宝搏官网188be记得我这里.
为了给只通过remember me函数登录的用户访问权限,我们可以这样使用:
….antMatchers(“/ *”).rememberMe()……
或XML版本:
http>
最后,即使已登录用户已登录,我们的某些部分也需要用户进行身份验证。例如,用户想要更改设置或付款信息;当然,在系统的更敏感区域中询问手动身份验证是良好的做法。
为了做到这一点,我们可以指定areulyauthenticated(),回归真的如果用户不是匿名用户或勿忘我用户:
...... .AntMatchers(“/ *”)。全文化()...
或XML版本:
<拦截url模式="*"访问="isFullyAuthenticated()" / > < / http >
4.5.本金,身份验证
这些表达式允许访问主要的代表当前授权(或匿名)用户和当前的对象验证对象来自SecurityContext.,分别。
例如,我们可以使用主要的加载用户的电子邮件、头像或登录用户可以访问的任何其他数据。
和验证提供有关完整信息的信息金宝搏官网188be验证对象,以及其授予的当局。
两者都在以下文章中进一步详细描述:在Spring Security中检索用户信息.
4.6.hasPermission蜜蜂
这个表达是记录并打算在表达式系统和Spring Security的ACL系统之间架起桥梁,允许我们基于抽象权限指定单个域对象上的授权约束。
让我们来看看一个例子。我们有一个允许合作写作文章的服务,其中包含主要编辑器,决定其他作者提出的文章应该发布。
为了允许使用此类服务,我们可以使用访问控制方法创建以下方法:
@PreAuthorize("hasPermission(#articleId, 'isEditor')") public void acceparticle (Article){…}
只有授权用户可以调用此方法,并且用户也需要具有权限ISEDITOR.在服务中。
我们还需要记住显式地配置aPermissionEvaluator在我们的应用程序上下文中:
<表达式 - 处理程序REF =“expressionHandler”/> global-method-security> bean>
在哪里customInterfaceImplementation将是实现的课程PermissionEvaluator。
当然,我们也可以用Java配置执行此操作:
@Override受保护的方法安全表达句子indateShignher(){defaultmethodsecurityExpressionHander expressionHandl = new defaultmethodsecurityExpressionHandlandler();expressionHandler.setPermissionEvaluator(新的CustomInterfaceImplementation());返回ExpressionHandler;}
结论
本教程是春季安全表达式的全面介绍和指南。
这里讨论的所有示例都可用在GitHub项目上.