Tapestwitter powered byTapestry 5.1, développé par Laurent Guérin et moi (Katia Aresti), à l'aide de la couche Unitils de Loïc Doin ... et maintenant connu et même recommandé par les créateurs de Wooki !!!
Merci Robin Komiwes et Christophe Cordenier pour cet article!
Affichage des articles dont le libellé est java. Afficher tous les articles
Affichage des articles dont le libellé est java. Afficher tous les articles
jeudi 15 juillet 2010
mardi 13 juillet 2010
Adam Bien - Lightweight Killer Applications
Il y a une semaine, j'ai participé à la conférence de Paris JUG avec Adam Bien et les LigthWeight Killer Applications avec JEE6. Adam Bien a été simplement superbe !
Voici les liens à mes articles chez JDuchess avec le retours de la soirée :
Les architectures opposées "Piloté par le domaine" et "piloté par le service".
Architecture JEE 6 Théorie : Les deux approches
La présentation pratique JEE 6 et les EJBs 3.x :
EJB 3.x et Adam Bien in action
Merci Adam pour tout !!!
Merci Etienne Seiter et Claude Falguière pour vos relectures, conseils sur le contenu et sur la mise en forme.
Voici les liens à mes articles chez JDuchess avec le retours de la soirée :
Les architectures opposées "Piloté par le domaine" et "piloté par le service".
Architecture JEE 6 Théorie : Les deux approches
La présentation pratique JEE 6 et les EJBs 3.x :
EJB 3.x et Adam Bien in action
Merci Adam pour tout !!!
Merci Etienne Seiter et Claude Falguière pour vos relectures, conseils sur le contenu et sur la mise en forme.
mardi 6 juillet 2010
Création du groupe de travail SCJP
Je viens de publier mon deuxième post sur le blog JDuchess. Celui-ci annonce la création d'un groupe de travail pour obtenir le SCJP (non, ce n'est pas un nouvel "user group")
SCJP ??
Si vous êtes programmeurs (euses) Java vous êtes forcement intéressé(e)s !
Plus d'information ...
Merci Laurent Guérin et Ellène Dijoux pour vos relectures, corrections et conseils sur la mise en forme.
SCJP ??
Si vous êtes programmeurs (euses) Java vous êtes forcement intéressé(e)s !
Plus d'information ...
Merci Laurent Guérin et Ellène Dijoux pour vos relectures, corrections et conseils sur la mise en forme.
mardi 15 juin 2010
Tapestry 5.1 et Spring Security
Voici comment marche la configuration de Spring Security avec Tapestry 5.1.
Cas d'utilisation :
- L'autorisation par formulaire (par la validation utilisateur / mot de passe)
- Mode connecté / anonyme
- Accès interdit sur les pages d'administration
Il nous faut avoir quatre pages Tapestry :
Configuration "web.xml"
Pour habiliter Spring et Spring Security, il faut d'abord configurer le fichier web.xml pour y placer les filtres. Tapestry, contrairement à Struts, est une framework configuré par un filtre; il faut faire attention donc à l'ordre sur le fichier ; le filtre de spring security doit se trouver en premier lieu.
<context-param>
<param-name>tapestry.app-package</param-name>
<param-value>com.tapestwitter</param-value>
</context-param>
<context-param>
<param-name>tapestry.use-external-spring-context</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter>
<filter-name>tapesTwitter</filter-name>
<filter-class>
org.apache.tapestry5.spring.TapestrySpringFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>tapesTwitter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Configuration du fichier "applicationContextSecurity.xml "
La version 3 de Spring permet de décharger la configuration XML en utilisant le "security namespace".
Contenu du fichier de configuration de spring security
contenu du fichier de beans de spring
Security.properties
Dans le module tapestry de l'application, dans le code source d'exemple fourni par la classe TapesTwitterModule.java, on peut contribuer aux symbols de l'IoC pour permettre d'injecter les valeurs du fichier security.properties à l'aide de l'annotation @Symbol.
Contenu Login.java
Contenu Login.tml
<form action="${loginUrl}" method="post">
<t:if test="error">
<p>
${message:login.error}
</p>
</t:if>
<fieldset>
<label for="j_username">${message:label-username}</label>
<input class="username" id="j_username" name="j_username" type="text" maxlength="30" value=""/><
<label for="j_password">${message:label-password}</label>
<input class="password" id="j_password" name="j_password" type="password" maxlength="30" value="" />
<input type="checkbox" name="j_spring_security_remember_me" id="remember_me"/>
<label class="inline" for="remember_me">${message:text-rememberme}</label></td>
<input id="login_submit" class="btn" type="submit" value="${message:button-login}" name="commit"/></td>
</fieldset>
</form>
Comment cela fonctionne ?
Lorsque l'utilisateur clique sur le bouton du login, Tapestry appellera l'URL "j_spring_security_check".
Spring prend la main sur l'application.
Spring security appelle le "Spring Security Filter Chain" - la chaine de filtres de connexion.
Grâce aux beans que l'on a développés (l'interface UserDetails, UserManagerImpl, UserDetailsServiceImpl etc.), Spring est capable de connecter l'utilisateur.
Si la connexion se déroule correctement, Spring Security redirigera vers l'url "/login" qui activera la page "Login". Ensuite Tapestry reprend la main!
L'événement "ACTIVATE" est lancé par Tapestry et capturé par la méthode "checkSecurityCtx".
Celle-ci vérifie la bonne connexion avec le bean "securityContext" pour ensuite rediriger vers la page "Home".
Si la connexion échoue, Spring Security redirigera vers l'url "/login/error" qui activera aussi la page de Login du Tapestry ! Mais un peu différemment : elle est activée avec "un paramétre" dans le contexte : "error". Dans l'URL, Tapestry détectera que la partie "login" est la page et "error" est la valeur d'un paramètre du contexte d'activation de la page.
Ainsi, la méthode qui est exécutée est "checkError(String extra)", extra = "error", pour ensuite rediriger vers la page de Login (return null affiche la page courante, la page de login) et afficher le message d'erreur attendu.
Pour plus d'information sur la partie Spring Security
Télécharger le code source depuis : tapestwitter 2.0
Cas d'utilisation :
- L'autorisation par formulaire (par la validation utilisateur / mot de passe)
- Mode connecté / anonyme
- Accès interdit sur les pages d'administration
Il nous faut avoir quatre pages Tapestry :
- page d'accueil aux utilisateurs non connectés - Index.tml + Index.java
- page d'accueil aux utilisateurs connectés - Home.tml + Home.java
- page de connexion au site - Login.tml + Login.java
- page pour les administrateurs - Admin.tml + Admin.java
Configuration "web.xml"
Pour habiliter Spring et Spring Security, il faut d'abord configurer le fichier web.xml pour y placer les filtres. Tapestry, contrairement à Struts, est une framework configuré par un filtre; il faut faire attention donc à l'ordre sur le fichier ; le filtre de spring security doit se trouver en premier lieu.
<context-param>
<param-name>tapestry.app-package</param-name>
<param-value>com.tapestwitter</param-value>
</context-param>
<context-param>
<param-name>tapestry.use-external-spring-context</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter>
<filter-name>tapesTwitter</filter-name>
<filter-class>
org.apache.tapestry5.spring.TapestrySpringFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>tapesTwitter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Configuration du fichier "applicationContextSecurity.xml "
La version 3 de Spring permet de décharger la configuration XML en utilisant le "security namespace".
Contenu du fichier de configuration de spring security
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')"/>
<intercept-url pattern="/index*" access="permitAll" />
<intercept-url pattern="/login*" access="permitAll" />
<intercept-url pattern="/login/error*" access="permitAll" />
<intercept-url pattern="/assets/**" access="permitAll"/>
<intercept-url pattern="/home**"
access="isAuthenticated() or isRememberMe()" />
<intercept-url pattern="/**" access="permitAll"/>
<form-login login-page="${loginFormUrl}"
authentication-failure-url="${authenticationFailureUrl}"
default-target-url="${defaultTargetUrl}"
always-use-default-target="false"/>
<anonymous />
<remember-me key="tapestwitter"/>
<logout />
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="tapestwitterAuthenticationProvider"/>
</authentication-manager>
contenu du fichier de beans de spring
<bean id="tapestwitterPasswordEncoder"
class="org.springframework.security.authentication.encoding.ShaPasswordEncoder" />
<bean id="tapestwitterSaltSource"
class="org.springframework.security.authentication.dao.SystemWideSaltSource">
<property name="systemWideSalt" value="tapestwitttertwit" />
</bean>
<bean id="tapestwitterSecurityContext"
class="com.tapestwitter.domain.security.impl.TapestwitterSecurityContextImpl"/>
<bean id="userManager" class="com.tapestwitter.domain.business.impl.UserManagerImpl">
<property name="securityContext" ref="tapestwitterSecurityContext" />
<property name="saltSource" ref="tapestwitterSaltSource"/>
<property name="passwordEncoder" ref="tapestwitterPasswordEncoder"/>
</bean>
<bean id="tapestwitterUserDetailService"
class="com.tapestwitter.domain.security.impl.UserDetailsServiceImpl">
<constructor-arg ref="userManager" />
</bean>
<bean id="tapestwitterAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="tapestwitterUserDetailService"/>
<property name="saltSource" ref="tapestwitterSaltSource"/>
<property name="passwordEncoder" ref="tapestwitterPasswordEncoder"/>
</bean>
Security.properties
loginSecurityFilterUrl=/j_spring_security_checkCharger les propriétés de Spring Security sur Tapestry
logoutSecurityFilterUrl=/j_spring_security_logout
loginFormUrl=/login
logoutTargetUrl=/index
defaultTargetUrl=/homepage
authenticationFailureUrl=/login/error
Dans le module tapestry de l'application, dans le code source d'exemple fourni par la classe TapesTwitterModule.java, on peut contribuer aux symbols de l'IoC pour permettre d'injecter les valeurs du fichier security.properties à l'aide de l'annotation @Symbol.
Page Login
public static void contributeSymbolSource(OrderedConfiguration<SymbolProvider> providers)
{
providers.add("springSecurity",
new ClasspathResourceSymbolProvider("config/security.properties"));
}
Contenu Login.java
public class Login
{
@Inject
@Symbol("loginSecurityFilterUrl")
private String loginUrl;
@Inject
private TapestwitterSecurityContext securityContext;
private boolean error;
@OnEvent(value = EventConstants.ACTIVATE)
public Object checkSecurityCtx()
{
if (securityContext.isLoggedIn())
{
return HomePage.class;
}
return null;
}
@OnEvent(value = EventConstants.ACTIVATE)
public void checkError(String extra)
{
if (extra.equals("error"))
{
error = true;
}
}
public String getLoginUrl()
{
return loginUrl;
}
public boolean isError()
{
return error;
}
}
Contenu Login.tml
<form action="${loginUrl}" method="post">
<t:if test="error">
<p>
${message:login.error}
</p>
</t:if>
<fieldset>
<label for="j_username">${message:label-username}</label>
<input class="username" id="j_username" name="j_username" type="text" maxlength="30" value=""/><
<label for="j_password">${message:label-password}</label>
<input class="password" id="j_password" name="j_password" type="password" maxlength="30" value="" />
<input type="checkbox" name="j_spring_security_remember_me" id="remember_me"/>
<label class="inline" for="remember_me">${message:text-rememberme}</label></td>
<input id="login_submit" class="btn" type="submit" value="${message:button-login}" name="commit"/></td>
</fieldset>
</form>
Comment cela fonctionne ?
Lorsque l'utilisateur clique sur le bouton du login, Tapestry appellera l'URL "j_spring_security_check".
Spring prend la main sur l'application.
Spring security appelle le "Spring Security Filter Chain" - la chaine de filtres de connexion.
Grâce aux beans que l'on a développés (l'interface UserDetails, UserManagerImpl, UserDetailsServiceImpl etc.), Spring est capable de connecter l'utilisateur.
Si la connexion se déroule correctement, Spring Security redirigera vers l'url "/login" qui activera la page "Login". Ensuite Tapestry reprend la main!
L'événement "ACTIVATE" est lancé par Tapestry et capturé par la méthode "checkSecurityCtx".
Celle-ci vérifie la bonne connexion avec le bean "securityContext" pour ensuite rediriger vers la page "Home".
Si la connexion échoue, Spring Security redirigera vers l'url "/login/error" qui activera aussi la page de Login du Tapestry ! Mais un peu différemment : elle est activée avec "un paramétre" dans le contexte : "error". Dans l'URL, Tapestry détectera que la partie "login" est la page et "error" est la valeur d'un paramètre du contexte d'activation de la page.
Ainsi, la méthode qui est exécutée est "checkError(String extra)", extra = "error", pour ensuite rediriger vers la page de Login (return null affiche la page courante, la page de login) et afficher le message d'erreur attendu.
Pour plus d'information sur la partie Spring Security
Télécharger le code source depuis : tapestwitter 2.0
Inscription à :
Articles (Atom)