Spring Security的ACL功能简介

栏目: 后端 · 发布时间: 7年前

内容简介:Spring Security的ACL功能简介

权限控制主要应用场景及解决方案,

本文由博主 http://www.javacoder.cn/?p=926 整理,转载请注明出处,谢谢

1)WEB URL权限的控制

通过http filter链完成,比如

<http realm="Contacts Realm" use-expressions="false">
<intercept-url pattern="/login/impersonate" access="ROLE_SUPERVISOR"/>
<intercept-url pattern="/**" access="ROLE_USER"/>
</http>

拥有ROLE_SUPERVISOR角色的用户才能访问/login/impersonate路径,ROLE_USER角色的用户可以访问其他的路径

2)数据权限和service层方法调用的权限控制

MethodSecurityInterceptor 配合使用PreAuthorize、PostAuthorize等注解实现

public interface BankService {
@PreAuthorize("hasRole('ROLE_SUPERVISOR') or "
+ "hasRole('teller') and (#account.balance + #amount >= -#account.overdraft)")
public Account post(Account account, double amount);
}

3)对read,write,create,delete,administration的控制

这就是本文将要介绍的spring的ACL功能

spring security自带的 contacts-xml 示例对该功能进行了演示,如果要使用该功能,该示例是学习该功能不二之选。本文也是基于该示例进行讲解的

该示例默认的AclService是基于HSQLDB数据库实现的,HSQLDB内存数据库我一时半会没有找到合适的控制台,所以改成了 MySQL 数据库,主要的改动是建表的 SQL 和JdbcMutableAclService bean定义时classIdentityQuery和sidIdentityQuery属性的指定,对应HSQLDB,当我们执行自动创建主键的insert语句后,可以通过"call identity()"获得刚产生的id,而MySQL的语法为"select LAST_INSERT_ID()",所以定义如下

<bean id="aclService" class="org.springframework.security.acls.jdbc.JdbcMutableAclService">
<constructor-arg ref="dataSource"/>
<constructor-arg ref="lookupStrategy"/>
<constructor-arg ref="aclCache"/>
<property name="classIdentityQuery" value="select LAST_INSERT_ID()"/>
<property name="sidIdentityQuery" value="select LAST_INSERT_ID()"/>
</bean>

spring security ACL的表的ER图如下,

Spring Security的ACL功能简介

各个表的简介如下:

users : 不属于ACL的表,用户表,userService会使用本表,users.USERNAME = acl_sid.SID,acl_sid有对应的记录表示同一个principal,所以大家可以看到ER图中没有外键关系

authorities :用于记录用户被授予的权限,authorities.AUTHORITY = acl_sid.SID,acl_sid即可以表示一个principal,也可以表示一个authority,通过acl_sid.PRINCIPAL字段来区分

contacts :是本例的实体表,对该表的记录进行CRWDA权限的控制,contacts.ID = acl_object_identity.OBJECT_ID_IDENTITY;

acl_class : 表示对哪个java entity进行权限控制,本例contacts表只有一条记录为'entity 'sample.contact.Contact';

acl_sid :security identity,根据PRINCIPAL字段的不同分别表示principal或者authority;

acl_object_identity :acl_object_identity.OBJECT_ID_IDENTITY = contacts.ID,acl_object_identity.OBJECT_ID_CLASS=acl_class.ID

and acl_object_identity.OWNER_SID= acl_sid.ID;分别对对应字段的引用,也就是说id及该entity的类型唯一地确定一条acl_object_identity记录,acl_object_identity是对实体记录的抽象。

acl_entry

: acl_entry.SID = acl_sid.ID, acl_entry.ACL_OBJECT_IDENTITY = acl_object_identity.ID ;表示实际的授权。授权通过位相与存放在acl_entry.MASK字段中,read(0X1), write(0X2), create(0X4), delete(0X8), administration(0xF)

最重要类有AclService,及对应的实现JdbcMutableAclService。Acl及对应的实现AclImpl,Acl表示一个实体的权限分配,本例中为一个Contact记录的权限分配

Posted in:Spring Security


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Test Driven Development

Test Driven Development

Kent Beck / Addison-Wesley Professional / 2002-11-18 / USD 49.99

Quite simply, test-driven development is meant to eliminate fear in application development. While some fear is healthy (often viewed as a conscience that tells programmers to "be careful!"), the auth......一起来看看 《Test Driven Development》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具