<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Xis' blog &#187; jsecurity</title>
	<atom:link href="http://xis.schowek.net/tag/jsecurity/feed/" rel="self" type="application/rss+xml" />
	<link>http://xis.schowek.net</link>
	<description>Mój wirtualny schowek</description>
	<lastBuildDate>Thu, 10 Mar 2011 18:41:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Uszczelnianie aplikacji z Grails i JSecurity &#8211; ciąg dalszy</title>
		<link>http://xis.schowek.net/2009/03/22/uszczelnianie-aplikacji-z-grails-i-jsecurity-ciag-dalszy/</link>
		<comments>http://xis.schowek.net/2009/03/22/uszczelnianie-aplikacji-z-grails-i-jsecurity-ciag-dalszy/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 11:12:18 +0000</pubDate>
		<dc:creator>xis</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[jsecurity]]></category>

		<guid isPermaLink="false">http://xis.schowek.net/?p=329</guid>
		<description><![CDATA[Po ostatnim prostym zabezpieczeniu aplikacji Grailsowej z użyciem wtyczki JSecurity pozostał pewien niedosyt. Nasz przykład &#8211; i owszem &#8211; skutecznie zabezpieczył dostęp osób niezalogowanych, ale nie pokazał prawdziwej potęgi JSecurity &#8211; możliwości autoryzacji, czyli sprawdzania praw dostępu do określonych zasobów. Wyglądało to trochę tak, jakbyśmy wytaczali armatę po to by zabić muchę, dlatego teraz spróbujemy [...]]]></description>
			<content:encoded><![CDATA[<p>Po ostatnim <a href="http://xis.schowek.net/2009/03/15/proste-uwierzytelnianie-w-grails-z-jsecurity/">prostym zabezpieczeniu aplikacji Grailsowej</a> z użyciem wtyczki JSecurity pozostał pewien niedosyt. Nasz przykład &#8211; i owszem &#8211; skutecznie zabezpieczył dostęp osób niezalogowanych, ale nie pokazał prawdziwej potęgi JSecurity &#8211; możliwości autoryzacji, czyli sprawdzania praw dostępu do określonych zasobów. Wyglądało to trochę tak, jakbyśmy wytaczali armatę po to by zabić muchę, dlatego teraz spróbujemy tą armatą zapolować na grubszego zwierza ;) wciąż jednak pozostając przy założeniu, że ma być prosto i  estetycznie na ile to możliwe.<br />
Przyjmijmy zatem, że nasza aplikacja ma:</p>
<ul>
<li>dopuszczać tylko zalogowanych użytkowników (tak, jak poprzednio),</li>
<li>pozwalać na oglądanie zasobów wszystkim zalogowanym użytkownikom (posiadającym rolę &#8222;users&#8221;),</li>
<li>pozwalać na edycję/usuwanie/tworzenie nowych zasobów tylko użytkownikom posiadającym rolę &#8222;admin&#8221; (pozostali użytkownicy dostają informację o braku dostępu)</li>
</ul>
<p>Jak widzisz, wykorzystamy szkielet poprzedniej aplikacji. Zauważ też, że wprowadzamy pojęcie <em>roli</em>, czym jest rola?<br />
Zgodnie z infomacją na stronie wtyczki, to</p>
<blockquote><p>a job or a set of responsibilities that a person can have</p></blockquote>
<p>, czyli zbiór odpowiedzialności, które posiada dany użytkownik w systemie. System, oczywiście, musi takiemu użytkownikowi udostępnić możliwość wykonania czynności wchodzących w skład takich odpowiedzialności. Upraszczając &#8211; posiadanie danej roli pozwala na dostęp do zasobów systemu, do których dostęp bez niej jest zabroniony.<br />
Założeniem naszej aplikacji jest, aby każdy zalogowany użytkownik mógł oglądać dane, jednak modyfikacja jakichkolwiek informacji wiąże się z obowiązkiem posiadania roli admina.</p>
<p>Zaczynajmy.</p>
<p><strong>1.</strong> Dodajemy nowe klasy dziedzinowe</p>
<p>Musimy zdefiniować nowe klasy dziedzinowe, które pozwolą nam utrwalać informacje o rolach i powiązaniach ich z użytkownikami.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Role <span style="color: #66cc66;">&#123;</span>
    <span style="color: #aaaadd; font-weight: bold;">String</span> name
<span style="color: #66cc66;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> UserRoleRef <span style="color: #66cc66;">&#123;</span>
    User user
    Role role
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Dzięki takim klasom dziedzinowym (i klasie <strong>User</strong> z poprzedniego wpisu) możliwa będzie realizacja referencji <em>wiele-do-wielu</em> &#8211; jeden użytkownik może mieć wiele ról w systemie, a jedna rola może być w posiadaniu wielu użytkowników.</p>
<p>Możemy teraz zapisać wstępnie uprawnienia dostępu do naszego systemu, np. tak:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// użytkownicy</span>
<span style="color: #000000; font-weight: bold;">def</span> jasiu <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: <span style="color: #ff0000;">&quot;jasiu&quot;</span>, password: <span style="color: #000000; font-weight: bold;">new</span> Sha1Hash<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;sekret&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">toHex</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #000000; font-weight: bold;">def</span> admin <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: <span style="color: #ff0000;">&quot;admin&quot;</span>, password: <span style="color: #000000; font-weight: bold;">new</span> Sha1Hash<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;admin&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">toHex</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// role</span>
<span style="color: #000000; font-weight: bold;">def</span> usersRole <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Role<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;users&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #000000; font-weight: bold;">def</span> adminRole <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Role<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;admin&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// powiązania user-role</span>
<span style="color: #000000; font-weight: bold;">new</span> UserRoleRef<span style="color: #66cc66;">&#40;</span>user: jasiu, role: usersRole<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #000000; font-weight: bold;">new</span> UserRoleRef<span style="color: #66cc66;">&#40;</span>user: admin, role: adminRole<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p><strong>2.</strong> Uaktualniamy filtr</p>
<p>Role i powiązania z użytkownikami mamy już zdefiniowane i zapisane w bazie danych, jednak wciąż nie wiemy po co nam one. Samo posiadanie praw &#8222;admina&#8221; nic nie daje, jeśli nie wiemy, co one dają. Uaktualniamy nasz plik <strong>SecurityFilters.groovy</strong> tak:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> SecurityFilters <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> filters <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        auth<span style="color: #66cc66;">&#40;</span>controller: <span style="color: #ff0000;">&quot;*&quot;</span>, action: <span style="color: #ff0000;">&quot;*&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            before <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
                accessControl <span style="color: #66cc66;">&#123;</span> <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        manageRecord<span style="color: #66cc66;">&#40;</span>controller: <span style="color: #ff0000;">&quot;*&quot;</span>, action: <span style="color: #ff0000;">&quot;(create|edit|save|update|delete)&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            before <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
                accessControl <span style="color: #66cc66;">&#123;</span>
                    role<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;admins&quot;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        showRecord<span style="color: #66cc66;">&#40;</span>controller: <span style="color: #ff0000;">&quot;*&quot;</span>, action: <span style="color: #ff0000;">&quot;show&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            before <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
                accessControl <span style="color: #66cc66;">&#123;</span>
                    role<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;admins&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">||</span> role<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;users&quot;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Jak widać, mamy zdefiniowane dwie reguły dostępu do dowolnego kontrolera (gwiazdka), ale z wyszczególnionymi akcjami. Akcja <strong>show</strong> wymaga posiadania roli &#8222;users&#8221;, albo &#8222;admins&#8221; (czyli dowolnej, na chwilę obecną), a akcje pozwalające na modyfikacje informacji &#8211; roli &#8222;admins&#8221;.</p>
<p><strong>3.</strong> Rozszerzamy funkcjonalność <strong>MyRealm</strong></p>
<p>Czas na fragment kodu, który będzie odpowiadał za sprawdzanie, czy dany użytkownik posiada daną rolę. Wzbogacamy naszą klasę <strong>MyRealm</strong> w dwie dodatkowe (poza <strong>authenticate()</strong>) metody:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">def</span> hasRole<span style="color: #66cc66;">&#40;</span>principal, roleName<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">def</span> criteria <span style="color: #66cc66;">=</span> UserRoleRef.<span style="color: #006600;">createCriteria</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">def</span> roles <span style="color: #66cc66;">=</span> criteria.<span style="color: #006600;">list</span> <span style="color: #66cc66;">&#123;</span>
            role <span style="color: #66cc66;">&#123;</span>
                eq<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span>, roleName<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#125;</span>
            user <span style="color: #66cc66;">&#123;</span>
                eq<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'username'</span>, principal<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> roles.<span style="color: #663399;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #cc66cc;">0</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> hasAllRoles<span style="color: #66cc66;">&#40;</span>principal, roles<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">def</span> criteria <span style="color: #66cc66;">=</span> UserRoleRef.<span style="color: #006600;">createCriteria</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">def</span> r <span style="color: #66cc66;">=</span> criteria.<span style="color: #006600;">list</span> <span style="color: #66cc66;">&#123;</span>
            role <span style="color: #66cc66;">&#123;</span>
                <span style="color: #ff0000;">'in'</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'name'</span>, roles<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#125;</span>
            user <span style="color: #66cc66;">&#123;</span>
                eq<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'username'</span>, principal<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> r.<span style="color: #663399;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">==</span> roles.<span style="color: #663399;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Obie są dość proste &#8211; pierwsza sprawdza istnienie referencji użytkownik-rola dla zadanych parametrów, druga metoda robi to samo, ale ze zbiorem ról zadanych jako parametr.</p>
<p><strong>4.</strong> Dodajemy widok informujący o braku dostępu</p>
<p>Założenia mamy takie, żeby użytkownik bez dostępu do konkretnego zasobu został o tym poinformowany komunikatem. W tym celu wprowadzamy drobne usprawnienie do naszego kontrolera <strong>AuthController</strong>. Wprowadzamy domknięcie unauthorized, które będzie wykonane za każdym razem, gdy użytkownik spróbuje wykonać akcję, do której nie ma dostępu.</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">def</span> unauthorized <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>&#8230; oraz plik widoku dla takiej akcji (<strong>views/auth/unauthorized.gsp</strong>):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt;%@ page <span style="color: #000066;">contentType</span>=<span style="color: #ff0000;">&quot;text/html;charset=UTF-8&quot;</span> %<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">http-equiv</span>=<span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Brak dostępu<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Dostęp zabroniony<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/h1<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>5.</strong> Uaktualnianie menu</p>
<p>Nasze zabezpieczanie właściwie się zakończyło, jednak warto jeszcze zadbać o dodatkową rzecz. Jeśli pracujemy na widokach wygenerowanych przez Grails (np. za pomocą komendy <strong>grails generate-all &lt;klasa_dziedzinowa&gt;</strong>), to każdy z widoków wyposażony jest w przyciski/odnośniki kierujące do stron pozwalających na modyfikację/dodawanie/usuwanie rekordów, np. takich:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;nav&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;menuButton&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;home&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;${createLinkTo(dir:'')}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Home<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;menuButton&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>New Book<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Teoretycznie nic się nie stanie, jeśli tak to zostawimy, bo nawet kliknięcie na link <strong>New Book</strong> nie spowoduje wygenerowania formularza tworzenia nowej książki, tylko skieruje nas do strony z informacją o braku dostępu. Jednak&#8230; czego oczy nie widzą, tego sercu nie żal :) więc warto ukryć przed użytkownikiem te pozycje menu, które nie są mu potrzebne. Wykorzystamy więc znacznik <strong>jsec:hasRole</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;nav&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;menuButton&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;home&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;${createLinkTo(dir:'')}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Home<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsec:hasRole</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;admins&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;menuButton&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;g:link</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;create&quot;</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;create&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>New Book<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/g:link<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jsec:hasRole<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Od tej pory odnośnik <strong>New Book</strong> pokaże się tylko użytkownikom posiadającym rolę &#8222;admins&#8221;. Takie modyfikacje możemy wprowadzić we wszystkich widokach naszej aplikacji.</p>
<p>I to właściwie wszystko jeśli chodzi o kontrolę ról za pomocą JSecurity w Grails.</p>
<p>Dość ciekawą rzeczą, która warta jest poznania, ale nie opisałem jej tutaj (miało być prosto, więc nie chciałem dodatkowo komplikować) jest kontrola <em>uprawnień</em> za pomocą JSecurity. Wtyczka dla Grails pozwala na kontrolę uprawnień nie tylko na poziomie kontroler/akcja, ale też np. dostępu do plików, albo innych zasobów systemowych.</p>
]]></content:encoded>
			<wfw:commentRss>http://xis.schowek.net/2009/03/22/uszczelnianie-aplikacji-z-grails-i-jsecurity-ciag-dalszy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proste uwierzytelnianie w Grails z JSecurity</title>
		<link>http://xis.schowek.net/2009/03/15/proste-uwierzytelnianie-w-grails-z-jsecurity/</link>
		<comments>http://xis.schowek.net/2009/03/15/proste-uwierzytelnianie-w-grails-z-jsecurity/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 18:03:24 +0000</pubDate>
		<dc:creator>xis</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[jsecurity]]></category>

		<guid isPermaLink="false">http://xis.schowek.net/?p=308</guid>
		<description><![CDATA[Pisałem ostatnio aplikację webową, która wymagała bardzo prostego uwierzytelniania. Grails &#8211; jak się okazuje &#8211; ma wtyczkę JSecurity, dzięki której można realizować proste uwierzytelnianie, ale i bardziej skomplikowane operacje autoryzacji. Wtyczka JSecurity dla Grails jest wyposażona w fajny QuickStart, który to już po instalacji pozwala na całkiem kompleksowe zabezpieczenie aplikacji. Mi jednak potrzebny był ekstremalnie [...]]]></description>
			<content:encoded><![CDATA[<p>Pisałem ostatnio aplikację webową, która wymagała bardzo prostego uwierzytelniania. Grails &#8211; jak się okazuje &#8211; <a href="http://www.grails.org/JSecurity+Plugin">ma wtyczkę JSecurity</a>, dzięki której można realizować proste uwierzytelnianie, ale i bardziej skomplikowane operacje autoryzacji. Wtyczka <a href="http://jsecurity.org">JSecurity</a> dla Grails jest wyposażona w fajny <a href="grails install-plugin jsecurity">QuickStart</a>, który to już po instalacji pozwala na całkiem kompleksowe zabezpieczenie aplikacji. Mi jednak potrzebny był ekstremalnie prosty mechanizm, na szczęście wtyczka zaoferowała coś w sam raz. </p>
<p>Poniższy wpis jest oparty właśnie na wspomnianym wyżej QuickStarcie, jednak został uproszczony i ograniczony jedynie do mechanizmu <s>autentykacji</s> <a href="http://pl.wikipedia.org/wiki/Uwierzytelnianie">uwierzytelnienia</a>, nie zaś <a href="http://pl.wikipedia.org/wiki/Autoryzacja_(informatyka)">autoryzacji</a> (kontroli dostępu do zasobów) użytkowników.</p>
<p>Dostęp do aplikacji z JSecurity jest realizowany za pomocą <em>przestrzeni</em> (<em>ang. realms</em>), można skonstruować mechanizm <s>autentykacji</s> uwierzytelnienia (i autoryzacji) na różne sposoby, np. za pomocą <a href="http://pl.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol">katalogów LDAP</a>, loginów systemowych, usług sieciowych itd. My wykorzystamy najbardziej tradycyjny mechanizm: sprawdzania użytkowników zapisanych w bazie danych. JSecurity realizuje mechanizm weryfikacji dostępu do poszczególnych zasobów systemu za pomocą przynależności użytkowników do ról, jednak mój przykład będzie znacznie prostszy &#8211; wystarczy, że użytkownik będzie istniał w bazie danych, a już będzie miał dostęp do zasobów systemu.</p>
<p>Oto jak wzbogacić naszą aplikację o wymaganie <s>autentykacji</s> uwierzytelniania  użytkowników, kompletnie nie zajmując się kwestiami autoryzacji dostępu do zasobów (wszyscy zalogowani użytkownicy mają dostęp):</p>
<p><strong>1</strong>. Instalujemy wtyczkę</p>
<p><strong>grails install-plugin jsecurity</strong></p>
<p><strong>2</strong>. Tworzymy klasę dziedzinową użytkownika:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> User <span style="color: #66cc66;">&#123;</span>
    <span style="color: #aaaadd; font-weight: bold;">String</span> username
    <span style="color: #aaaadd; font-weight: bold;">String</span> password
&nbsp;
    <span style="color: #000000; font-weight: bold;">static</span> mapping <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        table <span style="color: #ff0000;">&quot;users&quot;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #aaaadd; font-weight: bold;">String</span> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        username
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Używam tutaj <a href="http://www.grails.org/GORM+-+Mapping+DSL">mapowania</a> na inną niż domyślna nazwę tabeli (domyślnie byłaby &#8222;user&#8221;, a ja dałem &#8222;users&#8221;) &#8211; taką kiedyś mi wpojono konwencję, by tabele miały nazwy w liczbie mnogiej. Z kolei metoda <strong>toString() </strong>przyda się nam nieco później.</p>
<p>Sama tabelka nie wystarczy, trzeba jeszcze użytkownika zapisać w bazie. Możemy to zrobić używając poniższego fragmentu kodu:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #66cc66;">&#40;</span>username: <span style="color: #ff0000;">&quot;jasiu&quot;</span>, password: <span style="color: #000000; font-weight: bold;">new</span> Sha1Hash<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;sekret&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">toHex</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">save</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Jak widzisz, hasło jest kodowane za pomocą <a href="http://pl.wikipedia.org/wiki/SHA-1">algorytmu Sha1</a> (kodowanie to wspierane jest przez JSecurity), nie obędzie się więc bez:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> org.<span style="color: #006600;">jsecurity</span>.<span style="color: #006600;">crypto</span>.<span style="color: #006600;">hash</span>.<span style="color: #006600;">Sha1Hash</span></pre></div></div>

<p><strong>3</strong>.  Dodajemy do katalogu <strong>grails-app/conf/</strong> pliczek <strong>SecurityFilters.groovy</strong> o zawartości:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> SecurityFilters <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> filters <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        auth<span style="color: #66cc66;">&#40;</span>controller: <span style="color: #ff0000;">&quot;*&quot;</span>, action: <span style="color: #ff0000;">&quot;*&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            before <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
                accessControl <span style="color: #66cc66;">&#123;</span> <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Ten filtr spowoduje, że wszystkie żądania (gwiazdki oznaczają dowolny kontroler, i dowolną akcję) zostaną poddane działaniu naszego filtra, a ten, przed wykonaniem żądania, wymusi na nim sprawdzenie praw dostępu.</p>
<p><strong>4</strong>. W katalogu <strong>realms/</strong> tworzymy klasę <strong>MyDbRealm</strong>,  o postaci:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.authc.AccountException</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.authc.IncorrectCredentialsException</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.authc.UnknownAccountException</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.authc.SimpleAccount</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> MyDbRealm <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">static</span> authTokenClass <span style="color: #66cc66;">=</span> org.<span style="color: #006600;">jsecurity</span>.<span style="color: #006600;">authc</span>.<span style="color: #006600;">UsernamePasswordToken</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> authenticate<span style="color: #66cc66;">&#40;</span>authToken<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">def</span> username <span style="color: #66cc66;">=</span> authToken.<span style="color: #006600;">username</span><span style="color: #66cc66;">;</span>
        <span style="color: #000000; font-weight: bold;">def</span> user <span style="color: #66cc66;">=</span> User.<span style="color: #006600;">findByUsername</span><span style="color: #66cc66;">&#40;</span>username<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span>user<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> UnknownAccountException<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Użytkownik ${username} nie istnieje w bazie danych&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">def</span> account <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SimpleAccount<span style="color: #66cc66;">&#40;</span>username, user.<span style="color: #006600;">password</span>, <span style="color: #ff0000;">&quot;MyDbRealm&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span>credentialMatcher.<span style="color: #006600;">doCredentialsMatch</span><span style="color: #66cc66;">&#40;</span>authToken, account<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            log.<span style="color: #006600;">info</span> <span style="color: #ff0000;">'Nieprawidłowe hasło dla użytkownika ${user.username}'</span>
            <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> IncorrectCredentialsException<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Nieprawidłowe hasło dla użytkownika ${user.username}&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">return</span> user<span style="color: #66cc66;">;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>5</strong>. Tworzymy kontroler naszego mechanizmu uwierzytelniania <strong>AuthController</strong> (zapisujemy go oczywiście w katalogu <strong>controllers/</strong> naszej aplikacji):</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.authc.AuthenticationException</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.authc.UsernamePasswordToken</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #a1a100;">org.jsecurity.SecurityUtils</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> AuthController <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">def</span> jsecSecurityManager
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> index <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> redirect<span style="color: #66cc66;">&#40;</span>action: <span style="color: #ff0000;">'login'</span>, params: params<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> login <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #66cc66;">&#91;</span> username: params.<span style="color: #006600;">username</span>, targetUri: params.<span style="color: #006600;">targetUri</span> <span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> signIn <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">def</span> authToken <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> UsernamePasswordToken<span style="color: #66cc66;">&#40;</span>params.<span style="color: #006600;">username</span>, params.<span style="color: #006600;">password</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">try</span><span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">jsecSecurityManager</span>.<span style="color: #006600;">login</span><span style="color: #66cc66;">&#40;</span>authToken<span style="color: #66cc66;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">def</span> targetUri <span style="color: #66cc66;">=</span> params.<span style="color: #006600;">targetUri</span> <span style="color: #66cc66;">?</span>: <span style="color: #ff0000;">&quot;/&quot;</span>
            redirect<span style="color: #66cc66;">&#40;</span>uri: targetUri<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">AuthenticationException</span> ex<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
            log.<span style="color: #006600;">info</span> <span style="color: #ff0000;">&quot;Błąd logowania użytkownika: '${params.username}'.&quot;</span>
            flash.<span style="color: #006600;">message</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Logowanie nieudane&quot;</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">def</span> m <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span> username: params.<span style="color: #006600;">username</span> <span style="color: #66cc66;">&#93;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>params.<span style="color: #006600;">targetUri</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                m<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'targetUri'</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> params.<span style="color: #006600;">targetUri</span>
            <span style="color: #66cc66;">&#125;</span>
&nbsp;
            redirect<span style="color: #66cc66;">&#40;</span>action: <span style="color: #ff0000;">'login'</span>, params: m<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">def</span> signOut <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span>
        SecurityUtils.<span style="color: #006600;">subject</span><span style="color: #66cc66;">?</span>.<span style="color: #006600;">logout</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
        redirect<span style="color: #66cc66;">&#40;</span>uri: <span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p><strong>6</strong>. Tworzymy okienko logowania (<strong>views/auth/login.gs</strong>p):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">http-equiv</span>=<span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;meta</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;layout&quot;</span> <span style="color: #000066;">content</span>=<span style="color: #ff0000;">&quot;main&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Login<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;g:if</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;${flash.message}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;message&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>${flash.message}<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/g:if<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;g:form</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;signIn&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;hidden&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;targetUri&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${targetUri}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;table<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tbody<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Username:<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;username&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;${username}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Password:<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;password&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;password&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;td<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;input</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;Zaloguj&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/td<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tr<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tbody<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/table<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/g:form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><strong>7</strong>. Modyfikujemy nasz główny <i>layout</i> tak, by pokazał czy i jako kto jesteśmy zalogowani:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsec:isLoggedIn<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Witaj <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsec:principal</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>! (<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;g:link</span> <span style="color: #000066;">controller</span>=<span style="color: #ff0000;">&quot;auth&quot;</span> <span style="color: #000066;">action</span>=<span style="color: #ff0000;">&quot;signOut&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Wyloguj<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/g:link<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/div<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jsec:isLoggedIn<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>I tu właśnie przydała nam się metoda <strong>toString()</strong> klasy <strong>User</strong>, albowiem znacznik <strong>jsec:principial</strong> zwróci nam właśnie wartość obiektu, który przedstawia zalogowanego aktualnie użytkownika (to, co zwróciła metoda <strong>authenticate()</strong> klasy <strong>MyDbRealm</strong>), a ten reprezentowany jest właśnie przez <strong>toString()</strong>.<br />
Tag <strong>jsec:isLoggedIn</strong> wraz z zawartością umieszczamy np. nad użyciem znacznika  <strong>g:layoutBody</strong>. Dla chcących potestować inne tagi dostarczane przez wtyczkę polecam <a href="http://www.grails.org/JSecurity+Plugin+-+Quick+Start#GSP%20tags">lekturę ich listy</a>.</p>
<p>Gotowe, aplikacja zabezpieczona, a my możemy spać spokojnie :)</p>
<p>I na koniec, dwa linki, jako uzupełnienie tematu zabezpieczania aplikacji Grails z JSecurity: </p>
<ul>
<li><a href="http://tramuntanal.wikidot.com/jsecurityplugin">http://tramuntanal.wikidot.com/jsecurityplugin</a></li>
<li><a href="http://asrijaffar.blogspot.com/2008/08/grails-jsecurity-plugin.html">http://asrijaffar.blogspot.com/2008/08/grails-jsecurity-plugin.html</a></li>
<ul>
]]></content:encoded>
			<wfw:commentRss>http://xis.schowek.net/2009/03/15/proste-uwierzytelnianie-w-grails-z-jsecurity/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

