This application illustrates how the XML access control can be applied to the domains that requires more complicated access control specifications such as a context dependent access control. This application is taken from the medical domain. A medical record stores medical history such as diagnosis results and the chemotherapy history for a patient. The advantages of representing medical records in XML format would be a platform-independent plain-text format and the features of the digital signature. It is often said that patients want to be properly informed by the doctor in charge so they can give their informed consent to treatment. One way to achieve this goal is for the doctor and the patient to sign a document that confirms that the patient was well informed and consented to the procedure. Since XML provides a mechanism to store the digital signature inside the document, XML is an appropriate format to represent medical records.
The medical record we use in this example consists of three sections: a general information section, a medical record section, and an informed consent section. The general information section is used for storing the patient's name and the date s/he checked in, which can be read by many people. The record section is used for storing diagnosis results and the therapeutic history, which is basically read only by the medical staff. The informed consent section is used for recording the grant of informed consent, which should not be modified once it has been written.
<medical_record>
<general_info>
<hospital_info>
<name>ABC Hospital</name>
<department>Surgery</department>
</hospital_info>
<patient_info>
<name>Patricia</name>
<age>60</age>
<sex>female</sex>
<health_insurance>123456</health_insurance>
<family>Frank</family>
</patient_info>
<hospitalization_info>
<registration>2000-09-01</registration>
<in>2000-09-14</in>
<out></out>
</hospitalization_info>
</general_info>
<!-- ========================================== -->
<record>
<diagnosis_info>
<diagnosis>
<item type="primary">Gastric Cancer</item>
<item type="secondary">Hyper tension</item>
</diagnosis>
<pathological_diagnosis>
<diagnosis>
<item type="primary">Well differentiated adeno carcinoma</item>
</diagnosis>
<date>2000-10-05</date>
<malignancy type="yes"/>
</pathological_diagnosis>
</diagnosis_info>
<therapy_info>
<operation>
<method_of_surgery>total gastrectomy</method_of_surgery>
<date>2000-09-20</date>
</operation>
<chemotherapy>
<div>
<prescription>5-FU 500mg and CDDP 10mg /day x10days</prescription>
<start_date>2000-10-10</start_date>
<end_date>2000-10-21</end_date>
</div>
<po>
<prescription>5-FU 200mg/day</prescription>
<start_date>2000-12-01</start_date>
<end_date/>
</po>
</chemotherapy>
</therapy_info>
</record>
<!-- ========================================== -->
<informed_consent>
<family_consent>
<date>2000-09-13</date>
<disclosure_to_patient>no</disclosure_to_patient>
</family_consent>
<patient_consent>
<date>2000-09-19</date>
</patient_consent>
</informed_consent>
</medical_record>
|
A set of access control policies for the above medical record is described as follows:
<policy xmlns="http://www.trl.ibm.com/projects/xml/xacl">
<!-- ==================================================
1. Doctor and nurse can read medical records.
=================================================== -->
<xacl>
<object href="/medical_record"/>
<rule>
<acl>
<subject>
<group>doctor</group>
</subject>
<subject>
<group>nurse</group>
</subject>
<action name="read" permission="grant"/>
</acl>
<!-- ==================================================
2. The doctor in charge can write every element of the
medical record.
=================================================== -->
<acl>
<subject>
<role>doctor_in_charge</role>
<group>doctor</group>
</subject>
<action name="write" permission="grant"/>
</acl>
</rule>
</xacl>
<!-- ==================================================
3. The hospital staff can read general information.
=================================================== -->
<xacl>
<object href="/medical_record/general_info"/>
<rule>
<acl>
<subject>
<group>hospital_staff</group>
</subject>
<action name="read" permission="grant"/>
</acl>
<!-- ==================================================
4. Patients can read the general_info of their own
medical records.
=================================================== -->
<acl>
<subject>
<group>patient</group>
</subject>
<action name="read" permission="grant"/>
<condition operation="and">
<predicate name="compareStr">
<parameter value="eq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/general_info/patient_info/name"/>
</function></parameter>
<parameter><function name="getUid"/></parameter>
</predicate>
</condition>
</acl>
<!-- ==================================================
5. A patient's family can read the general information of
their family's madical records.
=================================================== -->
<acl>
<subject>
<group>family</group>
</subject>
<action name="read" permission="grant"/>
<condition operation="and">
<predicate name="compareStr">
<parameter value="eq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/general_info/patient_info/family"/>
</function></parameter>
<parameter><function name="getUid"/></parameter>
</predicate>
</condition>
</acl>
</rule>
</xacl>
<!-- ==================================================
6. A hospital receptionist can write a patient's name
in a blank medical record.
=================================================== -->
<xacl>
<object href="/medical_record/general_info/patient_info/name"/>
<rule>
<acl>
<subject>
<group>receptionist</group>
</subject>
<action name="write" permission="grant"/>
<condition operation="and">
<predicate name="compareStr">
<parameter value="eq"/>
<parameter><function name="getValue"><parameter value="."/>
</function></parameter>
<parameter/>
</predicate>
</condition>
</acl>
</rule>
</xacl>
<!-- ==================================================
7. Patients can read their own medical records if informed
consent has been given and family has agreed to the
release of the results of the diagnosis to the patient.
=================================================== -->
<xacl>
<object href="/medical_record/record"/>
<rule>
<acl>
<subject>
<group>patient</group>
</subject>
<action name="read" permission="grant"/>
<condition operation="and">
<predicate name="compareStr">
<parameter value="neq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/informed_consent/patient_consent/date"/>
</function></parameter>
<parameter/>
</predicate>
<predicate name="compareStr">
<parameter value="eq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/general_info/patient_info/name"/>
</function></parameter>
<parameter><function name="getUid"/></parameter>
</predicate>
<predicate name="compareStr">
<parameter value="eq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/informed_consent/family_consent/disclosure_to_patient"/>
</function></parameter>
<parameter value="yes"/>
</predicate>
</condition>
</acl>
<!-- ==================================================
8. A patient's family can read the medical record if
informed consent has been given.
=================================================== -->
<acl>
<subject>
<group>family</group>
</subject>
<action name="read" permission="grant"/>
<condition operation="and">
<predicate name="compareStr">
<parameter value="neq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/informed_consent/family_consent/date"/>
</function></parameter>
<parameter/>
</predicate>
<predicate name="compareStr">
<parameter value="eq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/general_info/patient_info/family"/>
</function></parameter>
<parameter><function name="getUid"/></parameter>
</predicate>
</condition>
</acl>
</rule>
</xacl>
<!-- ==================================================
9. The doctor in charge cannot modify the informed consent
section once consent has been granted.
=================================================== -->
<xacl>
<object href="/medical_record/informed_consent"/>
<rule>
<acl>
<subject>
<role>doctor_in_charge</role>
</subject>
<action name="write" permission="deny"/>
<condition operation="or">
<predicate name="compareStr">
<parameter value="neq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/informed_consent/family_consent/date"/>
</function></parameter>
<parameter/>
</predicate>
<predicate name="compareStr">
<parameter value="neq"/>
<parameter><function name="getValue">
<parameter value="/medical_record/informed_consent/patient_consent/date"/>
</function></parameter>
<parameter/>
</predicate>
</condition>
</acl>
</rule>
</xacl>
</policy>
|
Try the following access requests. The resulting access decisions as shown in the XACL Visual Tool are described in the right-most column.
| Access request file | Object | Subject (group) | Action | Brief description of access decisions |
|---|---|---|---|---|
| medical_request1.xml | /medical_record | Dave (doctor) |
read | The doctor Dave can read all of the medical records. |
| medical_request2.xml | /medical_record | Dave doctor_in_charge (doctor) |
write | Dave is Patricia's doctor in charge and he can write any fields except for the informed consent section. |
| medical_request3.xml | /medical_record | Don (doctor) |
write | The doctor Don is not allowed to update any fields of Patricia's medical record because he is not a doctor in charge. |
| medical_request4.xml | /medical_record | Nancy (nurse) |
read | The nurse Nancy can read all of the medical records. |
| medical_request5.xml | /medical_record | Rose (receptionist) |
read | The receptionist Rose can read only the general_information section. |
| medical_request6.xml | /medical_record | Patricia (patient) |
read | The patient Patricia is not allowed to read her medical record except for the general information because her family Frank did not agree to let her know the truth. |
| medical_request7.xml | /medical_record | Frank (family) |
read | Patricia's family Frank is allowed to read Patricia's medical record because informed consent was granted on 13th September 2000. |
| medical_request8.xml | /medical_record | Paul (patient) |
read | The patient Paul cannot read any other patient's medical record. |
Group membership is defined in group.xml as follows.
| Group | Member |
|---|---|
| doctor | Dave, Don |
| nurse | Nancy |
| receptionist | Rose |
| patient | Patricia, Paul |
| family | Frank, Fred |
The binding table is defined as follows:
<bind_table>
<bind>
<target href="medical_record.dtd"/>
<policy href="medical_policy.xml"/>
<status href="medical_status.xml"/>
</bind>
</bind_table>
|