须强制执行更高级的数据级安全性,因此对对象实例甚至其字段的访 问都由规则控制。示例包括 “只有员工的经理或该组的 HR 管理员可以查看敏 感的个人数据” 或 “只有分配给组的经理可以代表组进行交易”。考虑强制执 行第一条规则的示例,如图 6 和清单 8 所示:
图 6. 示例人力资源域模型
AOP@Work: 使用方面的下几个步骤-学习建议之后(14)
时间:2011-09-07 IBM Ron Bodkin
清单 8. 细粒度安全性方 面
public aspect SensitiveDataAuthorization {
/**
* Matches sensitive read operations on employee data, namely reading
* sensitive fields
*/
pointcut readSensitiveEmployeeData(Employee employee):
target(employee) && (
get(* salary) || get(* address) || get(* bonus));
/**
* Matches the set up of a security context, in this case for JAAS
*/
pointcut securityContext(Subject subject, Action action):
cflow(execution(* Subject.doAs*(Subject, Action, ..)) &&
args(subject, action, ..));
before(Subject subject, Employee employee) :
readSensitiveEmployeeData(employee) &&
securityContext(subject, *) {
policy.checkAccess(subject, employee);
}
/**
* Matches sensitive read operations on regulation data, namely calling
* get methods or calculating tax on it.
*/
pointcut sensitiveRegOp(EmployeeRegulation reg):
this(reg) && (
execution(* get*()) || execution(* calcTax()));
before(Subject subject, EmployeeRegulation reg) :
sensitiveRegOp(reg) && securityContext(subject, *) {
Employee employee = reg.getEmployee();
policy.checkAccess(subject, employee);
}
public void setPolicy(EmployeeAccessPolicy policy) { ... }
public EmployeeAccessPolicy getPolicy() { ... }
protected EmployeeAccessPolicy policy;
}
public class EmployeeAccessPolicyImp implements EmployeeAccessPolicy {
/**
* Checks for valid access to data.
* @throws SecurityException if not valid
*/
public void checkAccess(Employee employee, Worker worker)
throws SecurityException {
Employee caller =
Employee.getEmployee(worker.getSubject());
if (caller==null || !employee.reportsTo(caller))) {
// record attempted security violation
throw new SecurityException("...");
}
// log successful data access to audit trail
}
}
在清单 8 中,SensitiveDataAuthorization 方面在 readSensitiveEmplData() 上有第一个建议,保护对员工类上直接定义的敏感数 据字段 的读取。每当在安全上下文(在这种情况下,是当用户通过 JAAS 身份 验证时)中进行时,该建议就建议此类读取。该建议指派给 helper 类 EmployeeAccessPolicy 中的 checkAccess() 方法,该方法检查执行主体(通常 是用户)和其数据被访问的员工之间的关系。如果所需关系不存在,则该方法抛 出异常并发出警报。否则,该方法记录尝试的访问。
方面的第二部分开始变得更有趣:在此,我保护了对由组合对象保存的雇员 数据的访问。具体地说,EmployeeRegulation 对象保存敏感数据,比如政府税 务标识符、税率和扣缴信息。自然,该信息随雇员所在的辖区(国家、州、省、 市等)而变。执行计算税方法或从任何规章数据的实现中获取任何数据都被认为 是敏感的。在这种情况下,我需要从规章数据映射回聚合对象(雇员)来检查访 问。
AOP@Work: 使用方面的下几个步骤-学习建议之后(15)
时间:2011 |