Spring Security 控制授权的方法

 更新时间:2018年02月26日 13:50:41   作者:盲枸  
本篇文章主要介绍了Spring Security 控制授权的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了Spring Security 控制授权的方法,分享给大家,具体如下:

使用授权方法进行授权配置

每一个 Spring Security 控制授权表达式(以下简称为表达式)实际上都在在 API 中对应一个授权方法,该方法是请求的 URL 权限配置时的处理方法。例如:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http.authorizeRequests()
    .antMatchers(HttpMethod.DELETE, "/user/*").hasRole("ADMIN")
    .antMatchers("/index").permitAll()
    .antMatchers("/pay").hasAnyRole("WE_CHAT_PAY", "ALI_PAY")
    .antMatchers("/debug").hasIpAddress("192.168.1.0/24");
}

使用授权表达式给多权限要求的请求授权

那么,何时需要用到表达式进行授权处理呢?一个安全应用的权限要求往往是复杂多样的,比如,项目的调试请求希望访问者既要拥有管理员权限又必须是通过公司内部局域网内部访问。而这样的需求下,仅仅通过Security API 提供的方法是无法满足的,因为这些授权方法是无法连续调用的。

此时就可以使用授权表达式解决:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http.authorizeRequests()
    .antMatchers("/debug")
      .access("hasRole('ADMIN') and hasIpAddress('192.168.1.0/24')");
}

授权表达式举例说明

表达式 说明
permitAll 永远返回 true
denyAll 永远返回 false
anonyous 当前用户若是匿名用户返回 true
rememberMe 当前用户若是 rememberMe 用户返回 true
authenticated 当前用户若不是匿名(已认证)用户返回 true
fullAuthenticated 当前用户若既不是匿名用户又不是 rememberMe 用户时返回 true
hasRole(role) 当前用户权限集合中若拥有指定的 role 角色权限(匹配时会在你所指定的权限前加'ROLE_',即判断是否有“ROLE_role”权限)时返回 true
hasAnyRole(role1, role2, ...) 当前用户权限集合中若拥有任意一个角色权限时返回 true
hasAuthority(authority) 当前用户权限集合中若具有 authority 权限(匹配是否有“authority”权限)时返回 true
hasAnyAuthority(authority) 当前用户权限集合中若拥有任意一个权限时返回 true
hasIpAddress("192.168.1.0/24") 发送请求的IP匹配时fanhui true

基于角色的访问控制 RBAC(Role-Based Access Control)

或许你会认为上述方式已能满足绝大多数应用安全授权管理。但事实上的企业级应用的授权往往是基于数据库数据动态变化的,若是使用上述方式进行字符串拼接,不仅对于开发者极不友好(每一次人人员变动都意味着需要改代码,显然不合理),而且应用的性能也会随之降低。那么,如何解决呢?

数据模型

通用的 RBAC 数据模型, 一般需要五张表(三张实体表,两张关系表)。三张实体表包括用户表、角色表、资源表。两张关系表包括。其之间关系如下图:

RBAC数据模型

用户表

任何一个用户都必须要有用户表,当公司发生人员变动时,由业务人员(如人力资源)对该数据表进行增删记录。

角色表

公司有哪些身份的人,例如总裁、副总裁、部门经理等,有业务人员根据公司的具体情况对该表数据进行操作。

资源表

存储需要进行权限控制的资源,由于我们进行控制授权时实际上是基于 URL 的,但业务人员非按 URL 组织数据条目,而是以视图界面的形式进行曹操作。所以在这张表中存储的是呈现给业务人员的菜单、按钮及其所进行权限控制的 URL 。

用户—角色关系表

用户表与角色表(用户 id 与角色id )之间是一个多对多的关系。一个用户可以是多个角色(一个用户既可以是部门经理又可以是某个管理员),而一个角色往往对应多个用户。

角色—资源关系表

角色表与资源表()也是一个多对多的关系。一种角色可以访问多个资源(按钮或菜单等),一个资源也可以被多个角色访问。

spring security 还支持自定义表达式来完成这项工作,就像这样

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决Java编译时错误:A JNI error has occurred,please check your installation and try again

    解决Java编译时错误:A JNI error has occurred,ple

    这篇文章主要介绍了解决Java编译时错误:A JNI error has occurred,please check your installation and try again,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • springboot实现敏感字段加密存储解密显示功能

    springboot实现敏感字段加密存储解密显示功能

    这篇文章主要介绍了springboot实现敏感字段加密存储,解密显示,通过mybatis,自定义注解+AOP切面,Base64加解密方式实现功能,本文通过代码实现给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java实战之城市多音字处理

    Java实战之城市多音字处理

    这篇文章主要介绍了Java实战之城市多音字处理,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • IDEA运行SpringBoot项目的图文教程

    IDEA运行SpringBoot项目的图文教程

    本文主要介绍了IDEA运行SpringBoot项目的图文教程,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 一文读懂Java Iterator(迭代器)

    一文读懂Java Iterator(迭代器)

    这篇文章主要介绍了Java Iterator(迭代器)的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Mybatis-Plus中的查询指定字段

    Mybatis-Plus中的查询指定字段

    在使用Mybatis-Plus进行数据查询时,可以通过指定字段来优化查询效率,方法一和方法二分别执行不同的SQL语句,其中方法二在执行时通常会更高效,因为它可能通过减少数据处理量和优化查询结构来提升性能,比较两种方法的SQL执行情况
    2024-09-09
  • Java中类与对象的相关知识点总结

    Java中类与对象的相关知识点总结

    对象是类实例化出来的,对象中含有类的属性,类是对象的抽象,下面这篇文章主要给大家介绍了关于Java中类与对象的一些相关知识点,需要的朋友可以参考下
    2021-11-11
  • Spring Data JPA中的Specification动态查询详解

    Spring Data JPA中的Specification动态查询详解

    Specification是一个设计模式,用于企业级应用开发中,其主要目的是将业务规则从业务逻辑中分离出来,在数据查询方面,Specification可以定义复杂的查询,使其更易于重用和测试,这篇文章主要介绍了Spring Data JPA中的Specification动态查询详解,需要的朋友可以参考下
    2023-07-07
  • java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel、word示例

    这篇文章主要介绍了java使用poi读取ppt文件和poi读取excel、word示例,需要的朋友可以参考下
    2014-03-03
  • JavaWeb实现文件上传下载功能实例解析

    JavaWeb实现文件上传下载功能实例解析

    这篇文章主要为大家详细介绍了JavaWeb中的文件上传和下载功能的实现,在Web应用系统开发中,文件上传和下载功能是非常常用的功能,需要的朋友可以参考下
    2015-08-08

最新评论