<?xml version="1.0"?>
<?xml-stylesheet href="/transform" type="text/xsl"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:bibo="http://purl.org/ontology/bibo/" xmlns:bs="http://purl.org/ontology/bibo/status/" xmlns:ci="https://vocab.methodandstructure.com/content-inventory#" xmlns:dct="http://purl.org/dc/terms/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xhv="http://www.w3.org/1999/xhtml/vocab#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" lang="en" prefix="bibo: http://purl.org/ontology/bibo/ bs: http://purl.org/ontology/bibo/status/ ci: https://vocab.methodandstructure.com/content-inventory# dct: http://purl.org/dc/terms/ foaf: http://xmlns.com/foaf/0.1/ rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# xhv: http://www.w3.org/1999/xhtml/vocab# xsd: http://www.w3.org/2001/XMLSchema#" vocab="http://www.w3.org/1999/xhtml/vocab#" xml:lang="en">
  <head>
    <title property="dct:title">The ABCs of Content-Driven Systems</title>
    <base href="https://doriantaylor.com/the-abcs-of-content-driven-systems"/>
    <link href="document-stats#E7OcrokvdoJYrNb-vLTR0K" rev="ci:document"/>
    <link href="elsewhere" rel="alternate bookmark" title="Elsewhere"/>
    <link href="this-site" rel="alternate index" title="This Site"/>
    <link href="http://purl.org/ontology/bibo/status/published" rel="bibo:status"/>
    <link href="" rel="ci:canonical" title="The ABCs of Content-Driven Systems"/>
    <link href="person/dorian-taylor#me" rel="dct:creator" title="Dorian Taylor"/>
    <link href="file/abcs-of-content-driven-systems" rel="dct:hasPart foaf:depiction"/>
    <link href="file/cool-uris-dont-change" rel="dct:hasPart"/>
    <link href="file/data-sovereignty" rel="dct:hasPart"/>
    <link href="file/documents-make-lousy-documentation" rel="dct:hasPart"/>
    <link href="annual-program-2019" rel="dct:references up" title="Annual Program: 2019"/>
    <link href="javascript:sendMail('doriantaylor.com','research','The%20ABCs%20of%20Content%20Driven%20Systems');" rel="dct:references"/>
    <link href="person/dorian-taylor" rel="meta" title="Who I Am"/>
    <link about="./" href="3f36c30c-6096-454a-8a22-c062100ae41f" rel="alternate" type="application/atom+xml"/>
    <link about="./" href="f07f5044-01bc-472d-9079-9b07771b731c" rel="alternate" type="application/atom+xml"/>
    <link about="./" href="this-site" rel="alternate"/>
    <link about="./" href="elsewhere" rel="alternate"/>
    <link about="./" href="e341ca62-0387-4cea-b69a-cdabc7656871" rel="alternate" type="application/atom+xml"/>
    <link about="verso/" href="3f36c30c-6096-454a-8a22-c062100ae41f" rel="alternate" type="application/atom+xml"/>
    <link about="verso/" href="this-site" rel="alternate"/>
    <link about="verso/" href="elsewhere" rel="alternate"/>
    <meta content="the-abcs-of-content-driven-systems" datatype="xsd:token" property="ci:canonical-slug"/>
    <meta content="false" datatype="xsd:boolean" property="ci:indexed"/>
    <meta content="Motto: Decoupling Access Control from Branding and Content." property="dct:abstract"/>
    <meta content="Motto: Decoupling Access Control from Branding and Content." name="description" property="dct:abstract"/>
    <meta content="2019-06-27T05:04:06+00:00" datatype="xsd:dateTime" property="dct:created"/>
    <meta content="2019-06-27T05:14:23+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2019-06-27T09:30:49+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2019-08-15T21:03:26+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta content="2022-05-31T15:10:50+00:00" datatype="xsd:dateTime" property="dct:modified"/>
    <meta about="person/dorian-taylor#me" content="Dorian Taylor" name="author" property="foaf:name"/>
    <meta content="summary_large_image" name="twitter:card"/>
    <meta content="@doriantaylor" name="twitter:site"/>
    <meta content="The ABCs of Content-Driven Systems" name="twitter:title"/>
    <meta content="Motto: Decoupling Access Control from Branding and Content." name="twitter:description"/>
    <meta content="https://doriantaylor.com/file/abcs-of-content-driven-systems" name="twitter:image"/>
    <object>
      <nav>
        <ul>
          <li>
            <a href="annual-program-2019" rev="dct:references" typeof="bibo:Note">
              <span property="dct:title">Annual Program: 2019</span>
            </a>
          </li>
          <li>
            <a href="cool-uris-dont-change" rev="dct:references" typeof="bibo:Note">
              <span property="dct:title">Cool URIs Don't Change</span>
            </a>
          </li>
          <li>
            <a href="data-sovereignty" rev="dct:references" typeof="bibo:Note">
              <span property="dct:title">Data Sovereignty</span>
            </a>
          </li>
          <li>
            <a href="documents-make-lousy-documentation" rev="dct:references" typeof="bibo:Note">
              <span property="dct:title">Documents Make Lousy Documentation</span>
            </a>
          </li>
          <li>
            <a href="document-stats#E7OcrokvdoJYrNb-vLTR0K" rev="ci:document" typeof="qb:Observation">
              <span>urn:uuid:ece72ba2-4bdd-4a09-a62b-35bfaf2d3474</span>
            </a>
          </li>
        </ul>
      </nav>
    </object>
  </head>
  <body about="" id="EfzGxgrQ6Aqs1lCzIyIOVJ" typeof="bibo:Note">
    <article>
      <figure id="EMYMQClgf_hty2jFNn_Q0I">
        <img src="file/abcs-of-content-driven-systems;knockout" alt="The ABCs of Content-Driven Systems"/>
        <h1>The ABCs of Content-Driven Systems</h1>
        <p><em>Decoupling <strong>a</strong>ccess control from <strong>b</strong>randing <em>and</em> <strong>c</strong>ontent</em></p>
      </figure>
      <p>Digital designers of all kinds talk endlessly about the importance of separating content from presentation, but I argue there is a third consideration, and that&#x2019;s <em>who</em> gets to see <em>what</em>. Overwhelmingly, access control is coupled to the application, and this makes it hard to provision, extend and integrate. The net effect is that to get through their day, people need a zillion different usernames and passwords in a hodgepodge of systems that do not interact with one another. The goal here is to figure out design patterns for (primarily Web-based) infrastructure software <span class="parenthesis" title="OMG/LOL/WTF">(<abbr title="content management system">CMS</abbr>/<abbr title="enterprise resource planning">ERP</abbr>/<abbr title="customer relationship management">CRM</abbr>)</span> that fully decouple the access control functionality from the content and the presentation. The result is simpler, more secure systems that work better for users. <strong>ABC</strong>:</p>
      <ul>
        <li><strong>Access control</strong> (i.e., authentication and authorization),</li>
        <li><strong>Branding</strong> (along with the rest of the presentation layer),</li>
        <li><strong>Content</strong> (including data and business logic).</li>
      </ul>
      <section id="EJCeyNRZwL2jvn79JLg12I">
        <h2>Origin Story</h2>
        <p>This theme came about through a confluence of projects, including an ongoing project to develop a client's intranet. It began with a concern, first, that people wouldn't use the intranet if they had to incur the extra hurdle of logging into it. Second, we were concerned about the overhead of managing yet another set of user names, passwords, and permissions, including the inevitable tendency for people to forget their passwords&#x2014;<em>and</em> their user names. What we came up with was a way to hook into the organization's <dfn>single sign-on</dfn> system, meaning people in the office, when accessing the intranet, <em>never</em> see a login screen.</p>
        <p>The roots for this theme in fact go back even farther, to work I did in the mid-2000s on federated identity for the Web: systems which were designed to be connective tissue, so that you could move&#x2014;along with your data&#x2014;unimpeded from application to application. Indeed, side effects of this achievement include a pattern for designing Web applications&#x2014;like this client's intranet itself&#x2014;fully decoupled from the business of authentication and authorization. The net effect is that the applications themselves are simpler to write and easier to test, and we can drop in different access control mechanisms, and even have multiple mechanisms running alongside one another.</p>
        <aside role="note" id="ETieE1B_OILenLi1iTAYKJ">
          <p>It <em>also</em> turns out that only a tiny sliver of the system tends to genuinely depend on whether or not you're logged in, notwithstanding the bare fact that you need to be logged in to access it. Using this knowledge, we can categorize the resources in terms of whether or not they <em>change</em> depending on who you're logged in as when you look at them. This makes the overall system even <em>simpler</em>: on the intranet project, for example, we only have a single page that needs to know who you are, and that's in order to say <q>Hello <code>your name</code></q>. Then we just <dfn>transclude</dfn> that page wherever we want to see it.</p>
        </aside>
        <p>All other aspects of access control aside: <strong>passwords suck.</strong> There have been considerable advancements in both security <em>and</em> convenience since passwords, but if your product/service/infrastructure/app/whatever is too wedded to passwords, you're never gonna get to try all the other stuff.</p>
      </section>
      <section id="EWYskJcBx8W7Dv6lUwXamK">
        <h2>The Program</h2>
        <p>The program of this theme is to further refine the set of <em>technical</em> criteria that afford the clean separation of access control from content and presentation in a Web-based information system, including the development of technique for modulating the presentation based on whether or not a user is authenticated, or, if authenticated, what access level they have. The proposition is to solve for the general case using open-source implementations of open standards, and where necessary, tailor the solution to your specific platform.</p>
        <aside role="note" id="EvKv_HEhG7xFpVoA6kWeyJ">
          <p>Bonus example: when developing my own client extranet, I wanted to provide a modicum of protection to confidential client information, but once again didn't want to spend my life managing passwords. To solve the problem, <a href="https://github.com/doriantaylor/rb-lazyauth" rel="dct:references">I made a quick little plugin</a> that more or less reduces to a <q>forgot my password</q> loop: it generates a token that it sticks onto the end of the <abbr>URL</abbr> I want to show my client, and when they click on the link, it swaps the token for a cookie, and they can browse around at their leisure. Preliminary reports suggest the experience is pretty seamless, and I have plenty more ideas where that one came from.</p>
        </aside>
      </section>
      <footer>
        <form action="javascript:sendMail('doriantaylor.com','research','The%20ABCs%20of%20Content%20Driven%20Systems');" id="E8oO_xRAV1sSft9_Sr92KK">
          <h3>Interested? <button>Get In Touch</button></h3>
        </form>
        <h5>Or, have a look at these other research themes:</h5>
        <nav>
          <a rel="dct:references first prev" href="data-sovereignty" title="Data Sovereignty">
            <img src="file/data-sovereignty;knockout" alt="Data Sovereignty"/>
            <h4>Data Sovereignty</h4>
            <p>Possession is nine tenths of the law</p>
          </a>
          
          <a rel="dct:references next" href="documents-make-lousy-documentation" title="Documents Make Lousy Documentation">
            <img src="file/documents-make-lousy-documentation;knockout" alt="Documents Make Lousy Documentation"/>
            <h4>Documents Make<br/>Lousy Documentation</h4>
            <p>Disencumbering organizational reference material</p>
          </a>
          <a rel="dct:references last" href="cool-uris-dont-change" title="Cool URIs Don't Change">
            <img src="file/cool-uris-dont-change;knockout" alt="Cool URIs Don't Change"/>
            <h4>Cool URIs Don't Change</h4>
            <p>How much value gets lost to broken links?</p>
          </a>
        </nav>
      </footer>
    </article>
  </body>
</html>
