安全顶部

我刚宣布了新的学习春天安全课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程

1.介绍

在本教程中,我们将重点关注Spring安全表达式,当然还会介绍使用这些表达式的实际示例。

在研究更复杂的实现(如ACL)之前,扎实地掌握安全表达式是很重要的——因为如果使用正确,它们可以非常灵活和强大。

本文是对的扩展春天安全表达式 - Hasrole示例

2.Maven的依赖关系

为了使用Spring Security,您需要在您的下面包含以下部分pom.xml文件:

<依赖关系> <依赖项>  org.springframework.security   Spring-Security-Web   5.2.3.release   

可以找到最新版本这里

快速注释 - 这个依赖性只涵盖了弹簧安全;别忘了添加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配置实现相同的功能:

        

和:

   

4.3.permitAll, denyAll

这两个注释也非常简单。我们可以允许访问我们服务中的某些URL,也可以拒绝访问。

让我们来看一个例子:

….antMatchers(“/ *”).permitAll()……

通过这个配置,我们将授权所有用户(匿名用户和登录用户)访问以' /'开头的页面(例如,我们的主页)。

我们还可以拒绝访问整个URL空间:

….antMatchers(“/ *”).denyAll()……

同样的配置也可以用XML配置来完成:

 <拦截url访问="permitAll"模式="/*" />  <拦截-url访问="denyAll"模式="/*" />  

4.4。是匿名的,是记住我的,是认证的,是完全认证的

在本小节中,我们专注于与用户登录状态相关的表达式。让我们从未登录我们页面的用户开始。通过在Java Config中指定以下内容,我们启用所有未经授权的用户访问我们的主页页面:

...... .antmatchers(“/ *”)。匿名()...

在XML配置中也是如此:

  

如果我们想确保网站的安全,每个人都会被要求登录,我们需要使用isauthenticated()方法:

….antMatchers(“/ *”).authenticated()……

或XML版本:

 <拦截url模式="/*"访问="isAuthenticated()" / > < / http >

此外,我们还有两个额外的表达式,Isrememberme()areulyauthenticated().通过使用Cookie,Spring允许记住我的功能,因此无需每次登录系统。你可以阅读更多关于金宝搏官网188be记得我这里

为了给只通过remember me函数登录的用户访问权限,我们可以这样使用:

….antMatchers(“/ *”).rememberMe()……

或XML版本:

  

最后,即使已登录用户已登录,我们的某些部分也需要用户进行身份验证。例如,用户想要更改设置或付款信息;当然,在系统的更敏感区域中询问手动身份验证是良好的做法。

为了做到这一点,我们可以指定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”/>    

在哪里customInterfaceImplementation将是实现的课程PermissionEvaluator。

当然,我们也可以用Java配置执行此操作:

@Override受保护的方法安全表达句子indateShignher(){defaultmethodsecurityExpressionHander expressionHandl = new defaultmethodsecurityExpressionHandlandler();expressionHandler.setPermissionEvaluator(新的CustomInterfaceImplementation());返回ExpressionHandler;}

结论

本教程是春季安全表达式的全面介绍和指南。

这里讨论的所有示例都可用在GitHub项目上

安全底

我刚宣布了新的学习春天安全课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程
评论在本文上关闭!