本文介绍了Spring Security控制授权的方法,分享给大家,具体如下:
<强>使用授权方法进行授权配置强>
每一个Spring Security控制授权表达式(以下简称为表达式)实际上都在在API中对应一个授权方法,该方法是请求的URL权限配置时的处理方法,例如:
@Override 保护无效配置(HttpSecurity http){抛出异常 http.authorizeRequests () .antMatchers (HttpMethod。删除/user/*) .hasRole (“ADMIN”) .antMatchers(“/指数”).permitAll () .antMatchers (“/?。hasAnyRole (“WE_CHAT_PAY”、“ALI_PAY”) .antMatchers .hasIpAddress(“/调试”)(“192.168.1.0/24”); } >之前<强>使用授权表达式给多权限要求的请求授权强>
那么,何时需要用到表达式进行授权处理呢?一个安全应用的权限要求往往是复杂多样的,比如,项目的调试请求希望访问者既要拥有管理员权限又必须是通过公司内部局域网内部访问。而这样的需求下,仅仅通过安全API提供的方法是无法满足的,因为这些授权方法是无法连续调用的。
此时就可以使用授权表达式解决:
@Override 保护无效配置(HttpSecurity http){抛出异常 http.authorizeRequests () .antMatchers("/调试”) .access (“hasRole(管理)和hasIpAddress (192.168.1.0/24) "); }<强>授权表达式举例说明强>
表达式 说明 permitAll 永远返回现实 denyAll 永远返回错误的 anonyous 当前用户若是匿名用户返回现实 rememberMe 当前用户若是rememberMe用户返回现实 通过身份验证 当前用户若不是匿名(已认证)用户返回现实 fullAuthenticated 当前用户若既不是匿名用户又不是rememberMe用户时返回现实 hasRole(作用) 当前用户权限集合中若拥有指定的作用角色权限(匹配时会在你所指定的权限前加“具备ROLE_”,即判断是否有“ROLE_role”权限)时返回现实 hasAnyRole (role2 role1的角色,…) 当前用户权限集合中若拥有任意一个角色权限时返回现实 hasAuthority(权威) 当前用户权限集合中若具有权威权限(匹配是否有“权威”权限)时返回现实 hasAnyAuthority(权威) 当前用户权限集合中若拥有任意一个权限时返回现实 hasIpAddress (“192.168.1.0/24”) 发送请求的IP匹配时fanhui真的
<>强基于角色的访问控制RBAC(基于角色的访问控制)强>
或许你会认为上述方式已能满足绝大多数应用安全授权管理。但事实上的企业级应用的授权往往是基于数据库数据动态变化的,若是使用上述方式进行字符串拼接,不仅对于开发者极不友好(每一次人人员变动都意味着需要改代码,显然不合理),而且应用的性能也会随之降低。那么,如何解决呢?
<强>数据模型强>
通用的RBAC数据模型,一般需要五张表(三张实体表,两张关系表)。三张实体表包括用户表,角色表,资源表。两张关系表包括。其之间关系如下图:
RBAC数据模型
<强>用户表强>
任何一个用户都必须要有用户表,当公司发生人员变动时,由业务人员(如人力资源)对该数据表进行增删记录。
<>强角色表强>
公司有哪些身份的人,例如总裁,副总裁,部门经理等,有业务人员根据公司的具体情况对该表数据进行操作。
<强>资源表强>
存储需要进行权限控制的资源,由于我们进行控制授权时实际上是基于URL的,但业务人员非按URL组织数据条目,而是以视图界面的形式进行曹操作,所以在这张表中存储的是呈现给业务人员的菜单,按钮及其所进行权限控制的URL。
<强>用户——角色关系表强>
用户表与角色表(用户id与角色id)之间是一个多对多的关系。一个用户可以是多个角色(一个用户既可以是部门经理又可以是某个管理员),而一个角色往往对应多个用户。
Spring Security控制授权的方法